Eureka服务发现与消费

一 介绍
构建一个服务消费者,它主要完成两个目标,发现服务以及消费服务。
发现服务任务由Eureka客户端完成,而服务消费任务由Ribbon完成。Ribbon是基于HTTP和TCP的客户端负载均衡器,它可以在客户端中配置ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。当Ribbon和Eureka联合使用时,Ribbon的服务清单实例ribbonServerList会被DiscoveryEnabledNIWSServerlist重写,扩展成从Eureka注册中心获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
二 实战
1 启动服务注册中eureka-server
2 编译以及启动hello-service
F:\springcloud\springcloud2\hello-service-api>mvn install
生成F:\springcloud\springcloud2\hello-service-api\target\hello-service-api-0.0.1-SNAPSHOT.jar
将hello-service-api-0.0.1-SNAPSHOT.jar拷贝到F:\springcloud\springcloud2\hello-service
F:\springcloud\springcloud2\hello-service>mvn install
生成F:\springcloud\springcloud2\hello-service\target\hello-service-0.0.1-SNAPSHOT.jar
启动hello-service的两个服务
F:\springcloud\springcloud2\hello-service\target>java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8081
F:\springcloud\springcloud2\hello-service\target>java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8082
3 成功启动两个hello-service服务之后,可以看到Eureka信息面板中可以看到hello-service服务中出现了两个实例单元。
4 创建一个spring boot的基础工程来实现服务消费者,取名为ribbon-consumer,并在pom.xml中引入如下的依赖内容。
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
    </dependencies>
5 创建应用主类ConsumerApplication,通过@EnableDiscoveryClient注解让该应用注册为客户端应用,以获得服务发现能力。同时,在该主类中创建RestTemplate的Spring Bean实例,并通过@LoadBalanced注解开启客户端负载均衡。    
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

}
6 创建ConsumerController类实现/ribbon-consumer接口,在该接口中,通过在上面创建的RestTemplate来实现对hello-service服务提供的/hello接口进行调用。可以看到这里访问的地址是服务名hello-service,而不是一个具体的地址,在服务治理框架中,这是一个非常重要的特性。
@RestController
public class ConsumerController {
    @Autowired
    RestTemplate restTemplate;
    @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
    public String helloConsumer() {
        return restTemplate.getForEntity("http://hello-service/hello",String.class).getBody();
    }
}
7 application.properties中配置Eureka服务注册中心的位置,同时设置消费者的端点为9000,不能与之前启动的应用端口冲突。
spring.application.name=ribbon-consumer
server.port=9000

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
8 启动rebbon-consumer应用后,再观察Eureka信息面板,可以看到
9 浏览器输入 http://localhost:9000/ribbon-consumer发起get请求,成功返回了“Hello World”
控制台输出如下:
2018-07-13 19:31:47.179  INFO 5572 --- [nio-9000-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client hello-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=hello-service,current list of Servers=[DESKTOP-5SDKDG4:8081, DESKTOP-5SDKDG4:8082],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;    Instance count:2;    Active connections count: 0;    Circuit breaker tripped count: 0;    Active connections per server: 0.0;]
},Server stats: [[Server:DESKTOP-5SDKDG4:8082;    Zone:defaultZone;    Total Requests:0;    Successive connection failure:0;    Total blackout seconds:0;    Last connection made:Thu Jan 01 08:00:00 CST 1970;    First connection made: Thu Jan 01 08:00:00 CST 1970;    Active Connections:0;    total failure count in last (1000) msecs:0;    average resp time:0.0;    90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;    max resp time:0.0;    stddev resp time:0.0]
, [Server:DESKTOP-5SDKDG4:8081;    Zone:defaultZone;    Total Requests:0;    Successive connection failure:0;    Total blackout seconds:0;    Last connection made:Thu Jan 01 08:00:00 CST 1970;    First connection made: Thu Jan 01 08:00:00 CST 1970;    Active Connections:0;    total failure count in last (1000) msecs:0;    average resp time:0.0;    90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;    max resp time:0.0;    stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@49a16e29
从输出中,可以看到Ribbon输出了当前客户端维护的hello-service的服务列表情况,其中包含了各个实例的位置,Ribbon就是按此信息进行轮询访问,以实现客户端的负载均衡。另外还输出了一些有用的信息,例如对各个实例的请求总数量、第一次连接信息,上一次连接信息,总的请求失败数量等。
10 再尝试发送几次请求,并观察启动的两个hello-world的控制台,可以看到两个控制台会交替打印下面日志,说明是否了负载均衡。
2018-07-13 19:39:10.908  INFO 4712 --- [nio-8081-exec-5] com.didispace.web.HelloController        : /hello, host:DESKTOP-5SDKDG4, service_id:hello-service

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/81036764