文章目录
- 负载均衡原理
- 流程
- 原理
- 源码分析
- 负载均衡流程
- 负载均衡策略
- 饥饿加载
- 总结
负载均衡原理
流程
原理
@LoadBalanced
标记RestTemplate发起的http请求要被Ribbon进行拦截和处理
源码分析
- ctrl+shift+N搜索LoadBalancerInterceptor,进入。发现实现了ClientHttpRequestInterceptor(客户端Http请求拦截器)的intercept方法
拦截方法
- 打一个断点,启动order-application,浏览器发送请求http://localhost:8080/order/104
- 在该方法中对http请求进行拦截,获取到了服务名serviceName = “userservice”,然后进入到了RibbonLoadBalancerClient的excute方法中。
- 进入到excute方法,发现调用了该类的一个重载方法excute
- step into到这个excute方法
发现serviceId = “userservice”,通过serviceId获取到ILoadBalancer,点开ILoadBalancer,发现里面存储了两个userservice,即成功拉取了2个userservice。获取的loadBalancer对象的名称为DynamicServerListLoadBalancer,动态服务列表负载均衡器。
- 进入到getServer方法,下一步从loadBalancer的2个userservice中选择1个
再进入到chooseServer方法里,最终调用了父类的chooseServer方法
进入,最终调用了rule.choose方法
查看这个rule,发现是一个IRule类型,这是一个接口,ctrl+h查看实现该接口的类有哪些
发现有好几种规则,RoundRobin,Random等,正是通过这几种规则从多个userservice中选择出一个合适的userservice。
负载均衡流程
负载均衡策略
通过定义IRule的实现可以修改负载均衡的策略
- 方式一,直接在配置类中定义。针对所有微服务而言。
@Bean
public IRule randomRule(){ return new RandomRule();
}
- 方式二,在application.yml中定义。针对某个微服务。
userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
饥饿加载
Ribbon默认采用的是懒加载,即第一次访问Ribbon服务的时候才会加载LoadBalanceClient,请求时间会很长;
而饥饿加载在项目启动时加载
ribbon: eager-load: enabled: true # 开启饥饿加载 clients: userservice # 指定对userservice这个服务饥饿加载
- 懒加载,第一次访问是409ms,后续10ms
- 饥饿加载,第一次访问是236ms,后续10ms