如何使用Ribbon实现服务负载均衡、结合Eureka、简单定义策略

上一篇文章Eureka自我保护机制、健康检查的作用、actuator模块监控 ,我们简单学习了服务健康监控的一些知识,这篇文章的主题是使用Ribbon实现服务负载均衡。
在学习之前,我们先弄清一个概念,什么叫负载均衡?负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
显然,度娘已经很完美的解答了这个问题,用大白话解释就是客户端在请求数据的时候,其实每次请求的服务器都不一定是相同的。
今天我们来使用Spring Clound Ribbon来实现服务的负载均衡。Ribbon 从属于Spring Cloud Netflix 项目。
我们仍然以上篇文章中的三个工程为例(Eureka-server,userreg,myweb),为了模拟多节点,我们先复制userreg工程,命名为userreg2,端口改为9002,其余一模一样。
我们在myweb工程pom文件中添加如下依赖

... org.springframework.cloud spring-cloud-starter-ribbon ...

接下来我们只需要在业务类中,作如下代码
@RestController public class Myweb { @Autowired DiscoveryClient discoveryClient; @Autowired LoadBalancerClient mLoadBalancerClient; @RequestMapping("/userreg") public Map userreg() { //List list = discoveryClient.getInstances("USERREG"); //String serviceUrl = list.get(0).getUri().toString(); /*robbinz负载均衡实现*/ ServiceInstance userreg = mLoadBalancerClient.choose("USERREG"); String serviceUrl = userreg.getUri().toString(); System.out.println(serviceUrl); RestTemplate restTemplate = new RestTemplate(); return restTemplate.getForObject(serviceUrl + "/reg", Map.class); } }

代码就是如此简洁!注入LoadBalancerClient实例,使用LoadBalancerClient实例中的choose方法,根据微服务名称来获取服务实例,在这个选择或者说获取服务实例的过程中,Robbon内部采用一定的规则来确定获取哪个服务实例(默认使用轮询index,选择index对应位置的server)。我们多调用几次http://localhost:9050/userreg接口,我们查看控制台
如何使用Ribbon实现服务负载均衡、结合Eureka、简单定义策略
文章图片
image.png 可以看到默认规则下是均衡负载的。
如果我们需要自定义规则要怎么做呢?
其实也很简单,我们可以先看下ribbon均衡策略有哪些?
策略名 策略描述 实现说明
BestAvailableRule 选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRule 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRule 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 一 个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择 server。
RetryRule 对选定的负载均衡策略机上重试机制。 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRule(默认) roundRobin方式轮询选择server 轮询index,选择index对应位置的server
RandomRule 随机选择一个server 在index上随机,选择index对应位置的server
ZoneAvoidanceRule 复合判断server所在区域的性能和server的可用性选择server 使 用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个 zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的 Server。
我们如果定义使用随机RandomRule,我们可以建立一个config类
@Configuration public class MyConfig { @Bean public IRule getRibbonRule() { return new RandomRule(); }}

别忘了在类上添加注解@Configuration哦。
好了我们现在重启一下服务,疯狂访问http://localhost:9050/userreg接口,我们看下控制台

如何使用Ribbon实现服务负载均衡、结合Eureka、简单定义策略
文章图片
image.png
我们发现ribbon已经帮我们切换了均衡策略,随机选择一个服务供调用。
预告我们后面一篇文章 使用Feign调用注册在Eureka中的远程服务(入门)
【如何使用Ribbon实现服务负载均衡、结合Eureka、简单定义策略】作者:
链接:https://www.jianshu.com/p/q81RER
來源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    推荐阅读