负载均衡的几种算法分析与实战
1概述
在SpringCloud构建的微服务系统中,Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是和RestTemplate结合,另一种是和Feign结合。Feign默认集成了Ribbon。
1.1 负载均衡器的核心类LoadBalancerClient
spring-cloud-commons-2.1.0.RELEASE.jar
org.springframework.cloud.client.loadbalancer.LoadBalancerClient
ServiceInstance choose(String serviceId);
RibbonLoadBalancerClient是LoadBalancerClient最终实现类。

图 1
public interface ServiceInstanceChooser {
/**
* Chooses a ServiceInstance from the LoadBalancer for the specified service.
* @param serviceId The service ID to look up the LoadBalancer.
* @return A ServiceInstance that matches the serviceId.
*/
ServiceInstance choose(String serviceId);
}

图 2
1.1.1 ILoadBalancer

图 3

图 4
1.1.2 DynamicServerListLoadBalancer
继承BaseLoadBalancer,其中BaseLoadBalancer默认的负载均衡配置:
private final static IRule DEFAULT_RULE = new RoundRobinRule();
这里IRule用于配置负载均衡的策略。其它的配置还有:
IClientConfig ribbonClientConfig:DefaultClientConfigImpl
IPing ribbonPing:DummyPing
ServerList ribbonServerList:ConfigurationBasedServerList
ServerListFilter ribbonServerListFilter:ZonePerferenceServerListFilter
ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer
IRule ribbonRule:RoundRobinRule
1.1.2.1 IRule
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默认的实现类有如下7种。

图 5
BestAvailableRule:选择最小请求数
ClientConfigEnabledRoundRobinRule:轮询
RandomRule:随机选择一个server
RoundRobinRule:轮询选择一个server(clound默认方式)
RetryRule:根据轮询的方式重试
WeightedResponseTimeRule:根据相应时间分配weight,weight越低,被选择的可能性越低
ZoneAvoidanceRule:根据server的zone区域和可用性来轮询选择
网友评论