Ribbon负载均衡策略
ribbon是一个客户端负载均衡器,类似于nginx的负载均衡模块功能
负载均衡(Load Balance)是用于解决一台机器无法解决所有请求而产生的一种算法,像nginx使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡、openfeign等很多地方使用到了负载均衡。
主流的负载均衡方案分为两类:
1.集中式的负载均衡,即在服务的消费方和提供方之间使用独立的设备,如nginx、F5等,通过这种设施将访问的请求通过某种策略转发至服务的提供方
2.进程内的负载均衡,将负载均衡策略逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可以用,然后再从这些地址中选择一个合适的服务器,Ribbon就是进程内的负载均衡策略,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
使用负载均衡的好处:
当集群的一台或者多台服务器挂掉的时候,剩余的没有挂的服务器可以保证服务的继续使用
使用了更多机器保证机器的良性使用,不会由于某一时刻并发量上升导致服务器压力过大
负载均衡常见的策略:
- 随机 (Random)
- 轮询 (RoundRobin)
- 一致性哈希(ConsistentHash)
- 哈希(Hash)
- 加权(Weighted)
Ribbon的组件
接口 | 作用 | 默认实现 |
IClientConfig | 读取配置 | DefaultClientConfigImpl |
IRule | 负载均衡规则,根据规则选择实例 | ZoneAvoidanceRule(轮询) |
IPing | 筛选掉ping不通的实例 | DummyPing |
ServerList< Server> | 交给Ribbon的实例列表 | Ribbon:ConfigurationBasedServerList Spring Cloud Alibaba:NacosServerList |
ServerListFilter< Server> | 过滤掉不符合条件的实例 | ZonePreferenceServerListFilter |
ILoadBalance | Ribbon的入口 | ZoneAwareLoadBalance |
ServerListUpdater | 更新交给Ribbon的List的策略 | PollingServerListUpdater |
ribbon版本:2.2.2->ribbon-loadbalancer版本:2.3.0
IRule
IRule路由接口代表负载均衡策略
/**
* Interface that defines a "Rule" for a LoadBalancer. A Rule can be thought of
* as a Strategy for loadbalacing. Well known loadbalancing strategies include
* Round Robin, Response Time based etc.
*
* @author stonse
*
*/
public interface IRule{
/*
* choose one alive server from lb.allServers or
* lb.upServers according to key
*
* @return choosen Server object. NULL is returned if none
* server is available
*/
public Server choose(Object key);
public void setLoadBalancer(ILoadBalancer lb);
public ILoadBalancer getLoadBalancer();
}
IRule接口的实现类有以下几种
如何设置负载均衡策略
编写配置类转载指定的bean
/**
* RetryRule 重试策略
* AvailabilityFilteringRule 可用过滤策略
* ResponseTimeWeightedRule 响应时间加权重策略
* ZoneAvoidanceRule 根据区域的性能和服务的可用性等权重选择服务,如果没有区域就类似于轮询
* RoundRobinRule 最基本的轮询选择
* RandomRule 随机策略
* WeightedResponseTimeRule 加权策略
* BestAvailableRule 最小请求数策略
*/
@Configuration()
public class RibbonClientDefaultConfigurationConfig {
@Bean
public IRule ribbonRule() {
return new ZoneAvoidanceRule();
}
}
特别注意,如果注册中心有多个服务的情况下,需要将注册的策略实现类设为多例,否则会出现请求指向错误