前言
主要学习一下ribbon负载均衡原理、负载均衡策略、懒加载等
一、负载均衡流程
1、发起请求
2、拉取服务列表
3、返回服务列表
4、轮询到8081
二、负载均衡原理
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
由上图我们可以发现,order service发送的请求被ribbon拦截了,这个拦截器就是LoadBalacerInterceptor
LoadBalacerInterceptor 实现了ClientHttoRequestInterceptor接口,这个接口可以拦截客户端发的http请求,里面有个intercept方法
查看LoadBalacerInterceptor里面的intercept方法
进入execute方法
再进入execute方法,通过服务名从eureka获取到服务列表
进入getServer方法
进入chooseServer方法
调用父类的chooseServe方法,可以看到是通过rule对象进行规则筛选
查看rule对象是什么类型—》IRule (I 接口的意思) 这里面是随机
查看IRule接口的实现类
随机到8081,可以使用真的ip和端口去替换服务名
完整流程图
三、负载均衡策略
Ribbon的负载均衡规则是一个叫IRule的接口来定义的,每一个字接口都是一种规则
通过定义IRule实现可以修改负载均衡规则,有两种方式
1、代码方式:在orderservice中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule();
}
2、配置文件方式:在order service的application.yml文件中,添加新的配置也可以修改规则:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
四、懒加载
Ribbon默认是采用懒加载,即第一次访问时才会去创LoadBalanceClient,请求时间会很长。
第一次加载时间:308ms
第二次加载时间:65ms
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面的配置开启饥饿加载:
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: userservice # 指定对userservice这个服务饥饿加载
第一次加载时间:218ms