使用Spring Boot实现动态健康检查HealthChecks

18-11-28 banq

import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.HealthIndicatorRegistry;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

/**
 * <pre>
 * {@code 
 * curl -X PUT http://localhost:8080/healthchecks/gugu
 * curl -X PUT http://localhost:8080/healthchecks/gaga
 * 
 * curl http://localhost:8080/actuator/health
 * 
 * curl -X DELETE http://localhost:8080/healthchecks/gaga
 * }
 * </pre>
 */
@RestController
@RequestMapping("healthchecks")
@RequiredArgsConstructor
class HealthController {

    private final HealthIndicatorRegistry registry;

    @PutMapping("/{name}")
    public void addHealthCheck(@PathVariable String name) {
        registry.register(name, new DynamicHealthCheck(name));
    }

    @DeleteMapping("/{name}")
    public void removeHealthCheck(@PathVariable String name) {
        registry.unregister(name);
    }
}

@Slf4j
@RequiredArgsConstructor
class DynamicHealthCheck implements HealthIndicator {

    private final String name;

    @Override
    public Health health() {

        log.info("check health for: {}", name);

        return Health.up().build();
    }

}

application.properties

management.endpoint.health.show-details=ALWAYS