SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。
源码分析
1.LoadBalancerIntercepor
为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。
显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor
,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。
定位到这个类当中
可以看到这里的intercept方法,拦截了用户请求,然后做了几件事
request.getURI():获取请求URL originalUri.getHost():获取uri路径的主机名,就是服务id this.loadBalancer.execute:处理服务id和用户请求
2.LoadBalancerClient
继续跟进execute方法:
getLoadBalance:根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
getServer:利用内置的负载均衡算法,从服务列表中选择一个。
3.负载均衡策略IRule
继续跟进getServer方法
再跟进chooseServer方法,发现有有这么一段代码
我们看看这个rule是谁
RoundRobinRule不就是循环的意思嘛,到这里可以结论出SpringCloud底层利用Ribbon实现负载均衡,而Ribbon则通过IRule实现负载均衡,也就是说Ribbon实现负载均衡的组件,一定是IRule的实现类。