在spring cloud中常常会使用Feign或RestTemplate来做客户端的负载均衡。我们只需要将访问服务的主机地址改为服务名称就可以利用Ribbon进行负载均衡访问,同时,还可以将Ribbon与服务发现组件进行整合,其整合的关系大致如下图所示:
1,Eureka和Consul与Ribbon的集成
Eureka和Consul与Ribbon集成的方式都是在Ribbon配置(RibbonAutoConfiguration)执行后接着将Ribbon的默认配置类改为EurekaRibbonClientConfiguration或ConsulRibbonClientConfiguration完成的,如:
@RibbonClients(defaultConfiguration = EurekaRibbonClientConfiguration.class)
或
@RibbonClients(defaultConfiguration = ConsulRibbonClientConfiguration.class)
其核心的原理是默认情况下Ribbon为每个Ribbon客户端创建ApplicationContext是在第一次被使用的时候,通过调整Ribbon的默认配置类,可替换Ribbon中使用的核心对象,从而与Eureka或Consul集成。
2,Ribbon与Feign的集成
Ribbon在初始化的时候会创建一个核心对象SpringClientFactory,该对象里面保存了各个客户端所对应的ApplicationContext,通过SpringClientFactory便能访问各个Ribbon客户端(每个客户端又与上面的服务发现组件集成)。
同Ribbon创建SpringFactory一样,Feign使用FeignContext为每个Feign客户端使用FeignClientsConfiguration作为默认配置来创建一个ApplicationContext。
Feign在初始化的时候会为每个Feign客户端创建一个FeignClientFactoryBean代理工厂对象,该代理对象被掉用的时候,其内部会从FeignContext中得到LoadBalancerFeignClient对象(其实是从应用的ApplicationContext中取得,因为应用的ApplicationContext是FeignContext的父上下文)来发起请求,而LoadBalancerFeignClient对象里面使用了SpringFactory来调用Ribbon客户端完成请求。
它们的集成是Feign(spring-cloud-starter-openfeign)引用Ribbon的SpringFactory来完成。
3,Ribbon与RestTemplate集成
首先,Spring Cloud Commons通过拦截器完成了与RestTemplate的集成,同时Spring Cloud Commons通过LoadBalancerClient接口与其他框架进行集成。
同时,Ribbon的RibbonLoadBalancerClient正好又是LoadBalancerClient接口的实现类【在RibbonAutoConfiguration配置类中创建】,在该实现类中也使用了Ribbon的SpringClientFactory来调用Ribbon客户端完成请求。
它们的集成是通过Ribbon(Spring cloud Netflix Ribbon)实现Spring cloud commons中的LoadBalancerClient接口来完成。