1、简介
spring-cloud-commons 是 Spring Cloud 对于微服务基础组件的抽象。在一个微服务中,调用微服务 A 与调用微服务 B 的配置可能不同。比较简单的例子就是,A 微服务是一个简单的用户订单查询服务,接口返回速度很快,B 是一个报表微服务,接口返回速度比较慢。这样的话我们就不能对于调用微服务 A 和微服务 B 使用相同的超时时间配置。还有就是,我们可能对于服务 A 通过注册中心进行发现,对于服务 B 则是通过 DNS 解析进行服务发现,所以对于不同的微服务我们可能使用不同的组件,在 Spring 中就是使用不同类型的 Bean。
在这种需求下,不同微服务的客户端有不同的以及相同的配置,有不同的 Bean,也有相同的 Bean。所以,我们可以针对每一个微服务将他们的 Bean 所处于 ApplicationContext 独立开来,不同微服务客户端使用不同的 ApplicationContext。NamedContextFactory 就是用来实现这种机制的。
2、结构
?NamedContextFactory:用于管理子上下文AnnotationConfigApplicationContext,使用Map来存储上下文名称与上下文之间的映射关系,上下文名称与配置类(BeanDefinition)之间的映射关系。在获取名称对应的上下文时,如果没有,就创建上下文,同时将名称对应的配置类也注册到上下文中。
Specification:名称及其配置类的抽象。
3、应用场景
Spring Cloud Netflix中的Ribbon。
SpringClientFactory:继承了NamedContextFactory
RibbonClientSpecification:实现了Specification
RibbonClientConfigurationRegistrar类会根据 @RibbonClients或者@RibbonClient注解,解析配置,创建RibbonClientSpecification,注册到BeanDefinitionRegistry中
RibbonAutoConfiguration自动配置类中创建SpringClientFactory,并且设置RibbonClientSpecification
|