在上两篇文章中,咱们已经搭建起微服务架构中的核心组件 服务注册 中心(包括单节点模式和高可用模式)。同时, 还对上一章中实现的Spring Boot入门程序 作了改造。 经过简单的配置,使该程序注册到Emeka注册中心上,成为该服务治理体系下 的一个服务,命名为hello-service。 如今咱们已经有了服务注册中心和服务提供者, 下面就来尝试构建一个服务消费者,它主要完成两个目标,发现服务以及消费服务。其中, 服务发现的任务由Eureka的客户端完成,而服务消费的任务由ribbon完成。Ribbon是一个基 千HTTP和TCP的客户端负载均衡器,它能够在经过客户端中配置的 ribbonServerList 服务端列表去轮询访问以达到均衡负载的做用。 当Ribbon与Eureka联合使用时,ribbon 的服务实例清单ribbonServerList会被DiscoveryEnabledNIWSServerList重写, 扩展成从Eureka注册中心中获取服务端列表。 同时它也会用 NIWSDiscoveryPing 来取代IPing, 它将职责委托给Eureka来肯定服务端是否已经启动。 java
下面咱们经过构建一个简单的示例,看看在Eureka的服务治理体系下如何实现服务的 发现与消费。web
• 首先,咱们作一些准备工做 。启动以前实现的服务注册中心 eureka-server以及 hello-service服务,为了实验ribbon的客户端负载均衡功能, 咱们经过 java -jar命令行的方式来启动两个不一样端口的hello-service, 具体以下: spring
java -jar Eureka-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar Eureka-0.0.1-SNAPSHOT.jar --server.port=8082
• 在成功启动两个hello-service服务以后, 以下图所示,从Eureka信息面板中 能够看到名为HELLO-SERVICE的服务中出现了两个实例单元,分别是经过命令行 启动的8081端口和8082端口的服务。 架构
• 建立一个 Spring Boot 的基础工程来实现服务消费者, 取名为 ribbon-consumer, 并在 pom.xml 中引入以下的依赖内容。 较以前的 hello-service, 咱们新增了 Ribbon 模块的依赖spring-cloud-starter-ribbon。 app
pom.xml负载均衡
• 建立应用主类ConsumerApplication, 经过@EnableDiscoveryClient注解 让该应用注册为 Eureka客户端应用, 以得到服务发现的能力。 同时, 在该主类中创 建RestTemplate的 Spring Bean 实例,并经过@LoadBalanced 注解开启客户端 负载均衡。框架
• 建立ConsumerController类并实现/ribbon-consumer接口。 在该接口中, 经过在上面建立的RestTemplate 来实现对 HELLO-SERVICE服务提供的 /hello接口进行调用。 能够看到这里访问的地址是服务名HELLO-SERVICE,而 不是一个具体的地址,在服务治理框架中, 这是一个很是重要的性特。 微服务
• 在application.properties中配置Eureka服务注册中心的位置, 须要与以前 HELLO-SEVRCIE 同样, 否则是发现不了该 服务的,同时设置该消费者的端口为 9000, 不能与以前启动的应用端口冲突。 spa
• 启动ribbon-consumer 应用后, 咱们能够在 Eureka 信息面板中看到, 当前除了 HELLO-SERVICE 以外, 还多了咱们实现的RIBBON-CONSUMER服务。 命令行
• 经过向 http://localhost:9000/ribbon-consumer 发起 GET 请求, 成功返 回了 "Hello World"。 此时, 咱们能够在 ribbon-consumer 应用的控制台中看到 以下信息, Ribbon 输出了当前客户端维护的 HELLO-SERVICE 的服务列表状况。其 中包含了各个实例的位置, ribbon 就是按照此信息进行轮询访问, 以实现基千客户 端的负载均衡。 另外还输出了一些其余很是有用的信息, 如对各个实例的请求总数 量、 第一次链接信息、 上一次链接信息、 总的请求失败数量等。
再尝试发送几回请求, 并观察启动的两个 HELLO-SERVICE 的控制台, 能够看到两个控 制台会交替打印下面的日志, 这是咱们以前在 HelloController 中实现的对服务信息的输 出, 能够用来判断当前豆bbon-consumer 对HELLO-SERVICE 的调用是不是负载均衡的。
com.didispace.web.HelloController : /hello , host:PC-201807022055
service id:hello-service