如何覆盖 Spring Boot 健康响应代码

Posted

技术标签:

【中文标题】如何覆盖 Spring Boot 健康响应代码【英文标题】:How to override Spring Boot health response codes 【发布时间】:2018-07-28 18:22:32 【问题描述】:

如何根据执行器的状态覆盖执行器的默认/健康响应状态代码:DOWN、UP、UNKNOWN so so?例如,如果健康状态为“UP”,则响应代码应为 200。如果 DOWN:400,未知 300。有什么办法可以实现吗?

注意:我不想要自己的健康端点。相反,需要覆盖现有的。

【问题讨论】:

您确定这是个好主意吗?从/health 得到 200 并不意味着服务是健康的,它只是意味着健康检查成功完成。对于响应的消费者来说,为了了解服务的健康状况(或其他方面),偷看它是标准做法。 如果你真的必须以 HTTP 状态码的形式传达服务的健康状况...400 表示BAD_REQUEST,那么“DOWN”(表示某物的状态)真的有意义吗?在 server) 中被视为“错误的客户端请求”? 300 在重定向分组中,这真的对应于“未知”吗?您如何表示健康检查本身的失败?换一种说法;在 UP/DOWN/UNKNOWN 和 HTTP 状态代码之间没有明确的、易于理解的映射,这是 /health 端点返回 200 并在其有效负载中提供详细信息的原因之一。 @glytching 。感谢您的回答。但是上面我的代码只是为了举例。可能是响应代码可以存在于 2XX 范围内。 我必须坚持使用响应代码的原因是我的应用程序要与另一个工具连接,并且它会 ping /health 端点。该工具将继续处理我的应用提供的响应代码。 @glytching 默认情况下一个 200 响应意味着该服务不知道是不健康的。如果已知它已关闭,它将返回 503。 【参考方案1】:

在 Spring boot 2.x 中,这些是内置状态及其默认值,您可以将其覆盖为所需的相关代码。

management.endpoint.health.status.http-mapping.UP=200
management.endpoint.health.status.http-mapping.UNKNOWN=200
management.endpoint.health.status.http-mapping.DOWN=503
management.endpoint.health.status.http-mapping.OUT_OF_SERVICE=503

或自定义映射

management.endpoint.health.status.http-mapping.DOWN=400

或在 yaml 中,

management: 
   endpoint:
       health:
          status:
            http-mapping:
              UP: 200
              UNKNOWN: 200
              DOWN: 503
              OUT_OF_SERVICE: 503

在 Spring boot 1.x 中,这些是应用了自定义状态的属性,

endpoints.health.mapping.DOWN=400
endpoints.health.mapping.UP=200
endpoints.health.mapping.UNKNOWN=300

或在 yaml 中,

endpoints:
   health:
      mapping:
         UP: 200
         DOWN: 400
         UNKNOWN: 300

Spring Boot Current Actuator Health Documentation

【讨论】:

【参考方案2】:

通过application properties 配置状态码。这些是默认值:

management.health.status.http-mapping:
  UP: 200
  DOWN: 503
  OUT_OF_SERVICE: 503
  UNKNOWN: 200

对于Spring Boot 1.x,属性改为endpoints.health.mapping

使用您建议的代码是个坏主意,因为它们已经意味着其他东西。如果您希望上游系统以与UP 不同的方式对待它,一个合理的更改是设置UNKNOWN: 500

【讨论】:

【参考方案3】:

the documentation 似乎又更新了(第二次)。健康检查状态映射的当前属性是:

management.health.status.http-mapping.DOWN=503
management.health.status.http-mapping.UP=200

【讨论】:

基于当前reference documentationDOWN的默认值为503。【参考方案4】:

默认情况下,OUT_OF_SERVICEDOWN 映射到 503。任何未映射的健康状态,包括 UP,都映射到 200。

这些值可以被覆盖,如其他答案中所述。

【讨论】:

以上是关于如何覆盖 Spring Boot 健康响应代码的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Actuator 健康检查度量指标收集监控,一文搞定!

将 spring boot 执行器健康端点更改为自定义端点

spring boot 覆盖默认的 REST 异常处理程序

spring boot 覆盖默认的 REST 异常处理程序

如何在 Spring Boot Health 中添加自定义健康检查?

如何更改 Spring Boot 健康执行器结果以进行测试?