括展actuator health check
方式一:
为了定制 Spring Boot 的 Actuator 来实现你所描述的功能,即在调用自己的 /actuator/health
时,服务端能够自动调用 4 个下游 API 的 /actuator/health
,并将其检查结果与自己的健康状态一起返回,可以按照以下步骤进行操作:
实现思路:
-
创建自定义的
HealthIndicator
:Spring Boot 提供了HealthIndicator
接口,允许你自定义健康检查逻辑。我们可以通过实现该接口来定制对外部 API 的健康检查。 -
集成多个 API 的健康状态:在自定义的
HealthIndicator
实现中,我们可以发起 HTTP 请求调用 4 个下游 API 的健康检查接口,获取它们的健康状态。 -
将各 API 的状态与自身服务的健康状态合并:通过
Health.Builder
将自身服务的健康状态和 4 个下游 API 的健康检查结果合并,返回给调用方。
详细实现步骤:
1. 引入必要的依赖
确保你的 pom.xml
中包含以下依赖项,特别是用于发起 HTTP 请求的 spring-boot-starter-web
和 spring-boot-starter-actuator
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 创建自定义的 HealthIndicator
首先,需要实现 HealthIndicator
接口,用于检查下游 API 的健康状态。可以使用 Spring 的 RestTemplate
来发起 HTTP 请求。
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
public class DownstreamApiHealthIndicator implements HealthIndicator {
private final RestTemplate restTemplate;
public DownstreamApiHealthIndicator(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public Health health() {
// 假设下游 API 的健康检查地址
String[] urls = {
"http://api1/actuator/health",
"http://api2/actuator/health",
"http://api3/actuator/health",
"http://api4/actuator/health"
};
// 构建健康状态
Health.Builder builder = Health.up();
for (String url : urls) {
try {
// 发起 GET 请求获取健康状态
Health response = restTemplate.getForObject(url, Health.class);
if (response != null && response.getStatus().equals(Health.up().getStatus())) {
builder.withDetail(url, "UP");
} else {
builder.withDetail(url, "DOWN");
}
} catch (Exception e) {
// 如果请求失败,认为该服务不可达
builder.withDetail(url, "DOWN").down();
}
}
return builder.build();
}
}
在这里,我们实现了 DownstreamApiHealthIndicator
,用于对 4 个下游 API 进行健康检查,并将结果整合到健康状态中。
3. 创建 RestTemplate
Bean
为了发起 HTTP 请求,需要创建一个 RestTemplate
Bean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4. 将自定义 HealthIndicator
与 Spring Boot 的 /actuator/health
结合
Spring Boot 会自动发现实现了 HealthIndicator
接口的 Bean,并将其集成到 /actuator/health
的响应中。因此,你只需要将自定义的 DownstreamApiHealthIndicator
实现放入 Spring 的上下文中即可。
5. 调整返回健康信息的格式(可选)
如果你想控制健康信息的返回格式,可以通过修改 application.properties
中的配置来实现。比如,可以通过下面的配置展示详细的健康状态信息:
management.endpoint.health.show-details=always
management.endpoint.health.show-components=always
6. 运行结果
当你访问 /actuator/health
时,将会得到如下类似的响应,包含自身服务的健康状态以及 4 个下游 API 的健康状态:
{
"status": "UP",
"details": {
"http://api1/actuator/health": "UP",
"http://api2/actuator/health": "UP",
"http://api3/actuator/health": "DOWN",
"http://api4/actuator/health": "UP"
}
}
这里,status
表示你的服务的整体健康状态,details
部分包含了各下游 API 的健康检查结果。
7. 其他可选配置
如果下游 API 的健康检查比较耗时,或者你想避免同步调用带来的阻塞,可以考虑使用异步调用来并发检查下游服务的状态。你可以使用 CompletableFuture
或者其他异步处理方式来并发发起 HTTP 请求,从而减少整体健康检查的响应时间。
使用 CompletableFuture
实现异步健康检查
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@Component
public class DownstreamApiHealthIndicator implements HealthIndicator {
private final RestTemplate restTemplate;
public DownstreamApiHealthIndicator(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public Health health() {
String[] urls = {
"http://api1/actuator/health",
"http://api2/actuator/health",
"http://api3/actuator/health",
"http://api4/actuator/health"
};
Health.Builder builder = Health.up();
// 异步检查下游 API 的健康状态
CompletableFuture[] futures = new CompletableFuture[urls.length];
for (int i = 0; i < urls.length; i++) {
String url = urls[i];
futures[i] = CompletableFuture.runAsync(() -> {
try {
Health response = restTemplate.getForObject(url, Health.class);
if (response != null && response.getStatus().equals(Health.up().getStatus())) {
builder.withDetail(url, "UP");
} else {
builder.withDetail(url, "DOWN");
}
} catch (Exception e) {
builder.withDetail(url, "DOWN").down();
}
});
}
// 等待所有任务完成
CompletableFuture.allOf(futures).join();
return builder.build();
}
}
通过这种方式,你可以大大减少等待时间,从而提高整体的响应效率。
总结
- 通过实现自定义的
HealthIndicator
,你可以将下游 API 的健康检查集成到自身服务的健康检查中。 - 可以使用
RestTemplate
发起同步或异步的 HTTP 请求,获取下游 API 的健康状态。 - 利用 Spring Boot 的自动发现机制,你的自定义
HealthIndicator
会被自动整合到/actuator/health
的输出中。
方式二:
在 Spring Boot 中,你可以使用 组合多个 HealthIndicator
来执行多个健康检查,并将它们的结果组合起来。Spring Boot 提供了一种方式来组合多个健康检查,叫做 CompositeHealthContributor
。你可以通过实现多个 HealthIndicator
并将它们组合到一个 CompositeHealthContributor
中。
这里是详细步骤和示例代码来展示如何组合多个健康检查:
实现步骤
-
实现多个
HealthIndicator
:首先,你需要为每个要检查的下游 API 或其他资源实现各自的HealthIndicator
。 -
组合多个
HealthIndicator
:通过实现CompositeHealthContributor
,你可以将多个HealthIndicator
组合到一起。 -
整合到 Spring Boot Actuator:Spring Boot 会自动发现
HealthIndicator
和CompositeHealthContributor
,并将它们集成到/actuator/health
。
示例代码
1. 实现多个 HealthIndicator
这里我们创建两个简单的健康检查类,分别检查两个下游 API 的健康状态。
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class DownstreamApi1HealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 这里是对第一个下游 API 的健康检查逻辑
// 假设调用 API 成功就返回 UP,否则返回 DOWN
boolean api1IsUp = checkApi1Health();
if (api1IsUp) {
return Health.up().withDetail("API 1", "Available").build();
} else {
return Health.down().withDetail("API 1", "Unavailable").build();
}
}
private boolean checkApi1Health() {
// 模拟健康检查的逻辑,可以是实际的 HTTP 请求
return true; // 假设 API 1 是可用的
}
}
@Component
public class DownstreamApi2HealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 这里是对第二个下游 API 的健康检查逻辑
boolean api2IsUp = checkApi2Health();
if (api2IsUp) {
return Health.up().withDetail("API 2", "Available").build();
} else {
return Health.down().withDetail("API 2", "Unavailable").build();
}
}
private boolean checkApi2Health() {
// 模拟健康检查的逻辑
return false; // 假设 API 2 是不可用的
}
}
2. 组合多个 HealthIndicator
(使用 CompositeHealthContributor
)
接下来,我们需要将这两个健康检查类组合在一起。CompositeHealthContributor
可以帮助我们组合多个 HealthIndicator
。
import org.springframework.boot.actuate.health.CompositeHealthContributor;
import org.springframework.boot.actuate.health.HealthContributor;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class CompositeHealthConfig {
@Bean
public HealthContributor combinedHealthIndicator(
DownstreamApi1HealthIndicator api1HealthIndicator,
DownstreamApi2HealthIndicator api2HealthIndicator) {
// 将多个 HealthIndicator 放入 Map 中
Map<String, HealthIndicator> indicators = new LinkedHashMap<>();
indicators.put("api1", api1HealthIndicator);
indicators.put("api2", api2HealthIndicator);
// 返回 CompositeHealthContributor 来组合它们
return CompositeHealthContributor.fromMap(indicators);
}
}
CompositeHealthContributor.fromMap()
方法允许你将多个健康检查类组合在一起,并将它们以 Map 的形式注册。Map 的键(例如"api1"
和"api2"
)会出现在/actuator/health
的输出中。
3. 访问 /actuator/health
在启动服务后,访问 /actuator/health
,你将看到组合后的健康状态,类似如下的输出:
{
"status": "DOWN",
"components": {
"api1": {
"status": "UP",
"details": {
"API 1": "Available"
}
},
"api2": {
"status": "DOWN",
"details": {
"API 2": "Unavailable"
}
}
}
}
-
status
显示的是组合后的状态。因为其中一个下游 API (api2
) 是DOWN
,所以整体的状态是DOWN
。 -
components
中列出了各个健康检查类的具体状态。
总结
- 你可以通过
CompositeHealthContributor
组合多个健康检查类(HealthIndicator
),从而在/actuator/health
中展示多个下游 API 或其他资源的健康状况。 - Spring Boot 会自动合并所有
HealthIndicator
和CompositeHealthContributor
,并将结果整合到健康检查的输出中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了