2.1.2 Ribbon测试 Spring Cloud引入Ribbon配合 restTemplate 实现客户端负载均衡。Java中远程调用的技术有很多,如: webservice、socket、rmi、Apache HttpClient、OkHttp等,互联网项目使用基于http的客户端较多,本项目使 用OkHttp。
1、在客户端添加Ribbon依赖: 这里在课程管理服务配置ribbon依赖

[mw_shl_code=applescript,true]<dependency>  
   <groupId>org.springframework.cloud</groupId>   
  <artifactId>spring‐cloud‐starter‐ribbon</artifactId> </dependency> <dependency>  
   <groupId>com.squareup.okhttp3</groupId>  
   <artifactId>okhttp</artifactId> </dependency>[/mw_shl_code]
由于依赖了spring-cloud-starter-eureka,会自动添加spring-cloud-starter-ribbon依赖

2、配置Ribbon参数 这里在课程管理服务的application.yml中配置ribbon参数

[mw_shl_code=applescript,true]ribbon: MaxAutoRetries: 2 #最大重试次数,当Eureka中可以找到服务,但是服务连不上时将会重试 MaxAutoRetriesNextServer: 3 #切换实例的重试次数
OkToRetryOnAllOperations: false #对所有操作请求都进行重试,如果是get则可以,如果是post,put等操作 没有实现幂等的情况下是很危险的,所以设置为false
ConnectTimeout: 5000 #请求连接的超时时间 ReadTimeout: 6000 #请求处理的超时时间 [/mw_shl_code] 3、负载均衡测试 1)启动两个cms服务,注意端口要不一致 启动完成观察Eureka Server的服务列表

2)定义RestTemplate,使用@LoadBalanced注解 在课程管理服务的启动类中定义RestTemplate


[mw_shl_code=applescript,true] 
ribbon:   MaxAutoRetries: 2 #最大重试次数,当Eureka中可以找到服务,但是服务连不上时将会重试 
  MaxAutoRetriesNextServer: 3 #切换实例的重试次数 
  OkToRetryOnAllOperations: false  #对所有操作请求都进行重试,如果是get则可以,如果是post,put等操作 没有实现幂等的情况下是很危险的,所以设置为false
   ConnectTimeout: 5000  #请求连接的超时时间   ReadTimeout: 6000 #请求处理的超时时间    
@Bean @LoadBalanced public RestTemplate restTemplate() {   
  return new RestTemplate(new OkHttp3ClientHttpRequestFactory()); } [/mw_shl_code]

3)测试代码 在课程管理服务工程创建单元测试代码,远程调用cms的查询页面接口:

[mw_shl_code=applescript,true] //负载均衡调用  
   @Test   
  public void testRibbon() {      
   //服务id     
    String serviceId = "XC‐SERVICE‐MANAGE‐CMS";   
      for(int i=0;i<10;i++){      
       //通过服务id调用    
         ResponseEntity<CmsPage> forEntity = restTemplate.getForEntity("http://" + serviceId  + "/cms/page/get/5a754adf6abb500ad05688d9", CmsPage.class);             CmsPage cmsPage = forEntity.getBody();       
      System.out.println(cmsPage);       
  }   
  }[/mw_shl_code]

4)负载均衡测试 添加@LoadBalanced注解后,restTemplate会走LoadBalancerInterceptor拦截器,此拦截器中会通过 RibbonLoadBalancerClient查询服务地址,可以在此类打断点观察每次调用的服务地址和端口,两个cms服务会轮 流被调用。