如何让/actuator/health/readiness在ReadinessStateHealthIndicator后执行自定义指标?
解决方案
要实现/actuator/health/readiness端点先执行ReadinessStateHealthIndicator,再执行自定义HealthIndicator,可以通过自定义健康组+执行顺序控制来实现,具体步骤如下:
1. 控制自定义HealthIndicator的执行顺序
给你的自定义HealthIndicator添加@Order注解,设置一个比ReadinessStateHealthIndicator更高的数值(默认ReadinessStateHealthIndicator的@Order为0,自定义检查器用大于0的数值即可确保在它之后执行):
@Component("customReadinessCheck1") @Order(1) public class CustomReadinessCheck1 implements HealthIndicator { @Override public Health health() { // 自定义就绪检查逻辑 return Health.up() .withDetail("custom-check-1", "passed") .build(); } } @Component("customReadinessCheck2") @Order(2) public class CustomReadinessCheck2 implements HealthIndicator { @Override public Health health() { // 另一个自定义就绪检查逻辑 return Health.up() .withDetail("custom-check-2", "passed") .build(); } }
2. 配置自定义健康组并绑定到readiness端点
在application.yml(或application.properties)中定义专属的健康组,指定仅包含readinessState(对应ReadinessStateHealthIndicator)和你的自定义检查器,然后将readiness端点与该组绑定:
spring: actuator: health: # 定义自定义就绪检查组 groups: custom-readiness-group: include: readinessState, customReadinessCheck1, customReadinessCheck2 # 确保ReadinessStateHealthIndicator启用 readiness-state: enabled: true endpoints: web: exposure: include: health endpoint: health: # 将readiness端点绑定到自定义组 groups: readiness: custom-readiness-group
如果使用application.properties,配置如下:
spring.actuator.health.groups.custom-readiness-group.include=readinessState,customReadinessCheck1,customReadinessCheck2 spring.actuator.health.readiness-state.enabled=true spring.actuator.endpoints.web.exposure.include=health spring.actuator.endpoint.health.groups.readiness=custom-readiness-group
3. 验证效果
启动应用后访问/actuator/health/readiness,返回的健康信息会包含readinessState和你自定义的检查器结果,且执行顺序符合@Order的设置。
备选:编程式配置(适合复杂场景)
如果需要更灵活的配置逻辑,可以通过HealthEndpointGroupsCustomizer实现编程式定义健康组:
@Configuration public class HealthGroupConfig { @Bean public HealthEndpointGroupsCustomizer customReadinessGroupCustomizer() { return groups -> { // 构建自定义健康组 HealthGroup readinessGroup = HealthGroup.builder() .include("readinessState", "customReadinessCheck1", "customReadinessCheck2") .build(); // 添加组并绑定到readiness端点 groups.add("custom-readiness-group", readinessGroup); groups.setEndpointGroup("readiness", "custom-readiness-group"); }; } }
内容的提问来源于stack exchange,提问作者CarlosLaw
相关产品推荐
相关产品推荐

