该文章基于是本人自己总结和分析的内容,技术有限,如有错误请各位大佬及时指出
话不多说,上货!
1.消费者发起请求
例如:http://userservice/user/1
2.该请求会被客户端请求拦截器ClientHttpRequestInterceptor的实现类负载均衡拦截器LoadBalancerInterceptor中的intercept方法拦截
3.该方法会传入一个HttpRequest对象,通过Request对象的getURl方法获取到请求路径,再通过getHost方法获取到该请求路径的主机名
例如:userservice
4.将获取到的主机名交给Ribbon的负载均衡客户端RibbonLoadBalancerClient的excute方法去执行
5.该方法传入获取到的主机名给getLoadBalancer方法,返回得到一个DynamicServerListLoadBalancer对象,该对象的allServerList属性封装了该主机名对应的真实请求主机名
6.调用getServer方法,该方法中又调用了 ZoneAwareLoadBalancer中的chooseServer方法,该方法又调用了父类BaseLoadBalancer中的chooseServer方法
7.该方法返回的是一个IRule对象,而IRule是一个接口,它实现了
(1)ClientConfigEnabledRoundRibbonRule
(2)轮询规则RoundRibbonRule
(3)随机规则RandomRule
(4)RetryRule
8.而默认的负载均衡规则是ZoneAvoidanceRule
9.进过IRule负载均衡过后,会返回负载均衡后调用的真实主机名给RibbonLoadBalancerClient,最后将主机名替换到原本的请求地址上发出请求