开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
Ribbon用于解决负载问题,正常的负载分两种方式:
服务端负载:服务列表存储在客户端,好比买票的人心里都知道有几个窗口在卖票,自己选择去哪边排队,Ribbon属于这种客户端负载:服务列表存储在服务端,好比黄牛票,买票的人不知道几个窗口买票,所以都找黄牛,但是黄牛知道有多少窗口,他自己去排队,Nginx属于这种
添加依赖
如果配合Openfeign使用,会自动引入Ribbon,不用再单独添加依赖,否则需要手动添加:
这里提示重复,是因为项目中使用了nacos,在nacos/discovery中也引入了ribbon组件。
核心接口介绍
LoadBalancerClient
public interface ServiceInstanceChooser {
// 根据serviceId和负载策略,在服务列表中选择一个可用的服务实例
ServiceInstance choose(String serviceId);
}
public interface LoadBalancerClient extends ServiceInstanceChooser {
// 执行服务调用
<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
// 执行服务调用
<T> T execute(String serviceId, ServiceInstance serviceInstance,
LoadBalancerRequest<T> request) throws IOException;
// 根据服务实例解析真实的URI
URI reconstructURI(ServiceInstance instance, URI original);
}
LoadBalancerAutoConfiguration 自主配置类
自动配置类主要干了这么几件事:
- 创建一个LoadBalancerAutoConfiguration的bean,用于拦截对外请求,然后执行负载流程
- 把@LoadBalanced标注的RestTemplate保存到一个列表中
- 创建一个RestTemplateCustomizer的bean,给上面列表中的RestTemplate添加拦截器LoadBalancerAutoConfiguration
自动配置就是把添加了负载的RestTemplate保存下来,并添加拦截器,每次对外请求(Ribbon是客户端负载组建)都会被拦截器拦截住,施加负载策略,然后再真正执行服务调用。
修改负载策略
因为Ribbon是客户端负载,所以要把策略IRule配置在请求发起端,即客户端
@Configuration
public class ProxyConfig {
@Bean
IRule iRule(){
return new RandomRule();
}
}
Ribbon中的7中负载均衡算法:
RoundRobinRule:轮询;RandomRule:随机;AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule;RetryRule:先按照RoundRobinRule(轮询)策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务;BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器,在没有Zone的情况下是类似轮询的算法;