Spring

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至少需要满足两个条件:

并且,这里的ClientProperties是new出来的,而不是通过@Autowire自动注入的,也就意味着我们不能通过@Bean来自己注入ClientProperties,而只能在配置文件中配置相关参数。

SpringBootAdminClientAutoConfiguration

metadata

ApplicationFactory

ApplicationRegistrator

RegistrationApplicationListener

上一篇 下一篇

猜你喜欢

热点阅读