Ribbon运行时Bean做了命名空间隔离,给每个服务方定义一个独立的bean上下文。这样做是为了支持对某一个服务单独配置负载。比如负载算法,是否重试等,也可以为每一个服务实例化一个服务发现逻辑,可以最大化地将自由交给实现方。
核心领域对象
-
SpringClientFactory是Ribbon全局唯一的bean工厂,只有一个实例。通过getInstances(String name, Class type)可以创建不同的命名空间(name)的不同类型对象(type)实例。
-
对@FeignClient声明的服务而言,每一个name都有一个FeignLoadBalancer实例。FeignLoadBalancer通过DynamicServerListLoadBalancer执行具体的负载均衡工作。
-
DynamicServerListLoadBalancer承载了Ribbon运行时负载均衡的全部逻辑,包括负载选择,重试等等。
-
ConsulServerList是一个逻辑含义的服务,指向一组具有相同业务功能的物理服务。是负载均衡选择的基础。
-
ConsulServer是一个物理含义的服务,指向服务的一个具体的运行实例。
bean注册
Ribbon注册的引入链为
RibbonAutoConfiguration
=> SpringClientFactory
=> @RibbonClients
=> RibbonClientConfigurationRegistrar
SpringClientFactory懒加载
Ribbon运行时依赖的类并没有在spring Application启动时初始化,而是在使用时懒加载。在需要时,SpringClientFactory基于RibbonClientConfiguration创建对应的bean实例。SpringClientFactory继承了NamedContextFactory。
Feign运行时,SynchronousMethodHandler.executeAndDecode(RequestTemplate)调用LoadBalancerFeignClient实现负载均衡。分析LoadBalancerFeignClient代码可以看出懒加载的过程:
//LoadBalancerFeignClient
@Override
public Response execute(Request request, Request.Options options)