概念
Ribbon是一个机遇Http和Tcp的客户端负载均衡工具。基于Netflix Ribbon实现。
负载均衡
我自己之前理解的负载均衡是服务端负载均衡,包括硬件负载均衡和软件负载均衡,硬件常用的就是F5,软件负载均衡常用的就是Nginx。当客户端发送请求到负载均衡设备的时候,该设备按某种算法(线性轮询,按权重负载,按流量负载等),然后选出一台可用的服务器端地址,然后转发请求。
Ribbon是客户端负载均衡,客户端维护着自己访问的服务端清单,服务端清单来自于Eureka注册中心,并且需要心跳来维护服务端清单的健康。
Ribbon的源码分析
Ribbon是通过RestTemplate实现客户端负载均衡的。
注解@LoadBalanced 用来给RestTemplate做一个标记,以使用负载均衡的客户端(LoadBalancerClient)来配置它。
三个方法:1,choose(String serviceId) 根据传入的服务名,从均衡器中挑选一个对应的服务实例。
2,T execute(String serviceId,LoadBalancerRequest request) 从均衡器中挑选出服务实例来执行请求。
3,URI reconstructURI(ServiceInstance instance, URI original) 为系统构建一个合适的URI
LoadBalancerAutoConfiguration 类为实现客户端负载均衡器的自动化配置类。
如上图所示,必须满足两个条件。1,RestTemplate类必须存在于当前工程的环境中。2,Spring的Bean中必须有LoadBalancerClient的实现Bean。
自动化配置类中,主要做了三件事:
1.创建了一个LoadBalancerInterceptor 的Bean ,实现对客户端发起的请求进行拦截,以便实现客户端的负载均衡。
2.创建了一个RestTemplateCustomizer的Bean,用于给RestTemplate增加一个LoadBalancerInterceptor拦截器。
3.维护了一个被@LoadBalanced 注解修饰的RestTemplate对象列表,并在这里进行初始化,给需要客户端负载均衡的RestTemplate增加拦截器。