Netflix Ribbon - Ribbon原生负载均衡算法IRule

125 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


\

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找到的服务器请求失败,可以重新找一个服务器