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 | 重试机制的选择逻辑。 |
切换负载均衡策略
- 通过代码的方式,注入新的IRule,来覆盖默认的策略,此设置对所有的服务提供者有效:
@Bean
public IRule randomRule()
return new RandomRule();
- 针对服务提供者,配置不同的负载均衡策略。直接在application.yml配置文件中进行书写:
oneservice: #服务名称
ribbon:
NFLoadBanlancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡策略实现类
饥饿加载
Ribbon默认采用懒加载模式,也就是第一次访问的时候创建LoadBanlanceClient实例(通常在服务重启或GC后出现)并且拉去服务列表,这将导致一次RPC调用过程很长。
饥饿加载模式指在项目启动的时候就会创建LoadBanlanceClient实例,从而降低第一次访问的耗时:
ribbon:
eager-load: #饥饿加载
enable: true #启动饥饿加载
clients:
- oneservice #指定服务
- twoservice
以上是关于4-Ribbon负载均衡的主要内容,如果未能解决你的问题,请参考以下文章
微服务入门(RestTemplateEurekaNacosFeignGateway)