负载均衡流程
-
首先order-service发起请求获取user-service,到ribbon
-
ribbon发送给eureka-server注册中心拉取userservice
-
eureka-service返回user-service服务列表给Ribbon
-
Ribbon轮询到8081
负载均衡原理
源码阅读
-
@LoadBalanced注解标记从RestTemplate所发起的请求要被Ribbon进行拦截处理
-
LoadBalancerInterceptor接口实现ClientHttpRequestInterceptor,CHRI的intercept方法拦截由客户端发起的请求,LoadBalancerInterceptor重写了intercept方法,获取原始URI路径,通过URI的gethost方法获取服务的名字,并根据服务名称调用了RibbonLoadBalancer的excute方法,在excute方法中DynamicServerListLoadBalancer使用getServer方法完成了服务列表
Server
的拉取 -
继续向下追踪getServer进入 ZoneAwareLoadBalancer的chooseServer方法,内部调用其父类BaseLoadBalancer的chooseServer,在其中有rule.choose方法,rule就代表负载均衡的规则,
-
rule是IRule接口类型,决定了负载均衡的策略,IRule实现类如下:RandomRule代表随机、RoudRobinRule代表轮询负载均衡,默认的负载均衡是ZoneAvoidanceRule
-
-
我们可以负载均衡获取到真实的服务地址8081,代替原来的服务名称发起真实请求
图解LoadBalancerInterCeptor负载均衡拦截器流程
-
order-service发起请求给RibbonLoadBanancerClient,请求获取指定的userservice
-
RibbonLoadBanlancerClient拉取请求中的服务id给DynamicServeriListLoadBalancer
-
DynamicServeriListLoadBalancer去注册中线拉取userService
-
注册中心返回服务列表给DynamicServiListLoadBalancer
-
DSLB找IRule接口,根据规则进行对服务列表进行负载均衡
-
IRlue选择某个服务发从给RibbonLoadBanlancerClient
-
RibbonLoadBanlancerClient修改order-service中的URL发送请求到负载均衡到的服务
IRule负载均衡策略
Ribbon负载均衡的规则是IRule接口实现来定义的,每个子接口都是一种规则
默认负载均衡规则是ZoneAvoidanceRule:
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架。而后对Zone内的多个服务做轮询,服务消费者优先选择在同一个Zone的服务再做轮询RoundRobinRule
常见的负载均衡策略
调整负载均衡策略
通过IRule实现可以修改负载均衡规则
1、通过代码定义一个新的IRule - 全局配置
全局配置范围:无论哪个服务提供都会进行此规则的负载均衡
在配置类OrderApplication定义一个新的IRule
@Bean
public IRule randomRule(){
return new RandomRule();
}
2、配置文件方式 - 单独配置
单独配置范围:不同服务配置不同规则
在Order-service的applicatioon.yml文件中,添加新的配置也可以修改规则
userservice: #指定要配置负载均衡的服务
ribbon: #Ribbond负载均衡的规则
NFLoadBalancerRuleClassName:com.netfile.loadbalancer.RandomRule #负载均衡规则
Ribbon饥饿加载
Ribbon默认采用懒加载,第一次访问时才会去创建LoadBalanceClient,请求的时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时
懒加载 - 默认
第一次访问时才会去创建LoadBalanceClient,请求的时间会很长
饥饿加载 - 对指定的服务做饥饿加载
在项目启动的时候就去创建了,降低第一次访问的耗时
ribbon:
eager-load:
enablee: true #开启饥饿加载
clients: #并不是全局统一配置:对如下服务饥饿加载
- userservice
- orderservice
标签:负载,服务,service,IRule,均衡,Ribbon
From: https://www.cnblogs.com/phonk/p/16748900.html