上一篇文章Eureka自我保护机制、健康检查的作用、actuator模块监控 ,我们简单学习了服务健康监控的一些知识,这篇文章的主题是使用Ribbon实现服务负载均衡。
在学习之前,我们先弄清一个概念,什么叫负载均衡?负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
显然,度娘已经很完美的解答了这个问题,用大白话解释就是客户端在请求数据的时候,其实每次请求的服务器都不一定是相同的。
今天我们来使用Spring Clound Ribbon来实现服务的负载均衡。Ribbon 从属于Spring Cloud Netflix 项目。
我们仍然以上篇文章中的三个工程为例(Eureka-server,userreg,myweb),为了模拟多节点,我们先复制userreg工程,命名为userreg2,端口改为9002,其余一模一样。
我们在myweb工程pom文件中添加如下依赖
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
...
接下来我们只需要在业务类中,作如下代码
@RestController
public class Myweb {
@Autowired
DiscoveryClient discoveryClient;
@Autowired
LoadBalancerClient mLoadBalancerClient;
@RequestMapping("/userreg")
public Map userreg() {
// List<ServiceInstance> 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均衡策略有哪些?
策略名 | 策略描述 | 实现说明 |
---|---|---|
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已经帮我们切换了均衡策略,随机选择一个服务供调用。
预告我们后面一篇文章使用Feign调用注册在Eureka中的远程服务(入门)
作者:简书
链接:https://www.jianshu.com/p/q81RER
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。