Ribbon负载均衡流程
- 发起请求http://服务名xxx/服务接口名xxx/参数
- 被LoadBalancerInterceptor负载均衡拦截器拦截
- LoadBalancerInterceptor调用RibbonLoadBanlancerClient真实执行
- RibbonLoadBanlancerClient获取url中的服务参数与服务接口名
- RibbonLoadBanlancerClient调用DynamicServerListLoadBalancer,从eurekaserver中得到服务列表
- DynamicServerListLoadBalancer调用IRule负载均衡得到某个服务真实服务地址,传递给RibbonLoadBanlancerClient
- RibbonLoadBanlancerClient修改url为真实服务地址,发起请求http://localhost:18081xx服务端口/服务接口/参数
- 对应客户端响应请求,完成整个流程。
使用断点调试
LoadBalancerInterceptor
由流程可知,请求将会被LoadBalancerInterceptor拦截器拦截,我们在LoadBalancerInterceptor类下的intercept下打下断点,可以观察到ribbin请求到达拦截器,被拦截器拦截到,intercept调用execute方法去获取真实url及负载均衡
1 |
|
execute
execute的类LoadBalancerClient是一个接口,我们在它的实现类RibbonLoadBalancerClient上的execute方法打上断点,可以观察到请求转发过来
1 | public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) |
HttpURLConnection
最后在HttpURLConnection中打上断点,可以观察到,发起的http请求的地址已经是负载均衡过的可用真实地址
1 | protected HttpURLConnection (URL u) { |