Endpoints
Actuator 端点让您监控和交互您的应用程序。Spring Boot 包含许多内置端点,并让您可以添加您自己的端点。例如,health 端点提供基本的应用程序健康状况信息。
您可以 enable or disable 每个单独的端点和 expose them (make them remotely accessible) over HTTP or JMX。当端点既启用又能公开时,它将被视为可用。内置端点仅在可用时才自动配置。大多数应用程序选择公开 HTTP,其中端点的 ID 和 /actuator 的前缀被映射到 URL。例如,默认情况下,health 端点被映射到 /actuator/health。
|
若要了解有关 Actuator 的端点及其请求和响应格式的更多信息,请参阅 API documentation。 |
以下技术不可知端点可用:
| ID | Description |
|---|---|
|
公开当前应用程序的审计事件信息。需要一个 |
|
显示应用程序中所有 Spring bean 的完整列表。 |
|
Exposes available caches. |
|
显示在配置和自动配置类上评估的条件,以及他们匹配或不匹配的原因。 |
|
显示所有 |
|
公开 Spring 的 |
|
显示已应用的任何 Flyway 数据库迁移。需要一个或多个 |
|
Shows application health information. |
|
显示 HTTP 交换信息(默认情况下,最近 100 次 HTTP 请求响应交换)。需要 |
|
Displays arbitrary application info. |
|
显示 Spring 集成图。需要依赖 |
|
显示和修改应用程序中记录器的配置。 |
|
显示已应用的任何 Liquibase 数据库迁移。需要一个或多个 |
|
显示当前应用程序的 “metrics” 信息。 |
|
显示所有 |
|
显示有关 Quartz 调度程序作业的信息。受 sanitization 控制。 |
|
显示应用程序中安排的任务。 |
|
允许从 Spring Session 支持的会话存储检索和删除用户会话。需要 servlet 为基础的 Web 应用程序,该应用程序使用 Spring Session。 |
|
让应用程序正常关机。仅在使用 jar 打包时起作用。默认情况下禁用。 |
|
显示 |
|
Performs a thread dump. |
如果您的应用程序是 Web 应用程序(Spring MVC、Spring WebFlux 或 Jersey),则可以使用以下附加端点:
| ID | Description |
|---|---|
|
返回一个堆转储文件。在 HotSpot JVM 上,返回 |
|
返回日志文件内容(如果 |
|
以 Prometheus 服务器可以抓取的格式公开指标。需要依赖 |
Enabling Endpoints
在默认情况下,除“@1”之外的所有端点都会启用。要配置端点的启用状态,可以使用“@2”属性。以下示例启用“@3”端点:
management:
endpoint:
shutdown:
enabled: true
如果您更喜欢先注销再启用端点,而不是先启用再注销,请将“configprop:management.endpoints.enabled-by-default[]”属性设置为“@4”,然后使用单个端点“@5”属性重新启用。以下示例启用“@6”端点并禁用所有其他端点:
management:
endpoints:
enabled-by-default: false
endpoint:
info:
enabled: true
|
禁用的端点会从应用程序上下文中完全移除。如果您只想更改端点的公开技术,请使用“@9”。 |
Exposing Endpoints
在默认情况下,只有状态端点公开在 HTTP 和 JMX 中,由于端点可能包含敏感信息,因此您是否公开它们时应仔细考虑。
要更改公开哪些端点,请使用以下特定于技术的“@10”和“@11”属性:
| Property | Default |
|---|---|
configprop:management.endpoints.jmx.exposure.exclude[] |
|
configprop:management.endpoints.jmx.exposure.include[] |
|
configprop:management.endpoints.web.exposure.exclude[] |
|
configprop:management.endpoints.web.exposure.include[] |
|
“@12”属性列出公开的端点的 ID。"@13" 属性列出不应该公开的端点的 ID。"“@14”属性优先于“@15”属性。您可以使用端点 ID 清单配置“@16”属性和“@17”属性。
例如,要只在 JMX 中公开“@18”和“@19”端点,请使用以下属性:
management:
endpoints:
jmx:
exposure:
include: "health,info"
“@20”可用于选择所有端点。例如,要在 HTTP 中公开除了“@21”和“@22”端点之外的所有内容,请使用以下属性:
management:
endpoints:
web:
exposure:
include: "*"
exclude: "env,beans"
|
“@23”在 YAML 中有特殊含义,因此如果您要包含(或排除)所有端点,请务必添加引号。 |
|
如果您的应用程序公开,我们强烈建议您也“@24”。 |
|
如果您要实施端点公开的自定义策略,则可以注册一个“@25”bean。 |
Security
出于安全目的,只有“@26”端点在默认情况下公开在 HTTP 中。您可以使用“configprop:management.endpoints.web.exposure.include[]”属性配置公开的端点。
|
在设置“@27”之前,请确保公开的致动器不包含敏感信息,并受到防火墙或 Spring 安全性等保护。 |
如果 Spring 安全性在类路径上,并且不存在其他“@28”bean,那么除了“@29”之外的所有致动器都受 Spring Boot 自动配置保护。如果您定义一个自定义“@30”bean,Spring Boot 自动配置会退场,让您完全控制致动器访问规则。
如果您希望配置 HTTP 端点的自定义安全性(例如,只允许具有特定角色的用户访问它们),Spring Boot 提供了一些便捷的“@31”对象,可以将其与 Spring 安全性结合使用。
典型的 Spring 安全配置可能如下例所示:
前一个示例使用“@32”匹配对任何端点的请求,然后确保所有端点都具有“@33”角色。在“@34”上还有其他一些匹配器方法可用。有关详细信息,请参见“@35”。
如果您在防火墙后面部署应用程序,那么您可能更喜欢在无需身份验证的情况下访问所有致动器端点。您可以通过以下方式来更改“configprop:management.endpoints.web.exposure.include[]”属性:
management:
endpoints:
web:
exposure:
include: "*"
此外,如果存在 Spring Security,你需要添加自定义安全配置,以允许未经身份验证的用户访问端点,如下例所示:
|
在这两个前面的示例中,配置仅适用于 actuator 端点。由于 Spring Boot 的安全配置在存在任何 bean 的情况下完全退出,因此你需要用适用于应用程序其余部分的规则配置一个额外的 bean。 |
Cross Site Request Forgery Protection
由于 Spring Boot 依赖于 Spring Security 的默认设置,因此 CSRF 保护默认启用。这意味着,在使用默认安全配置时,需要 @XXX (关闭和记录器端点)、@YYY 或 @ZZZ 的 actuator 端点会收到 403(禁止)错误。
|
我们仅在你创建由非浏览器客户端使用的服务时才建议完全禁用 CSRF 保护。 |
你可以在 Spring Security 参考指南中找到有关 CSRF 保护的更多信息:{url-spring-security-docs}/features/exploits/csrf.html。
Configuring Endpoints
端点会自动缓存对不采用任何参数的读取操作的响应。若要配置端点缓存响应的时间,请使用其 @PPP 属性。以下示例将 @QQQ 端点的缓存生存时间设置为 10 秒:
management:
endpoint:
beans:
cache:
time-to-live: "10s"
|
@RRR 前缀唯一标识要配置的端点。 |
Sanitize Sensitive Values
@SSS、@TTT 和 @UUU 端点返回的信息可能很敏感,因此默认情况下,这些值总会被完全清理(替换为 @VVV)。
只有在以下情况下才能以未经清理的形式查看值:
-
@WWW 属性已被设为非 @XXX
-
没有应用自定义 @YYY bean
可以为可清理端点配置 @ZZZ 属性,将其设为以下值之一:
-
@AAA - 值总会被完全清理(替换为 @BBB)
-
@CCC - 所有用户均可看到值(只要没有应用 @DDD bean)
-
@EEE - 只有授权用户才能看到值(只要没有应用 @FFF bean)
对于 HTTP 端点,如果用户经过身份验证并具有由端点的角色属性配置的角色权限,则该用户会被视为已授权。默认情况下,任何经过身份验证的用户都获得授权。
对于 JMX 端点,所有用户始终获得授权。
以下示例允许具有 @GGG 角色的所有用户以原始形式查看来自 @HHH 端点的值。未经授权的用户或不具备 @III 角色的用户,只能看到已清理的值。
management:
endpoint:
env:
show-values: WHEN_AUTHORIZED
roles: "admin"
|
此示例假设未定义任何 |
Hypermedia for Actuator Web Endpoints
通过链接到所有端点添加了一个 “discovery page”。“discovery page” 默认情况下在 /actuator 中提供。
要禁用 “discovery page”,将以下属性添加到应用程序属性中:
management:
endpoints:
web:
discovery:
enabled: false
配置自定义管理上下文路径后,“discovery page” 会自动从 /actuator 移动到管理上下文的根目录。例如,如果管理上下文路径为 /management,则可以通过 /management 访问发现页面。当管理上下文路径设置为 / 时,将禁用发现页面,以防止发生与其他映射冲突的可能性。
CORS Support
Cross-origin resource sharing (CORS) 是一种 W3C specification,允许您灵活指定允许哪种跨域请求类型。如果您使用 Spring MVC 或 Spring WebFlux,则可以配置 Actuator 的 Web 端点来支持此类情况。
CORS 支持默认禁用,仅在您设置 configprop:management.endpoints.web.cors.allowed-origins[] 属性后才会启用。以下配置允许来自 example.com 域的 GET 和 POST 调用:
management:
endpoints:
web:
cors:
allowed-origins: "https://example.com"
allowed-methods: "GET,POST"
|
请参见 {code-spring-boot-actuator-autoconfigure-src}/endpoint/web/CorsEndpointProperties.java[ |
Implementing Custom Endpoints
如果您添加了带 @Endpoint 注释的 @Bean,则带 @ReadOperation、@WriteOperation 或 @DeleteOperation 注释的任何方法都会自动通过 JMX 公开,并且在 Web 应用程序中也会通过 HTTP 公开。端点可以使用 Jersey、Spring MVC 或 Spring WebFlux 通过 HTTP 公开。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。
以下示例公开了一个读取操作,其返回一个自定义对象:
您还可以使用 @JmxEndpoint 或 @WebEndpoint 编写特定于技术的端点。这些端点仅限于它们各自的技术。例如,@WebEndpoint 仅通过 HTTP 公开,而不会通过 JMX 公开。
您可以使用 @EndpointWebExtension 和 @EndpointJmxExtension 编写特定于技术的扩展。这些注释允许您提供特定于技术的操作来增强现有端点。
最后,如果您需要访问特定于 Web 框架的功能,您可以实现 servlet 或者 Spring @Controller 和 @RestController 端点,其缺点是它们无法通过 JMX 访问,或者在使用不同的 Web 框架时无法访问。
Receiving Input
端点上的操作通过其参数接收输入。当通过 Web 公开时,这些参数的值取自 URL 的查询参数和 JSON 请求正文。当通过 JMX 公开时,参数映射到 MBean 的操作参数。默认情况下,参数是必需的。通过使用 @javax.annotation.Nullable 或 @org.springframework.lang.Nullable 注释它们,可以使它们变为可选的。
您可以将 JSON 请求正文中的每个根属性映射到端点的参数。请考虑以下 JSON 请求正文:
{
"name": "test",
"counter": 42
}
您可以使用此文档调用一个写入操作,它采用 String name 和 int counter 参数,如下例所示:
|
由于端点与技术无关,因此仅能指定简单类型作为方法签名。特别是,不支持声明具有一个参数(其 |
|
为了让输入映射到操作方法的参数,实现端点的 Java 代码应使用 |
Custom Web Endpoints
对 @Endpoint、@WebEndpoint 或 @EndpointWebExtension 的操作会自动通过 Jersey、Spring MVC 或 Spring WebFlux 暴露到 HTTP 中。如果 Jersey 和 Spring MVC 都可用,则使用 Spring MVC。
Path
谓词的路径由端点的 ID 和公开在 Web 上的端点的基本路径决定。默认基本路径是 /actuator。例如,具有 ID 为 sessions 的端点使用 /actuator/sessions 作为其在谓词中的路径。
可以通过使用 @Selector 对操作方法的一个或多个参数进行注释来进一步自定义路径。这样的参数作为路径变量添加到路径谓词中。在调用端点操作时,变量的值会传递到操作方法中。如果你想捕获所有剩余路径元素,则可以将 @Selector(Match=ALL_REMAINING) 添加到最后一个参数,并使其成为与 String[] 转换兼容的类型。
HTTP method
谓词的 HTTP 方法由操作类型决定,如下表所示:
| Operation | HTTP method |
|---|---|
|
|
|
|
|
|
Consumes
对于使用请求正文的 @WriteOperation (HTTP POST),谓词的 consumes 条款是 application/vnd.spring-boot.actuator.v2+json, application/json。对于所有其他操作,consumes 条款为空。
Produces
谓词的 produces 条款可以通过 @DeleteOperation、@ReadOperation 和 @WriteOperation 注释的 produces 属性来确定。该属性是可选的。如果未使用,则 produces 条款会自动确定。
如果操作方法返回 void 或 Void,则 produces 条款为空。如果操作方法返回 org.springframework.core.io.Resource,则 produces 条款是 application/octet-stream。对于所有其他操作,produces 条款是 application/vnd.spring-boot.actuator.v2+json, application/json。
Web Endpoint Response Status
端点操作的默认响应状态取决于操作类型(读取、写入或删除)以及操作返回内容(如果有)。
如果 @ReadOperation 返回一个值,则响应状态将是 200(确定)。如果它没有返回值,则响应状态将是 404(找不到)。
如果 @WriteOperation 或 @DeleteOperation 返回一个值,则响应状态将是 200(确定)。如果它没有返回值,则响应状态将是 204(无内容)。
如果在没有必需参数或参数无法转换到必需类型的情况下调用了操作,则不会调用操作方法,并且响应状态将是 400(错误的请求)。
Health Information
你可以使用健康信息来检查正在运行的应用程序的状态。它经常由监控软件使用,以便在生产系统出现故障时提醒某人。由 health 端点公开的信息取决于 configprop:management.endpoint.health.show-details[] 和 configprop:management.endpoint.health.show-components[] 属性,它们可以配置为以下值之一:
| Name | Description |
|---|---|
|
Details are never shown. |
|
详细信息仅显示给授权用户。可以使用 |
|
详细信息对所有用户均可见。 |
默认值是 never。当用户属于端点的某个角色或多个角色时,被视为已授权。如果端点没有配置角色(这是默认值),则所有已验证用户都视为已授权。你可以使用 configprop: management. endpoint.health.roles[] 属性来配置角色。
|
如果你已经保护了应用程序并希望使用 |
运行状况信息从 {code-spring-boot-actuator-src}/health/HealthContributorRegistry.java[HealthContributorRegistry](默认情况下,所有在你的 ApplicationContext 中定义的 {code-spring-boot-actuator-src}/health/HealthContributor.java[HealthContributor] 实例)的内容中收集。Spring Boot 包含众多自动配置的 HealthContributors,你也可以编写你自己的 HealthContributors。
HealthContributor 可以是 HealthIndicator 或 CompositeHealthContributor。HealthIndicator 提供实际的运行状况信息,包括 Status。CompositeHealthContributor 提供其他 HealthContributors 的混合。贡献者共同形成树结构来代表整个系统的运行状况。
默认情况下,最终系统运行状况是由 StatusAggregator`派生的,该 `StatusAggregator 根据已排序的状态列表对来自每个 HealthIndicator 的状态进行分类。分类列表中的第一个状态用作整体运行状况状态。如果没有任何 HealthIndicator 返回 StatusAggregator 已知的状态,则使用 UNKNOWN 状态。
|
你可以使用 |
Auto-configured HealthIndicators
如合适,Spring Boot 会自动配置下表中列出的 HealthIndicators。你还可以通过使用下表中列出的 key 配置 management.health.key.enabled,从而启用或禁用选定的指标:
| Key | Name | Description |
|---|---|---|
|
{code-spring-boot-actuator-src}/cassandra/CassandraDriverHealthIndicator.java[ |
检查 Cassandra 数据库是否正常运行。 |
|
{code-spring-boot-actuator-src}/couchbase/CouchbaseHealthIndicator.java[ |
检查 Couchbase 集群是否正常运行。 |
|
{code-spring-boot-actuator-src}/jdbc/DataSourceHealthIndicator.java[ |
检查是否可以获取与 |
|
{code-spring-boot-actuator-src}/system/DiskSpaceHealthIndicator.java[ |
检查磁盘空间是否不足。 |
|
{code-spring-boot-actuator-src}/elasticsearch/ElasticsearchRestClientHealthIndicator.java[ |
检查 Elasticsearch 集群是否正常运行。 |
|
{code-spring-boot-actuator-src}/hazelcast/HazelcastHealthIndicator.java[ |
检查 Hazelcast 服务器是否正常运行。 |
|
{code-spring-boot-actuator-src}/influx/InfluxDbHealthIndicator.java[ |
检查 InfluxDB 服务器是否正常运行。 |
|
{code-spring-boot-actuator-src}/jms/JmsHealthIndicator.java[ |
检查 JMS 代理是否正常运行。 |
|
{code-spring-boot-actuator-src}/ldap/LdapHealthIndicator.java[ |
检查 LDAP 服务器是否正常运行。 |
|
{code-spring-boot-actuator-src}/mail/MailHealthIndicator.java[ |
检查邮件服务器是否正常运行。 |
|
{code-spring-boot-actuator-src}/data/mongo/MongoHealthIndicator.java[ |
检查 Mongo 数据库是否正在运行。 |
|
{code-spring-boot-actuator-src}/neo4j/Neo4jHealthIndicator.java[ |
检查 Neo4j 数据库是否正在运行。 |
|
{code-spring-boot-actuator-src}/health/PingHealthIndicator.java[ |
Always responds with |
|
{code-spring-boot-actuator-src}/amqp/RabbitHealthIndicator.java[ |
检查 Rabbit 服务器是否正在运行。 |
|
{code-spring-boot-actuator-src}/data/redis/RedisHealthIndicator.java[ |
检查 Redis 服务器是否正在运行。 |
|
可以通过设置 configprop:management.health.defaults.enabled[] 属性来禁用它们。 |
其他 HealthIndicators 是可用的,但默认情况下未启用:
| Key | Name | Description |
|---|---|---|
|
{code-spring-boot-actuator-src}/availability/LivenessStateHealthIndicator.java[ |
公开 “Liveness” 应用程序可用性状态。 |
|
{code-spring-boot-actuator-src}/availability/ReadinessStateHealthIndicator.java[ |
公开 “Readiness” 应用程序可用性状态。 |
Writing Custom HealthIndicators
要提供自定义健康信息,可以注册实现 {code-spring-boot-actuator-src}/health/HealthIndicator.java[HealthIndicator] 接口的 Spring bean。您需要提供 health() 方法的实现并返回 Health 响应。Health 响应应包括一个状态,并且可以包含可选的要显示的附加详细信息。以下代码显示一个 HealthIndicator 实现示例:
|
给定 |
|
健康指示器通常通过 HTTP 调用,并且需要在任何连接超时之前做出响应。Spring Boot 会针对任何响应时间超过 10 秒的健康指示器记录警告消息。如果要配置此阀值,可以使用 configprop:management.endpoint.health.logging.slow-indicator-threshold[] 属性。 |
除了 Spring Boot 预定义的 {code-spring-boot-actuator-src}/health/Status.java[Status] 类型,Health 还可以返回表示新系统状态的自定义 Status。在这种情况下,还需要提供 {code-spring-boot-actuator-src}/health/StatusAggregator.java[StatusAggregator] 接口的自定义实现,或者必须使用 configprop:management.endpoint.health.status.order[] 配置属性来配置默认实现。
例如,假设一个新的 Status 在您的其中一个 HealthIndicator 实现中使用,其代码为 FATAL。要配置严重性顺序,请将以下属性添加到您的应用程序属性:
management:
endpoint:
health:
status:
order: "fatal,down,out-of-service,unknown,up"
响应中的 HTTP 状态代码反映了整体健康状况。默认情况下,OUT_OF_SERVICE 和 DOWN 映射到 503。任何未映射的健康状态,包括 UP,都映射到 200。您可能还想通过 HTTP 访问健康端点时注册自定义状态映射。配置自定义映射会禁用 DOWN 和 OUT_OF_SERVICE 的默认映射。要保留默认映射,必须显式配置它们,以及任何自定义映射。例如,以下属性将 FATAL 映射到 503(服务不可用),并保留 DOWN 和 OUT_OF_SERVICE 的默认映射:
management:
endpoint:
health:
status:
http-mapping:
down: 503
fatal: 503
out-of-service: 503
|
如果您需要更多控制,可以定义自己的 |
下表显示了内置状态的默认状态映射:
| Status | Mapping |
|---|---|
|
|
|
|
|
默认情况下没有映射,因此 HTTP 状态是 |
|
默认情况下没有映射,因此 HTTP 状态是 |
Reactive Health Indicators
对于响应应用程序,例如使用 Spring WebFlux 的应用程序,ReactiveHealthContributor 提供了一个非阻塞合约来获取应用程序的健康状况。类似于传统 HealthContributor,健康信息是从 {code-spring-boot-actuator-src}/health/ReactiveHealthContributorRegistry.java[ReactiveHealthContributorRegistry] (默认情况下,所有 {code-spring-boot-actuator-src}/health/HealthContributor.java[HealthContributor] 和 {code-spring-boot-actuator-src}/health/ReactiveHealthContributor.java[ReactiveHealthContributor] 实例均在您的 ApplicationContext 中定义)的内容中收集的。针对非响应式 API 进行检查的常规 HealthContributors 在弹性调度程序上执行。
|
在反应式应用程序中,你应该使用 |
要从反应式 API 提供自定义健康信息,你可以注册实现 {code-spring-boot-actuator-src}/health/ReactiveHealthIndicator.java[ReactiveHealthIndicator] 接口的 Spring bean。下面的代码展示了一个示例 ReactiveHealthIndicator 实现:
|
为了自动处理错误,考虑从 |
Auto-configured ReactiveHealthIndicators
当合适时,Spring Boot 会自动配置以下 ReactiveHealthIndicators:
| Key | Name | Description |
|---|---|---|
|
{code-spring-boot-actuator-src}/cassandra/CassandraDriverReactiveHealthIndicator.java[ |
检查 Cassandra 数据库是否正常运行。 |
|
{code-spring-boot-actuator-src}/couchbase/CouchbaseReactiveHealthIndicator.java[ |
检查 Couchbase 集群是否正常运行。 |
|
{code-spring-boot-actuator-src}/data/elasticsearch/ElasticsearchReactiveHealthIndicator.java[ |
检查 Elasticsearch 集群是否正常运行。 |
|
{code-spring-boot-actuator-src}/data/mongo/MongoReactiveHealthIndicator.java[ |
检查 Mongo 数据库是否正在运行。 |
|
{code-spring-boot-actuator-src}/neo4j/Neo4jReactiveHealthIndicator.java[ |
检查 Neo4j 数据库是否正在运行。 |
|
{code-spring-boot-actuator-src}/data/redis/RedisReactiveHealthIndicator.java[ |
检查 Redis 服务器是否正在运行。 |
|
在必要时,反应式指标会替换常规指标。此外,任何没有明确处理的 |
Health Groups
有时候,将健康指标整理成可用于不同用途的分组很有用。
要创建一个健康指标分组,你可以使用 management.endpoint.health.group.<name> 属性,并为 include 或 exclude 指定一个健康指标 ID 列表。例如,为了创建一个仅包含数据库指标的分组,你可以定义以下内容:
management:
endpoint:
health:
group:
custom:
include: "db"
然后,你可以通过点击 http://localhost:8080/actuator/health/custom 来查看结果。
类似地,为了创建一个将数据库指标从分组中排除、同时包含所有其他指标的分组,你可以定义以下内容:
management:
endpoint:
health:
group:
custom:
exclude: "db"
默认情况下,如果一个健康分组包含或排除了不存在的健康指标,启动将会失败。要禁用此行为,将 configprop:management.endpoint.health.validate-group-membership[] 设置为 false。
默认情况下,组会继承与系统健康相同的 StatusAggregator 和 HttpCodeStatusMapper 设置。不过,你也可以在组级别上定义这些设置。你还可以根据需要覆盖 show-details 和 roles 属性:
management:
endpoint:
health:
group:
custom:
show-details: "when-authorized"
roles: "admin"
status:
order: "fatal,up"
http-mapping:
fatal: 500
out-of-service: 500
|
如果你需要为分组注册自定义 |
一个健康分组还可以包含/排除一个 CompositeHealthContributor。你还可以仅包含/排除 CompositeHealthContributor 的某个组件。这可以通过使用组件的全限定名称来实现,如下所示:
management.endpoint.health.group.custom.include="test/primary"
management.endpoint.health.group.custom.exclude="test/primary/b"
在上述示例中,custom 分组将包含名称为 primary 的 HealthContributor,它是一个复合 test 的组件。这里,primary 本身是一个复合体,并且名称为 b 的 HealthContributor 将从 custom 组中排除。
健康组可以使用主端口或管理端口上的额外路径。这在云环境中很有用,例如 Kubernetes,其中出于安全目的,通常为执行器端点使用单独的管理端口。由于主应用程序即使健康检查成功,也可能无法正常工作,拥有一个单独的端口可能会导致不可靠的健康检查。健康组可以通过以下方式配置额外路径:
management.endpoint.health.group.live.additional-path="server:/healthz"
这将使 live 健康组在 /healthz 处的主服务器端口上可用。前缀是必需的,它必须是 server:(代表主服务器端口)或 management:(代表管理端口(如果已配置))中的一个。路径必须是一个单一的路径部分。
Kubernetes Probes
部署在 Kubernetes 上的应用程序可以使用 Container Probes 提供其内部状态的信息。根据 your Kubernetes configuration,kubelet 会调用那些探测并对结果做出反应。
默认情况下,Spring Boot 会管理你的 Application Availability State。如果部署在 Kubernetes 环境中,执行器会从 ApplicationAvailability 接口中收集 “Liveness” 和 “Readiness” 信息,然后使用这些信息在专用 health indicators 中: LivenessStateHealthIndicator 和 ReadinessStateHealthIndicator。这些指标显示在全局健康端点 ("/actuator/health") 上。它们还通过使用 health groups: "/actuator/health/liveness" 和 "/actuator/health/readiness" 公开为单独的 HTTP 探测。
然后,你可以使用以下端点信息配置你的 Kubernetes 基础设施:
livenessProbe:
httpGet:
path: "/actuator/health/liveness"
port: <actuator-port>
failureThreshold: ...
periodSeconds: ...
readinessProbe:
httpGet:
path: "/actuator/health/readiness"
port: <actuator-port>
failureThreshold: ...
periodSeconds: ...
|
|
这些健康组仅在你应用程序 runs in a Kubernetes environment 时才会自动启用。你可以通过使用 configprop:management.endpoint.health.probes.enabled[] 配置属性在任何环境中启用它们。
|
如果应用程序启动的时间比配置的活跃时间段长,Kubernetes 会将 |
如果你的执行器端点部署在单独的管理上下文中,则这些端点不会与主应用程序使用相同的 Web 基础设施(端口、连接池、框架组件)。在这种情况下,即使主应用程序无法正常工作(例如,它无法接受新连接),探测检查也可能会成功。因此,最好在主服务器端口上启用 liveness 和 readiness 健康组。这可以通过设置以下属性来完成:
management.endpoint.health.probes.add-additional-paths=true
这将在主服务器端口上将 liveness 组设为可用于 /livez,将 readiness 组设为可用于 /readyz。路径可以使用每个组上的 additional-path 属性来自定义,请参阅 health groups 了解详情。
Checking External State With Kubernetes Probes
执行器将 “liveness” 和 “readiness” 探测配置为健康组。这意味着所有的 health groups features 都对它们可用。例如,你可以配置其他健康指标:
management:
endpoint:
health:
group:
readiness:
include: "readinessState,customCheck"
默认情况下,Spring Boot 不会将其他健康指标添加到这些组中。
“liveness” 探测不应依赖于外部系统的运行状况检查。如果 liveness state of an application 已中断,Kubernetes 会通过重新启动应用程序实例来尝试解决该问题。这意味着,如果外部系统(例如数据库、Web API 或外部缓存)发生故障,Kubernetes 可能会重新启动所有应用程序实例并创建级联故障。
至于 “readiness” 探测,检查外部系统的选择必须由应用程序开发人员仔细做出。因此,Spring Boot 不会在准备就绪探测中包括任何其他运行状况检查。如果 readiness state of an application instance 未准备好,Kubernetes 不会将流量路由到该实例。某些外部系统可能不会被应用程序实例共享,在这种情况下,它们可以包含在准备就绪探测中。其他外部系统可能对应用程序不必要(应用程序可能有断路器和后备选项),在这种情况下,绝对不应包含这些外部系统。不幸的是,所有应用程序实例共享的外部系统很常见,你必须做出判断:将其包含在准备就绪探测中并希望在外部服务关闭时将应用程序排除在外或将其排除在外并处理堆栈中更高的故障,也许通过在调用方中使用断路器。
|
如果应用程序的所有实例都未准备就绪,则带 |
此外,如果应用程序使用 Kubernetes autoscaling,它对从负载平衡器中移除应用程序的反应可能不同,具体取决于其自动伸缩器配置。
Application Lifecycle and Probe States
Kubernetes 探测支持的一个重要方面是它与应用程序生命周期的协调一致。AvailabilityState (也就是应用程序的内存内部状态)与实际探测(公开该状态)之间有显着差别。根据应用程序生命周期的阶段,该探测可能不可用。
Spring Boot 会发布 application events during startup and shutdown,并且探测可以监听此类事件并公开 AvailabilityState 信息。
下表显示了 AvailabilityState 和 HTTP 连接器在不同阶段的状态。
Spring Boot 应用程序启动时:
| Startup phase | LivenessState | ReadinessState | HTTP server | Notes |
|---|---|---|---|---|
Starting |
|
|
Not started |
Kubernetes 会检查“活跃状况”探测,如果该探测时间过长,会重新启动应用程序。 |
Started |
|
|
Refuses requests |
应用程序上下文得到刷新。应用程序执行启动任务,但尚未接收流量。 |
Ready |
|
|
Accepts requests |
启动任务已完成。应用程序正在接收流量。 |
Spring Boot 应用程序关闭时:
| Shutdown phase | Liveness State | Readiness State | HTTP server | Notes |
|---|---|---|---|---|
Running |
|
|
Accepts requests |
Shutdown has been requested. |
Graceful shutdown |
|
|
New requests are rejected |
|
Shutdown complete |
N/A |
N/A |
Server is shut down |
应用程序上下文关闭且应用程序已关闭。 |
|
请参阅 Kubernetes container lifecycle section 了解更多有关 Kubernetes 部署的信息。 |
Application Information
应用程序信息公开从所有 {code-spring-boot-actuator-src}/info/InfoContributor.java[InfoContributor] bean(已在 ApplicationContext 中定义)收集的各种信息。Spring Boot 包含多个自动配置的 InfoContributor bean,您也可以编写自己的。
Auto-configured InfoContributors
在适当的时候,Spring 将自动配置以下 InfoContributor bean:
| ID | Name | Description | Prerequisites |
|---|---|---|---|
|
{code-spring-boot-actuator-src}/info/BuildInfoContributor.java[ |
Exposes build information. |
A |
|
{code-spring-boot-actuator-src}/info/EnvironmentInfoContributor.java[ |
公开名称以 |
None. |
|
{code-spring-boot-actuator-src}/info/GitInfoContributor.java[ |
Exposes git information. |
A |
|
{code-spring-boot-actuator-src}/info/JavaInfoContributor.java[ |
Exposes Java runtime information. |
None. |
|
{code-spring-boot-actuator-src}/info/OsInfoContributor.java[ |
Exposes Operating System information. |
None. |
|
{code-spring-boot-actuator-src}/info/ProcessInfoContributor.java[ |
Exposes process information. |
None. |
单独分发者的启用与否由其 management.info.<id>.enabled 属性控制。不同的分发者对此属性有不同的默认值,具体取决于其前提条件和它们公开信息的性质。
如果没有前置条件表明应启用它们,env、java、os 和 process 分发者默认情况下处于禁用状态。可通过将 management.info.<id>.enabled 属性设置为 true 来启用每个分发者。
build 和 git 信息分发者默认情况下处于启用状态。可通过将 management.info.<id>.enabled 属性设置为 false 来禁用每个分发者。或者,要禁用通常默认启用的所有分发者,将 configprop:management.info.defaults.enabled[] 属性设置为 false。
Custom Application Information
当 env 分发者启用时,您可以通过设置 info.* Spring 属性来定制 info 终端公开的数据。所有 info 键下的 Environment 属性会自动公开。例如,您可以添加以下设置到 application.properties 文件:
info:
app:
encoding: "UTF-8"
java:
source: "17"
target: "17"
|
您可以也 expand info properties at build time 那些值,而不是硬编码。 假设您使用 Maven,您可以这样重写前一个示例: info:
app:
encoding: "@project.build.sourceEncoding@"
java:
source: "@java.version@"
target: "@java.version@"
|
Git Commit Information
info 终端的另一个有用的功能是它能发布有关 git 源代码存储库在项目构建时的状态的信息。如果存在 GitProperties bean,您可以使用 info 终端公开这些属性。
|
如果类路径的根目录中存在 |
默认情况下,此终端公开 git.branch、git.commit.id 和 git.commit.time 属性(如果存在)。如果您不希望在终端响应中出现任何这些属性,则需要从 git.properties 文件中排除这些属性。如果您想显示全部 git 信息(即 git.properties 的全部内容),请使用 configprop:management.info.git.mode[] 属性,如下所示:
management:
info:
git:
mode: "full"
要从 info 终端中完全禁用 git 提交信息,请将 configprop:management.info.git.enabled[] 属性设置为 false,如下所示:
management:
info:
git:
enabled: false
Build Information
如果 BuildProperties bean 可用,info 端点还可以发布有关你的构建的信息,只要 classpath 中提供 META-INF/build-info.properties 文件,情况即是如此。
|
Maven 和 Gradle 插件均可生成该文件,有关更多详细信息,请参阅“how to generate build information”。 |
Java Information
info 端点发布有关你的 Java 运行时环境的信息,有关更多详细信息,请参阅 JavaInfo。
OS Information
info 端点发布有关你的操作系统的的信息,有关更多详细信息,请参阅 OsInfo。
Process Information
info 端点发布有关你的进程的信息,有关更多详细信息,请参阅 ProcessInfo。