本文已参与「新人创作礼」活动,一起开启掘金创作之路。
\
LoadBalancerInterceptor
@LoadBalanced
spring.factories
LoadBalancerAutoConfiguration
LoadBalancerInterceptor & ClientHttpRequestInterceptor
LoadBalancerClient & RibbonLoadBalancedClient
LoadBalancerRequest & LoadBalancerRequestFactory
LocalBalancerClient
spring.factories
RibbonAutoConfiguration
SpringClientFactory
RibbonLoadBalancerClient & LoadBalancerClient & LoadBalancerChooser
LocalBalancer
SpringClientFactory & NamedContextFactory
RibbonClientConfiguration
IConfig & IRule & IPing & ServerList & ServerListUpdater & ServerListFilter
ZoneAwareLoadBalancer & DynamicServerListLoadBalancer & BaseLoadBalancer & ILoadBalancer
ServerList
EurekaRibbonConfiguration
DomainExtractingServerList(DiscoveryEnableNIWSServerList) & ServerList
ServerListUpdater
PollingServerListUpdater
IRule
ZoneAvoidanceRule & PredicateBasedRule & ClientConfigEnableRoundRibbonRule & AbstractLoadBalancerRule & IRule
IPing
RibbonEurekaAutoConfiguration
@RibbonClients
EurekaRibbonClientConfiguration
NIWSDiscoveryPing & AbstractLoadBalancerPing & IPing
LocalBalancerRequest
LocalBalancerAutoConfiguration
LocalBalancerClient & List
LocalBalancerRequestFactory
ServiceRequestWrapper
ClientHttpRequestFactory(uri,method)
ClientHttpRequest
LocalBalancerRequestFactory
使用装饰器模式用ServiceInstance和LoadBalancerClient装饰HttpRequest构造成ServiceRequestWrapper
ServiceRequestWrapper
重载HttpRequest.getRUI()方法,通过ServiceInstance和LoadBalancerClient获取重构之后的真实HTTP请求地址。
ClientHttpRequestFactory
HttpAccesor & InterceptingHttpAccessor
ClientHttpRequestFactory
Ribbon原生负载均衡算法IRule
原生的round robin的负载均衡算法,如果发生服务实例宕机,会导致服务消费端最多延迟4分钟才能感知到。30秒(PollingServerListUpdater) + 30秒(Eureka 服务发现) + 180秒(Eureka故障自动感知及摘除)
int nextServerIndex = incrementAndGetModulo(serverCount);
server = allServers.get(nextServerIndex);
RoundRobinRule不断的从自己本地的server list中去round robin轮询选择一个server去请求
可能会不断的请求一个已经不存在的,故障的服务实例,请求失败
Spring Cloud通过Hystrix做资源隔离,熔断和降级,对这个请求失败的服务实例,就走降级机制,可以保证某个服务实例故障了,不会因为请求服务实例失败,而影响当前的服务消费端服务
RoundRobinRule:默认负载均衡,直接round robin轮询,从一堆server list中,按照顺序不断的轮询选择出来一个server,每个server平摊请求。
AvailabilityFilteringRule:会考察服务器的可用性
如果3次连接失败,就会等待30秒后再次访问;如果不断失败,那么等待时间会不断变长。
如果某个服务器的并发请求太高了,那么会绕过去,不再访问。
先用round robin算法,轮询选择一台server,如果server是存活可用的即返回server。如果server是不可用的,再次round robin算法选择下一台server,依次循环往复,10次。否则调用父类PredicateBasedRule.choose()
WeightedResponseTimeRule:带权重的,每个服务器可以有权重,权重越高优先访问,如果某个服务器响应时间比较长,那么权重就会降低,减少访问。
ZoneAvoidanceRule:根据机房和服务器来进行负载均衡,是spring cloud ribbon环境中的默认的Rule
BestAvailableRule:忽略那些请求失败的服务器,然后尽量找并发比较低的服务器来请求
RandomRule:随机找一个服务器,尽量将流量分散在各个服务器上
RetryRule:可以重试的。通过round robin找到的服务器请求失败,可以重新找一个服务器