最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

焦点讯息:4-Ribbon负载均衡

来源:博客园


(相关资料图)

Ribbon负载均衡

负载均衡流程

在通过服务名称访问服务的时候,无法直接访问目标服务,Ribbon在检测到使用服务名进行远程调用的路径之后,会从eureka获取此服务下所有的实例,并获取到服务的真实访问地址,再通过一定的负载均衡策略访问目标地址。

代码实现

注解的拦截

因为在RestTemplate注入时添加了@LoadBanlance注解,此注解被org.springframework.cloud.client.loadbalancer.LoadBanlancerInterceptor类拦截进行负载均衡,此类实现了org.springframework.http.client.ClientHttpRequestInterceptor接口,此接口将拦截所有客户端发送的Http请求,其核心方法为intercept方法,用于拦截所有请求。

进入Ribbon

在LoadBanlancerInterceptor类中,intercept方法被实现并获取请求路径,具体实现方式就是获取到请求地址里的Host,然后交由被注入的loadBanlancer属性的execute方法进行执行,此属性在引入Eureka后默认注入RibbonLoadBanlancerClient。

获取服务列表

RibbonLoadBanlancerClient的execute中getLoadBanlancer方法将通过服务名称获取到一个负载均衡对象ZoneAwareLoadBanlancer,其中包含一个“动态服务列表”对象DynamicServerListLoadBanlancer,包含着此服务下的各个实例地址,接着就要开始进行负载均衡。

开始负载均衡

通过getServer方法传入动态服务列表对象,在此方法中将调用ZoneAwareLoadBanlancer的choseServer方法来选择一个服务进行返回,实际上调用了父类BaseLoadBalancerdechoseServer的choseServer方法,此方法将通过rule实例进行服务的选择,rule默认被ZoneAvaidanceRule注入。

IRule负载均衡策略

内置策略

由上文可见,最终决定调用哪个服务的对象时rule,通过不同的实现类可以实现不同的负载策略:

上文中可见ZoneAvaidanceRule是默认的实现方式。其他的常见的内置负载均衡方案如下:

实现类规则描述
RoundRobinRule简单轮询服务列表选择服务器,Ribbon默认的规则。
AvailabilityFilteringRule连续三次连接失败将给予30秒短路,再次连接失败将使短路时间几何增加。并发过高时配置了AvailabilityFilteringRule规则的客户端将被忽略。并法数量的上限由客户端的${clientName}.${clientConfigNameSpace}.ArtiveConnectionsLimit进行配置。
WeightedResponseTimeRule每个实例会有一个权重值,响应时间越长权重越小。根据权重选择服务器,同等权重随机访问服务器。
ZoneAvoidanceRule以区域为基础进行服务器选择,Zone标识一个己方或者一个地区,选择最近的地区进行轮询访问。
BestAvailableRule忽略短路的,选择并法较少的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑。

切换负载均衡策略

  1. 通过代码的方式,注入新的IRule,来覆盖默认的策略,此设置对所有的服务提供者有效:
@Beanpublic IRule randomRule(){return new RandomRule();}
  1. 针对服务提供者,配置不同的负载均衡策略。直接在application.yml配置文件中进行书写:
oneservice: #服务名称ribbon:NFLoadBanlancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡策略实现类

饥饿加载

Ribbon默认采用懒加载模式,也就是第一次访问的时候创建LoadBanlanceClient实例(通常在服务重启或GC后出现)并且拉去服务列表,这将导致一次RPC调用过程很长。饥饿加载模式指在项目启动的时候就会创建LoadBanlanceClient实例,从而降低第一次访问的耗时:

ribbon:eager-load: #饥饿加载enable: true #启动饥饿加载clients:- oneservice #指定服务- twoservice

关键词: 负载均衡 服务列表 服务提供者