zoukankan      html  css  js  c++  java
  • springcloud(三)-Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。

     服务发现简介

    服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

    有了服务中心调用关系会有什么变化?

    上一节我们见识了springcloud最简单的微服务调用。类似于

    项目A调用项目B

    正常调用项目A请求项目B

    有了服务发现Eureka机制,任何一个服务都不能直接去掉用,都需要通过服务中心来调用


    如果是项目A调用项目B,项目B在调用项目C

    这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。

    这样做有什么好处呢?如果只有这样一两个服务,而且访问量不大的情况下,这样做确实有点画蛇添足的感觉。但是,如果像这样的服务由二三十个,上百个呢?画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

    由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。

    Eureka 简介

    Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

    用一张图来认识以下:

    上图简要描述了Eureka的基本架构,由3个角色组成:

    1、Eureka Server

    • 提供服务注册和发现

    2、Service Provider

    • 服务提供方
    • 将自身服务注册到Eureka,从而使服务消费方能够找到

    3、Service Consumer

    • 服务消费方
    • 从Eureka获取注册服务列表,从而能够消费服务

    编写Eureka Server

    spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。

    1.创建一个maven工程,pom.xml文件添加依赖

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     3   <modelVersion>4.0.0</modelVersion>
     4 
     5   <groupId>com.itmuch.cloud</groupId>
     6   <artifactId>microservice-discovery-eureka</artifactId>
     7   <version>0.0.1-SNAPSHOT</version>
     8   <packaging>jar</packaging>
     9 
    10   <name>microservice-discovery-eureka</name>
    11   <url>http://maven.apache.org</url>
    12 
    13   <parent>
    14         <groupId>org.springframework.boot</groupId>
    15         <artifactId>spring-boot-starter-parent</artifactId>
    16         <version>1.5.9.RELEASE</version>
    17     </parent>
    18 
    19   <properties>
    20     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    21     <java.version>1.8</java.version>
    22   </properties>
    23 
    24   <dependencies>
    25            <dependency>
    26             <groupId>org.springframework.boot</groupId>
    27             <artifactId>spring-boot-starter-web</artifactId>
    28         </dependency>
    29         <!--         用于监控spring boot 端点 -->
    30         <dependency>
    31             <groupId>org.springframework.boot</groupId>
    32             <artifactId>spring-boot-starter-actuator</artifactId>
    33         </dependency>
    34         <dependency>
    35             <groupId>org.springframework.boot</groupId>
    36             <artifactId>spring-boot-starter-tomcat</artifactId>
    37         </dependency>
    38         <dependency>
    39             <groupId>org.springframework.boot</groupId>
    40             <artifactId>spring-boot-devtools</artifactId>
    41             <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
    42         </dependency>
    43         <dependency>
    44             <groupId>org.springframework.cloud</groupId>
    45             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    46         </dependency>
    47   </dependencies>
    48   
    49 <!--   引入spring cloud 的依赖 -->
    50     <dependencyManagement>
    51         <dependencies>
    52             <dependency>
    53                 <groupId>org.springframework.cloud</groupId>
    54                 <artifactId>spring-cloud-dependencies</artifactId>
    55                 <version>Edgware.RELEASE</version>
    56                 <type>pom</type>
    57                 <scope>import</scope>
    58             </dependency>
    59         </dependencies>
    60     </dependencyManagement>
    61   
    62 <!--   添加spring-boot 的maven插件 -->
    63     <build>
    64         <plugins>
    65             <plugin>
    66                 <groupId>org.springframework.boot</groupId>
    67                 <artifactId>spring-boot-maven-plugin</artifactId>
    68             </plugin>
    69         </plugins>
    70     </build>
    71 </project>
    点击展开

    2.编写启动类,添加@EnableEurekaServer注解,声明这是一个Eureka Server

    package com.itmuch.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }

    3.配置文件application.yml

    server:
      port: 8083
    eureka:
      client:
        registerWithEureka: false
        fetchRegistry: false
        serviceUrl:
          defaultZone: http://localhost:8083/eureka

    简单介绍一下:

    • eureka.client.registerWithEureka:表示是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而这里设为false。
    • eureka.client.fetchRegistry:表示是否从Eureka Server获取注册信息。默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,所以设为false 
    • eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8083/eureka;多个地址间可使用“,”分隔。

    这样一个Eureka Server就编写完了。

    测试

    启动Eureka Server 启动类。访问 http://localhost:8083/,可以打开界面

    目前没有任务服务注册到上面。

    将微服务注册到Eureka Server上

    改写上一节的microservice-simple-provider-user

    1.pom.xml文件添加依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    2.配置application.yml

    server:
      port: 8084
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8083/eureka/
      instance:
        prefer-ip-address: true
    spring:
      application:
        name: microservice-provider-user
      jpa:
        generate-ddl: false
        show-sql: true
        database-platform: org.hibernate.dialect.MySQL5Dialect
        hibernate:
          ddl-auto: none
      datasource:
        url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: 1234
        driver-class-name: com.mysql.jdbc.Driver
      http:
        multipart:
          maxFileSize: 100Mb
          maxRequestSize: 100Mb
    logging:
      level:
        root: INFO
        org.hibernate: INFO
        org.hibernate.type.descriptor.sql.BasicBinder: TRACE
        org.hibernate.type.descriptor.sql.BasicExtractor: TRACE

    其中,spring.application.name用于指定注册到Eureka Server上的应用名称;eureka.instance.prefer-ip-address = true 表示将自己的IP注册到Eureka Server。若不配置该属性或将其设置为false,则表示注册微服务所在操作系统的hostname到Eureka Server 。

    另外,同样的操作,给microservice-consumer-movie也来一遍。

    测试

    启动 microservice-discovery-eureka

    启动 microservice-provider-user

    启动 microservice-consumer-movie

    注:因为每一个服务在启动的时候都会注册到服务发现上面去,如果eureka没开的话,服务在启动的时候会报找不到服务发现的错误,所以一般都是先开eureka。但是就算你后启动eureka,每一个服务客户端都会在eureka启动之后,再连到上面去,不会影响使用。

    访问http://localhost:8083/,可看到页面

    由此图可知,我们的两个微服务客户端已经被注册到Eureka Server 上了。

    我们访问http://localhost:8082/user/1,得到结果

    {"id":1,"username":"account1","name":"张三","age":20,"balance":98.23}

    由此可知,movie服务通过Eureka Server 找到 user 服务,访问获得了结果。

    OK!完美!

    这一节没多少新代码,该有的都再上面贴出来了。源码就不放了。

  • 相关阅读:
    静态导入
    OC中的Debug表达式
    友盟消息推送(一)
    Xcode7.0 更新完后,网络请求报错
    HTTP返回的状态码
    ios 通知监听App进入后台,然后再进入App(获取验证码的时间间隔)
    iOS保存model数据(自定义Model 可以存放到本地)
    tatableView 刷新
    iOS bounds和Frame的区别
    UIButton下面添加滑动的线
  • 原文地址:https://www.cnblogs.com/fengyuduke/p/10593791.html
Copyright © 2011-2022 走看看