4-Ribbon负载均衡

Posted Be a good java boy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,来覆盖默认的策略,此设置对所有的服务提供者有效:
@Bean
public 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

以上是关于4-Ribbon负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud之Ribbon进行服务调用

微服务入门(RestTemplateEurekaNacosFeignGateway)

微服务入门(RestTemplateEurekaNacosFeignGateway)

nginx负载均衡

Ribbon-负载均衡策略

ribbon负载均衡详解