Ribbon简介
Ribbon是Netflix发布的负载均衡器,它有助于控制Http和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮训,随机等等。当然也可以为Ribbon实现自定义的负载均衡算法。
Spring Cloud中的Ribbon是什么
通常所说的负载均衡是指将一个请求均匀地分配到不同的节点单元上执行,负载均和分为硬件负载均衡和软件负载均衡:
硬件负载均衡
比如F5、深信服、Array等
软件负载均衡
比如Nginx,LVS,HAProxy等
Spring Cloud对Ribbon做了二次封装,可以让我们使用RestTemplate的服务请求,自动转换成客户端负载均衡的服务调用。
Ribbon支持多种负载均衡算法,还支持自定义的负载均衡算法
Ribbon只是一个工具类框架,比较小巧,Spring Cloud对它封装后使用也非常方便,它不像服务注册中心,配置中心,API网关那样需要独立部署,Ribbon只需要在代码直接使用即可:
Ribbon与Nginx的区别
Ribbon是客户端的负载均衡工具,而客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置不同,在客户端负载均衡中,所有客户端节点下的服务端清单,需要自己从服务中心上获取,比如Eureka服务注册中心。同服务端负载均衡的架构类似,在客户端负载均衡也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成,所以默认会创建针对Ribbon的自动化整合配置在Spring Cloud中,Ribbon主要与RestTemplate对象配合起来使用,Ribbon会自动化配置RestTemplate对象,通过@LoadBalanced开启RestTemplate对象调用的负载均衡。
Ribbon实现客户端负载均衡
由于Spring Cloud Ribbon的封装。在微服务架构中使用客户端负载均衡调用非常简单,只需要两步:
- 启动多个服务提供者实例并注册刀到一个服务注册中心集群
- 服务消费者通过被@LoadBalanced注解修饰过的RestTemplate来调用提供者
这样我们就可以实现服务提供者的高可用以及服务消费者的负载均衡调用。例如通过消费端调用服务端的服务
/**
* 通过服务名称调用
* @return
*/
@GetMapping("/books")
public List<Books>findAllBook(){
String baseUrl = "http://service-provider/books/all";
Books[] books = restTemplate.getForObject(baseUrl, Books[].class);
return Arrays.asList(books);
}
Ribbon负载均衡策略
Ribbon的负载均衡策略是由IRule接口定义,该接口实现如下
RandomRule | 随机 |
RoundRibbonRule | 轮询 |
AvailabilityFilterRule | 先过滤掉由于多次访问故障的服务,以及并发连接数超过阈值的服务,然后对剩下的服务按照轮询策略进行访问 |
WeightedResponseTimerRule | 根据平均响应时间计算所有服务的权重,响应时间越快服务权重就越大被选中的概率即越高,如果服务刚启动时统计信息不足,则使用RoundRobbinRule策略,待统计信息足够会切换到该WeihtedResponseTimeRule策略 |
RetryRule | 先按照RoundRibbonRule策略分发,如果分发到的服务不能访问,则在指定时间内进行重试,分发其他可用分服务 |
BastAvailableRule | 先过滤掉由于多次访问故障的服务,然后选择一个并发量小的服务 |
ZoneAvoidanceRule | 综合判断服务节点所在区域的性能和服务节点的可用性,来决定选择哪个服务 |