微服务架构之Spring Boot(七十四)

2022-05-23 15:44:31 浏览数 (1)

53.8健康信息

您可以使用运行状况信息来检查正在运行的应用程序的状态。监视软件经常使用它来在生产系统出现故障时向某人发出警报。health 端点公开

的信息取决于 management.endpoint.health.show-details 属性,该属性可以使用以下值之一进行配置:

名称 描述

never 细节永远不会显示。

when-authorized 详细信息仅向授权用户显示。可以使用 management.endpoint.health.roles 配置授权角色。

always 详细信息显示给所有用户。

默认值为 never 。当用户处于一个或多个端点的角色时,将被视为已获得授权。如果端点没有配置角色(默认值),则认为所有经过身份验证的

用户都已获得授权。可以使用 management.endpoint.health.roles 属性配置角色。

如果您已保护应用程序并希望使用 always ,则您的安全配置必须允许对经过身份验证和未经身份验证的用户访问运行状况终结

点。

健康信息是从a的内容中收集的 (默认情况下, ApplicationContext 中定义的所有 实例。Spring Boot包括一些自动配置

的 HealthIndicators ,您也可以自己编写。默认情况下,最终系统状态由 HealthAggregator 导出,它根据状态的有序列表对每

个 HealthIndicator 的状态进行排序。排序列表中的第一个状态用作整体健康状态。如果没有 HealthIndicator 返回 HealthAggregator 已

知的状态,使用 UNKNOWN 状态。HealthIndicatorRegistry HealthIndicator

HealthIndicatorRegistry 可用于在运行时注册和取消注册健康指示器。

53.8.1自动配置的HealthIndicators

适当时,Spring Boot会自动配置以下 HealthIndicators :

名称 描述

CassandraHealthIndicator 检查Cassandra数据库是否已启动。

CouchbaseHealthIndicator 检查Couchbase群集是否已启动。

DiskSpaceHealthIndicator 检查磁盘空间不足。

DataSourceHealthIndicator 检查是否可以获得与 DataSource 的连接。

ElasticsearchHealthIndicator 检查Elasticsearch集群是否已启动。

InfluxDbHealthIndicator 检查InfluxDB服务器是否已启动。

JmsHealthIndicator 检查JMS代理是否已启动。

MailHealthIndicator 检查邮件服务器是否已启动。

MongoHealthIndicator 检查Mongo数据库是否已启动。

Neo4jHealthIndicator 检查Neo4j服务器是否已启动。

RabbitHealthIndicator 检查Rabbit服务器是否已启动。

RedisHealthIndicator 检查Redis服务器是否已启动。

SolrHealthIndicator 检查Solr服务器是否已启动。

53.8.2编写自定义HealthIndicators

要提供自定义健康信息,您可以注册实现该 HealthIndicator 界面的Spring beans 。您需要提供 health() 方法的实现并返回 Health 响

应。Health 响应应包含状态,并可选择包含要显示的其他详细信息。以下代码显示了一个示例 HealthIndicator 实现:

import org.springframework.boot.actuate.health.Health;

import org.springframework.boot.actuate.health.HealthIndicator;

import org.springframework.stereotype.Component;

@Component

public class MyHealthIndicator implements HealthIndicator {

@Override

public Health health() {

int errorCode = check(); // perform some specific health check

if (errorCode != 0) {

return Health.down().withDetail("Error Code", errorCode).build();

}

return Health.up().build();

}

}

给定 HealthIndicator 的标识符是没有 HealthIndicator 后缀的bean的名称(如果存在)。在前面的示例中,健康信息在名

为 my 的条目中可用。

除了Spring Boot的预定义 Status 类型之外, Health 还可以返回表示新系统状态的自定义 Status 。在这种情况下, HealthAggregator 还

需要提供接口的自定义实现 ,或者必须使用 management.health.status.order 配置属性配置默认实现。

例如,假设在 HealthIndicator 实现之一中使用了代码为 FATAL 的新 Status 。要配置严重性顺序,请将以下属性添加到应用程序属性:

management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP

响应中的HTTP状态代码反映了整体运行状况(例如, UP 映射到200,而 OUT_OF_SERVICE 和 DOWN 映射到503)。如果通过HTTP访问运行状况

端点,则可能还需要注册自定义状态映射。例如,以下属性将 FATAL 映射到503(服务不可用):

management.health.status.http-mapping.FATAL=503

如果您需要更多控制权,可以定义自己的 HealthStatusHttpMapper bean。

下表显示了内置状态的默认状态映射:

状态 制图

DOWN SERVICE_UNAVAILABLE (503)

OUT_OF_SERVICE SERVICE_UNAVAILABLE (503)

UP No mapping by default, so http status is 200

UNKNOWN No mapping by default, so http status is 200

53.8.3反应性健康指标

对于反应性应用程序,例如那些使用Spring WebFlux的应用程序, ReactiveHealthIndicator 提供了一个非阻塞的合同来获取应用程序运行

状况。与传统的 HealthIndicator 类似,健康信息是从a的内容中收集的 (默认情况下,在 ApplicationContext 中定义的所有 和 实例。不

检查反应API的常规 HealthIndicator 是在弹性上执行的调度。ReactiveHealthIndicatorRegistry HealthIndicator

ReactiveHealthIndicator

在响应式应用程序中, ReactiveHealthIndicatorRegistry 可用于在运行时注册和取消注册运行状况指示器。

要从反应式API提供自定义运行状况信息,您可以注册实现该 ReactiveHealthIndicator 接口的Spring beans 。以下代码显示了一个示

例 ReactiveHealthIndicator 实现:

@Component

public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {

@Override

public Mono<Health> health() {

return doHealthCheck() //perform some specific health check that returns a Mono<Health>

.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build())));

}

}

要自动处理错误,请考虑从 AbstractReactiveHealthIndicator 扩展。

53.8.4自动配置的ReactiveHealthIndicators

适当时,Spring Boot会自动配置以下 ReactiveHealthIndicators :

名称 描述

CassandraReactiveHealthIndicator 检查Cassandra数据库是否已启动。

CouchbaseReactiveHealthIndicator 检查Couchbase群集是否已启动。

MongoReactiveHealthIndicator 检查Mongo数据库是否已启动。

RedisReactiveHealthIndicator 检查Redis服务器是否已启动。

必要时,反应指标取代常规指标。此外,任何未明确处理的 HealthIndicator 都会自动换行。

0 人点赞