负载介绍
负载均衡白话解释:售票厅的售票窗口,就是很好的例子,买票的人(请求)多了就多开几个窗口(服务),买票人会随机(随机负载算法)到一个窗口排队。
负载分两种:
- 客户端负载:服务列表存储在客户端,好比买票的人心里都知道有几个窗口在卖票,自己选择去哪边排队,Ribbon属于这种
- 服务端负载:服务列表存储在服务端,好比黄牛票,买票的人不知道几个窗口买票,所以都找黄牛,但是黄牛知道有多少窗口,他自己去排队,Nginx属于这种
添加依赖
在引入openfeign
时,会同时引入ribbon
,所以不用单独引入。
这里提示重复,是因为在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中负载均衡算法:
(1)RoundRobinRule:轮询;
(2)RandomRule:随机;
(3)AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
(4)WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule;
(5)RetryRule:先按照RoundRobinRule(轮询)策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务;
(6)BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
(7)ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器,在没有Zone的情况下是类似轮询的算法;
扩展阅读
https://www.jianshu.com/p/1bd66db5dc46