Spring Boot启动时如何校验Actuator健康组配置的全部HealthIndicator是否可用
解决方案
方案1:自定义启动校验逻辑(推荐,兼容性强)
在Spring上下文完全刷新完成后,对比健康组配置的指标列表和实际注册到上下文的健康指标列表,发现配置了不存在的指标直接抛出异常终止启动,从源头避免无效配置上线。
具体实现步骤:
- 注入
HealthEndpointGroups和HealthContributorRegistry两个核心Bean:HealthEndpointGroups可以拿到所有配置完成的健康组的最终成员列表,HealthContributorRegistry可以拿到所有已经成功注册到上下文的健康指标名称。 - 实现
ApplicationListener<ContextRefreshedEvent>监听上下文刷新完成事件,保证所有健康指标Bean都已经注册完成后再执行校验。 - 遍历每个健康组的成员,和已注册的指标名称做比对,存在缺失的指标直接抛出异常终止启动。
代码示例:
import org.springframework.boot.actuate.health.HealthContributorRegistry; import org.springframework.boot.actuate.health.HealthEndpointGroups; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import java.util.Set; import java.util.stream.Collectors; @Component public class HealthGroupConfigValidator implements ApplicationListener<ContextRefreshedEvent> { private final HealthEndpointGroups healthEndpointGroups; private final HealthContributorRegistry healthContributorRegistry; public HealthGroupConfigValidator(HealthEndpointGroups healthEndpointGroups, HealthContributorRegistry healthContributorRegistry) { this.healthEndpointGroups = healthEndpointGroups; this.healthContributorRegistry = healthContributorRegistry; } @Override public void onApplicationEvent(ContextRefreshedEvent event) { // 拉取所有已注册的一级健康指标名称 Set<String> registeredContributors = healthContributorRegistry.stream() .map(namedContributor -> namedContributor.getName()) .collect(Collectors.toSet()); // 遍历所有健康组做校验 healthEndpointGroups.forEach(group -> { Set<String> configuredMembers = group.getMembers(); // 筛选出配置了但未实际注册的指标 Set<String> missingContributors = configuredMembers.stream() .filter(member -> !registeredContributors.contains(member)) .collect(Collectors.toSet()); if (!missingContributors.isEmpty()) { throw new IllegalArgumentException(String.format("健康组[%s]配置了不存在的健康指标: %s", group.getName(), missingContributors)); } }); } }
如果业务中使用了嵌套的复合健康指标,只需要在拉取已注册指标时增加递归逻辑,拆分CompositeHealthContributor的子指标纳入校验范围即可。
方案2:替换Actuator默认的HealthEndpointSupport实现
如果要从根源修改默认跳过不存在指标的逻辑,可以自定义HealthEndpointSupport的实现类替换默认Bean,将遍历逻辑修改为优先遍历健康组配置的成员,再从注册中心查找对应的指标,找不到直接抛出异常。该方案和Spring Boot版本强绑定,升级版本时需要做适配,非特殊场景不推荐使用。
内容的提问来源于stack exchange,提问作者Akvel
相关产品推荐
相关产品推荐

