- 官网:https://github.com/Netflix/ribbon
- spring cloud ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过spring cloud的封装,可以轻松面向服务的REST模板请求转换成客户端负载均衡的服务调用
- 根据调用服务的服务ID(spring.application.name指定的服务名)去注册中心获取对应的服务列表,并将服务列表拉取到本地进行缓存,然后在本地通过默认的轮询的负载均衡策略在现有列表中选择一个可用节点提供服务。
- Ribbon是客户端的负载均衡
- RoundRobinRule 轮询策略
按顺序循环选择server
- RandomRule 随机策略
随机选择server
- AvailabilityFilteringRule 可用过滤策略
会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
- WeightedResponseTimeRule 响应时间加权策略
根据平均响应的时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的概率越高。
刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够会切换到WeightedResponseTimeRule策略
- RetryRule 重试策略
先按照RoundRobinRule策略获取服务,如果获取失败则在指定的时间内进行重试,获取可用的服务
- BestAvailableRule 最低并发策略
会先过滤由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
......
图片待补充
1.查看loadBalancerClient.choose("ORDER")源码。顶层接口ServiceInstanceChooser#ServiceInstance choose(String serviceId)
2.RibbonLoadBalancerClient实现接口顶层接口ServiceInstanceChooser,重写ServiceInstance choose(String serviceId)方法
3.调用RibbonLoadBalancerClient中的方法ServiceInstance choose(String serviceId, Object hint)
- Server server = getServer(getLoadBalancer(serviceId), hint);
- Server getServer(ILoadBalancer loadBalancer, Object hint)
- loadBalancer.chooseServer(hint != null ? hint : "default")
4.ZoneAwareLoadBalancer#Server chooseServer(Object key)
- ZoneAwareLoadBalancer继承BaseLoadBalancer
5.BaseLoadBalancer#Server chooseServer(Object key)
- private final static IRule DEFAULT_RULE = new RoundRobinRule()
- protected IRule rule = DEFAULT_RULE;
6.最后根据IRule选择负载均衡算法(由BaseLoadBalancer类成员rule变量定义可知,默认为轮询)
# 修改用户服务调用订单服务的Ribbon负载均衡策略(默认是轮询) ORDER:服务名
ORDER.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
Ribbon已停止维护
ribbon-core、ribbon-loadbalancer依然在大规模生产实践中使用,如果需要实现服务间通信负载均衡依然可以用Ribbon