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服务会轮 流被调用。