spring-boot-admin-client启动流程
2019-08-03 本文已影响4人
王勇1024
背景
最近在设计和开发部门的基础架构,基于Spring Cloud可以大幅降低开发成本。其中一个环节是使用spring-boot-admin监听和记录客户端的运行情况,所以需要去研究spring-boot-admin
的原理。今天就分析一下spring-boot-admin-client的启动流程。
启动流程
通过 Spring Factories机制 我们知道,要想分析Spring Cloud中一个组件的启动流程,首先应该去看它的META-INF/spring.factories
文件。
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration,\
de.codecentric.boot.admin.client.config.SpringBootAdminClientCloudFoundryAutoConfiguration
其中SpringBootAdminClientCloudFoundryAutoConfiguration
是针对云平台的配置,我们暂且不用管它。先重点看一下SpringBootAdminClientAutoConfiguration
:
@Configuration
@ConditionalOnWebApplication
@Conditional(SpringBootAdminClientEnabledCondition.class)
@AutoConfigureAfter({WebEndpointAutoConfiguration.class, RestTemplateAutoConfiguration.class})
@EnableConfigurationProperties({ClientProperties.class, InstanceProperties.class, ServerProperties.class, ManagementServerProperties.class})
public class SpringBootAdminClientAutoConfiguration
启动条件
从 Spring条件注解说明 我们知道,要向完成SpringBootAdminClientAutoConfiguration
的自动配置,需要满足SpringBootAdminClientEnabledCondition
中设置的条件。
到底是哪些条件呢?我们一起来看看SpringBootAdminClientEnabledCondition
的源码:
public class SpringBootAdminClientEnabledCondition extends SpringBootCondition {
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata) {
ClientProperties clientProperties = getClientProperties(context);
// 条件1:spring.boot.admin.client.enabled=true
if (!clientProperties.isEnabled()) {
return ConditionOutcome.noMatch(
"Spring Boot Client is disabled, because 'spring.boot.admin.client.enabled' is false.");
}
// 条件2:spring.boot.admin.client.url不能为空
if (clientProperties.getUrl().length == 0) {
return ConditionOutcome.noMatch(
"Spring Boot Client is disabled, because 'spring.boot.admin.client.url' is empty.");
}
return ConditionOutcome.match();
}
private ClientProperties getClientProperties(ConditionContext context) {
// 创建一个ClientProperties实例
ClientProperties clientProperties = new ClientProperties(context.getEnvironment());
Binder.get(context.getEnvironment()).bind("spring.boot.admin.client", Bindable.ofInstance(clientProperties));
// 将spring.boot.admin.client.* 参数绑定到 ClientProperties实例上
return clientProperties;
}
}
从上面的代码中可以看出,要想启动spring-boot-admin-client
至少需要满足两个条件:
- spring.boot.admin.client.enabled=true
- spring.boot.admin.client.url 不能为空
并且,这里的ClientProperties是new
出来的,而不是通过@Autowire
自动注入的,也就意味着我们不能通过@Bean
来自己注入ClientProperties,而只能在配置文件中配置相关参数。
SpringBootAdminClientAutoConfiguration
metadata
- MetadataContributor:存放
spring-boot-admin-client
应用的一些元数据信息的接口; - StartupDateMetadataContributor:实现了MetadataContributor接口,用于记录系统启动时间;
- CloudFoundryMetadataContributor:实现了MetadataContributor接口,用于记录云平台相关配置参数,包括applicationId和instanceId;
- CompositeMetadataContributor:实现了MetadataContributor接口,用于代理上述两个MetadataContributor实现类,返回其中包含的所有元数据信息。