RestTemplate添加@LoadBalanced注解利用SpringCloud的Ribbon实现自动化负载均衡
问题现象:
今天在学习微服务过程中,有提到一个问题:
如何简单的实现负载均衡呢?
问题分析:
通过处不学习,我了解了一些实现负载均衡的方法:
例如可以通过 注册注入DiscoveryClient 对象,调用 getInstances("服务名") 的方法来获取相同服务名的对象集合,再通过 get(index) 方法就可以根据index来选择被调用接口的服务对象了. 然后通过 new Random().nextInt(instances.size());就可以随机获取 [0~集合长度-1] 的index了,从而实现随机策略的负载均衡!
实现过程有一点繁琐,总感觉不够优化;于是我又了解到了另一种更简单快捷,优化的方法;
通过注册注入 RestTemplate对象 :
首先在注册的时候添加 @LoadBalanced 注解:
该注解可以利用springcloud继集成的 Ribbon工具 实现自动化负载均衡.
Ribbon有7种主要的负载均衡策略:
/* 1.RandomRule: 随机选择一个server。 [在index上随机,选择index对应位置的server] 2.BestAvailableRule: 选择一个最小的并发请求的server。 [逐个考察Server,如果Server被tripped了,就忽略,再选择其中ActiveRequestsCount最小的server] 3.AvailabilityFilteringRule: 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server, 并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值)。 [使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态] 4.WeightedResponseTimeRule: 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 [一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。 Weight的计算也比较简单:responsetime减去每个server自己平均的responsetime是server的权重。 当刚开始运行,没有形成statas时,使用roubine策略选择server。] 5.RetryRule: 对选定的负载均衡策略机上重试机制。 [在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server] 6.RoundRobinRule: 轮询方式轮询选择server。 [轮询index,选择index对应位置的server] 7.ZoneAvoidanceRule: 复合判断server所在区域的性能和server的可用性选择server [使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server, 前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server), AvailabilityPredicate用于过滤掉连接数过多的Server。] */
配置这些策略的方式有很多种,比如在配置文件中配置.
解决方法:
配置文件中配置Ribbon的负载均衡策略:
随机策略成功: