1.声明
当前内容基于上面的一个demo进行负载均衡优化(说白了就是优化获取访问的url)
上一个demo为:eureka的多个服务相互调用的demo
由于上一个demo中出现了重复,需要通过DiscoveryClient获取当前的一个需要调用的服务实例ServiceInstance,然后拼接url实现访问操作(这个操作是重复的,基本每个访问中都存在这个问题)
所以这里就看看spring的负载均衡都干了什么,并且查看如何实现的,优化了哪些东西
2.pom配置和部分App门面访问的优化
为目前的AppDemo中的pom文件添加负载均衡优化
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
为当前的RestTemplate的@Bean上面添加@LoadBalanced注解
@Autowired
RestTemplate restTemplate;
@Bean
@LoadBalanced // 开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
重写前面的getPermiss
方法
@RequestMapping("getPermiss")
public String getPermiss(String roleName) {
System.out.println("访问App门面中通过角色名称获取用户权限");
/*
* List<ServiceInstance> instances = client.getInstances("permiss" +
* SUFIX_STRING); ServiceInstance serviceInstance = instances.get(0); String
* string = serviceInstance.getUri().toString();
*/
ResponseEntity<String> postForEntity = restTemplate.getForEntity("http://permiss" + SUFIX_STRING + "/getPermissByRoleName?roleName={1}",
String.class, roleName);
String body = postForEntity.getBody();
return body;
}
3.测试getPermiss
发现照样访问成功!
4.分析RestTemplate都做了什么
1.查看控制台
DynamicServerListLoadBalancer for client permiss-service-provider initialized: DynamicServerListLoadBalancer:
{NFLoadBalancer:name=permiss-service-provider,current list of Servers=[localhost:2003],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;] }
,Server stats:[[Server:localhost:2003; 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@6694da5d
发现当前的RestTemplate还是自动获取了当前的ServiceInstance集合(主要通过permiss-service-provider,就是服务名称),然后通过负载均衡算法选出一个调用的url,最后通过url方式进行调用
2.查看这个RestTemplate中具有什么东西
发现这个类中有一个拦截器链
发现这个拦截器链中具有负载均衡拦截器
3.查看该注解的描述@LoadBalanced
Annotation to mark a RestTemplate bean to be configured to use a
LoadBalancerClient
所以可以大胆的猜测,SpringCloud通过查看当前的@LoadBalanced方式为当前的RestTemplate的Bean注入LoadBalancerInterceptor拦截器,然后我们在调用的时候,通过这个拦截器进行分析操作,负载算法等一系列操作,最后找到需要调用的url,最后变成之前的操作,完成调用
5.总结
1.通过使用负载均衡后的RestTemplate,发现其优化了我们找到可以执行的url的地方,优化了我们大量的冗余代码
2.所谓的@LoadBalanced,其实就是为RestTemplate注入了一个负载均衡的拦截器,将所有操作进负载均衡操作(所以其他的也可以进行优化操作)
以上纯属个人见解,如有问题请联本人