zoukankan      html  css  js  c++  java
  • SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon

      通过上一章《SpringCloud开发学习总结(三)—— 服务治理Eureka》,我们已经搭建起微服务架构中的核心组件——服务注册中心(包括单点模式和高可用模式)。同时还注册了一个服务,命名为hello-service。现在我们已经有了服务注册中心和服务提供者,下面就来尝试构建一个服务消费者,它主要完成两个目标,发现服务以及消费服务。其中,服务发现的任务由Eureka的客户端完成,而服务消费的任务由Ribbon完成。Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。当Ribbon和Eureja联合使用时,Ribbon的服务实例清单RibbonServerList会被DiscoveryEnableNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。在本章中,我们对Ribbon不做详细的介绍,读者只需要理解它在Eureka服务发现的基础上,实现了一套对服务实例的选择策略,从而实现对服务的消费。后续会有对Ribbon的详细介绍和分析。

      下面我们通过构建一个简单的示例,看看在Eureka的服务治理体系下如何实现服务的发现与消费。

    • 首先,我们启动之前实现的服务注册中心eureka-server以及hello-service服务,为了实验Ribbon的客户端负载均衡功能,我们通过java -jar命令行的方式启动两个不同端口的hello-service,具体如下:
    java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8081
    java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8082
    • 在成功启动两个hello-service服务之后,如下图所示,从Eureka信息面板中可以看到名为HELLO-SERVICE的服务中出现了两个实例单元,分别是通过命令行启动的8081端口和8082端口的服务。

    • 较之前的hello-service,在pom.xml新增Ribbon模块的依赖spring-cloud-starter-ribbon。
    1         <dependency>
    2             <groupId>org.springframework.cloud</groupId>
    3             <artifactId>spring-cloud-starter-ribbon</artifactId>
    4         </dependency>
    • 创建应用主类ConsumerApplication,通过@EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获得服务发现的能力。同时,在该主类中创建RestTemplate

    的Spring Bean实例,并通过@LoadBalanced注解开启客户端负载均衡。

     1 @EnableDiscoveryClient
     2 @SpringBootApplication
     3 public class consumeApplication {
     4 
     5     @Bean
     6     @LoadBalanced
     7     RestTemplate restTemplate() {
     8         return new RestTemplate();
     9     }
    10     public static void main(String[] args) {
    11         SpringApplication.run(consumeApplication.class, args);
    12     }
    13 }
    • 创建ConsumerController类并实现/ribbon-consumer接口。在该接口中,通过在上面创建的RestTemplate来实现对HELLO-SERVICE服务提供的/hello接口进行调用。可以看到这里访问的地址是服务名HELLO-SERVICE,而不是一个具体的地址,在服务治理框架中,这是一个非常重要的特性,也符合在本章一开始对服务治理的解释。
     1 @RestController
     2 public class ConsumeController {
     3     
     4     @Autowired
     5     RestTemplate restTemplate;
     6     
     7     @RequestMapping(value="/ribbon-consumer",method=RequestMethod.GET)
     8     public String helloConsumer(){
     9         return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
    10     }
    11     
    12 }
    • 在application.properties中配置Eureka服务注册中心的位置,需要与之前的HELLO-SERVICE一样,不然是发现不了该服务的,同时设置该消费者的端口为8091,不能与之前启动的应用端口冲突。
    server.port = 8091
    
    spring.application.name=hello-service2
    eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
    • 启动ribbon-consumer应用后,我们可以在Eureka信息面板中看到,当前除了HELLO-SERVICE之外,还多了我们实现的RIBBON-CONSUMER服务

    • 最后向http://localhost:8091/ribbon-consumer发起GET请求,成功返回

    至此,SpringCloud+Ribbon搭建成功!


    注释一:SpringBoot启动的三种方式

    1. idea或eclipse main方法启动
    2. cmd 在SpringBoot应用的根目录下运行 mvn spring-boot:run
    3. cmd 在项目的根目录 mvc install,然后 cd target 运行生成的jar包  java -jar xxx.jar
  • 相关阅读:
    C++内存泄露的有效预防方法:谁使用,谁删除 (1.2)
    工作日志2014-08-28
    【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
    关于ActionContext.getContext()的使用方法心得
    Android开发(20)--RadioGroup的使用
    站点防止攻击
    小强的HTML5移动开发之路(50)——jquerymobile页面初始化过程
    我是怎样成长为系统架构师的
    辛星站点架构师笔记第四篇
    strcpy_s与strcpy的比較
  • 原文地址:https://www.cnblogs.com/king-brook/p/9510935.html
Copyright © 2011-2022 走看看