简述
在项目中,我们使用了consul作为服务注册中心,Ribbon负责到注册中心拿到微服务的地址列表,进行负载均衡服务调用。
负载均衡
我们可以把负载均衡分为服务端负载均衡和客户端负载均衡。
- 服务端负载均衡
比如nginx,F5(硬件负载均衡),请求到达服务器后,服务器根据负载均衡算法将请求转发到目标服务器进行处理。 - 客户端负载均衡
比如Ribbon,首先从注册中心获取到服务器地址列表,然后通过负载均衡算法选择了某个服务器后进行调用。
我使用的consul作为服务注册中心,使用RestTemplate进行RPC调用(RestTemplate是基于HTTP),RestTemplate可以通过标记@LoadBalanced注解,使用Ribbon进行负载均衡调用。RestTemplate使用Ribbon负载均衡其实使用了拦截器原理,LoadBalancerInterceptor
这个类,有兴趣可以了解下。
Ribbon自带负载均衡策略
Ribbon自带的负载均衡策略由下图所示:
一共有七种,下面我们看下每种负载均衡策略的作用。
负载均衡策略 | 描述 |
---|---|
BestAvailableRule最小连接数策略 | 遍历serverList,选取出可用并且连接数最小的一个服务。该算法里面有一个LoadBalancerStats的成员变量,存储所有服务的运行状况和连接数。 |
ZoneAvoidanceRule区域权衡策略,默认策略 | 轮询策略的扩展,使用了ZoneAvoidancePredicate和AvailabilityPredicate过滤器。除了会过滤掉超时和连接数太多的服务之外,还会过滤掉不符合要求的zone区域内所有节点。 |
AvailabilityFilteringRule可用过滤策略 | 轮询策略的扩展,轮询选取了一个服务后,判断服务是否可用,连接数是否超限,如果成功则返回,否则轮询下一个服务。 |
WeightedResponseTimeRule响应时间加权策略 | 根据平均响应时间计算出服务的权重,响应快权重就大,被选中的概率就高。服务刚启动统计信息是不足的,这时候先使用轮询策略,统计信息完善后,会切换为WeightedResponseTimeRule策略 |
RoundRobinRule轮询策略 | 轮询服务,如果循环10次还是没取到可用的服务,则返回一个空的服务。 |
RandomRule随机策略 | 随机选取一个服务,如果服务不可用的话会while循环选取下一个服务。 |
RetryRule重试策略 | 一定时间内循环重试。默认是使用了轮询策略,也支持自定义注入。RetryRule会在每次选取后对服务判断是否为非空或者alive,如果不是的话会在默认500ms内不断选取。如果使用了默认的IRule则使用了轮询,超过10次后返回一个空的服务。 |
评论区