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。]
 */

配置这些策略的方式有很多种,比如在配置文件中配置.

扫描二维码关注公众号,回复: 12542281 查看本文章

解决方法:

配置文件中配置Ribbon的负载均衡策略:

随机策略成功:

猜你喜欢

转载自blog.csdn.net/weixin_42585386/article/details/109215343
今日推荐