java健康检查的作用,详解SpringBoot健康检查的实现原理

SpringBoot自动装配的套路,直接看 spring.factories文件,当我们使用的时候只需要引入如下依赖

org.springframework.boot

spring-boot-starter-actuator

然后在 org.springframework.boot.spring-boot-actuator-autoconfigure包下去就可以找到这个文件

自动装配

查看这个文件发现引入了很多的配置类,这里先关注一下 XXXHealthIndicatorAutoConfiguration 系列的类,这里咱们拿第一个 RabbitHealthIndicatorAutoConfiguration 为例来解析一下。看名字就知道这个是RabbitMQ的健康检查的自动配置类

@Configuration

@ConditionalOnClass(RabbitTemplate.class)

@ConditionalOnBean(RabbitTemplate.class)

@ConditionalOnEnabledHealthIndicator("rabbit")

@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)

@AutoConfigureAfter(RabbitAutoConfiguration.class)

public class RabbitHealthIndicatorAutoConfiguration extends

CompositeHealthIndicatorConfiguration {

private final Map rabbitTemplates;

public RabbitHealthIndicatorAutoConfiguration(

Map rabbitTemplates) {

this.rabbitTemplates = rabbitTemplates;

}

@Bean

@ConditionalOnMissingBean(name = "rabbitHealthIndicator")

public HealthIndicator rabbitHealthIndicator() {

return createHealthIndicator(this.rabbitTemplates);

}

}

按照以往的惯例,先解析注解

@ConditionalOnXXX 系列又出现了,前两个就是说如果当前存在 RabbitTemplate 这个bean也就是说我们的项目中使用到了RabbitMQ才能进行下去

@ConditionalOnEnabledHealthIndicator 这个注解很明显是SpringBoot actuator自定义的注解,看一下吧

@Conditional(OnEnabledHealthIndicatorCondition.class)

public @interface ConditionalOnEnabledHealthIndicator {

String value();

}

class OnEnabledHealthIndicatorCondition extends OnEndpointElementCondition {

OnEnabledHealthIndicatorCondition() {

super("management.health.", ConditionalOnEnabledHealthIndicator.class);

}

}

public abstract class OnEndpointElementCondition extends SpringBootCondition {

private final String prefix;

private final Class extends Annotation> annotationType;

protected OnEndpointElementCondition(String prefix,

Class extends Annotation> annotationType) {

this.prefix = prefix;

this.annotationType = annotationType;

}

@Override

public ConditionOutcome getMatchOutcome(ConditionContext context,

AnnotatedTypeMetadata metadata) {

AnnotationAttributes annotationAttributes = AnnotationAttributes

.fromMap(metadata.getAnnotationAttributes(this.annotationType.getName()));

String endpointName = annotationAttributes.getString("value");

ConditionOutcome outcome = getEndpointOutcome

你可能感兴趣的:(java健康检查的作用)