这是一个非常有趣的主题,在我们的组织中,我们需要将就绪端点和活动端点分开,正如上面提到的其他端点一样。
但我们走了一个有点不同的方向..我们引入了一个新的@Endpoint
称为alive
.该端点正在调用实际的Health
.如果运行状况与 DOWN 不同,则返回 200 状态代码。例如,我们有以下健康状态和 http 响应状态的映射
健康 |
/actuator/alive http状态代码 |
UP |
200 |
OUT_OF_SERVICE |
200 |
CUSTOM_HEALTH_STATUS |
200 |
DOWN |
503 |
我们映射了 k8s 端点,例如:
livenessProbe
->/actuator/alive
readinessProbe
->/actuator/health
就连健康状况的措辞也和 kubernetes 的措辞有点相似,但有点颠倒,
livenessProbe
->NOT DOWN
readinessProbe
->NOT OUT_OF_SERVICE
当资源不可用时,所有核心运行状况指标都已返回 DOWN,例如数据源、jms 等*。这满足了我们的需求这使我们能够编写自己的健康指标并返回OUT_OF_SERVICE
(一个例子是长缓存加载操作)。
我知道这与所要求的方法完全不同,但我认为它提供了所要求的内容以及一些可能有用的机会。
例如,某些运行状况指示器可能会以更智能的方式编写,以区分应用程序是否应该停止运行,或者应该停止服务请求。一个示例(尽管可能难以实现)是区分 datasourceHealthIndicator 上的瞬时错误并OUT_OF_SERVICE
从其他错误中返回,然后返回DOWN
.
我不知道这种方法是否比分组健康指标更强大,但新方法的实施alive @Endpoint
非常简单,而且它给了我们我们所需要的东西。我能想到的一个好处是,通过这种方法,单个运行状况指示器可以决定事件是否需要在 k8s 中停止/重新启动,或者只是无法使用。所以对于上面提到的缓存加载的例子,我们的规则是如果缓存没有加载返回OUT_OF_SERVICE
并且不提供流量,如果缓存加载失败返回DOWN
,重启容器,然后重试。
实际上这种方法可以很好地与组结合使用,我想说的是,虽然“自定义”端点很容易编写,但我希望在 spring-boot 中看到类似的东西:)
或者它也可以取代分组方法,因为我们不需要配置组,而是只需配置从每个运行状况指示器返回的状态,例如,使用属性或代码来控制会很容易,jmsHealthIndicator 应该返回OUT_OF_SERVICE
而不是DOWN
这样,除了使用的措辞之外,我们最终还可以给出OUT_OF_SERVICE
AND 的语义。DOWN
如果这有意义并且涵盖了所需的内容,我很乐意提交拉取请求。
附带说明一下,在某些情况下,有些人可能希望健康指标既不参与活跃度也不参与就绪结果,而仅使用 if 来进行警报目的,对于这些情况,我们可以只使用称为的自定义健康WARN
状态导致健康状况和就绪端点的 200 http 状态..但我不知道这对更多人是否有意义。
为了完成我的长篇文章,我认为最好的方法是 Spring Boot 支持一组级联端点,例如
/actuator/health
目前有效
/actuator/health/alive
只关心至少一个DOWN
状态是否存在
/actuator/health/ready
只关心至少一个 OUT_OF_SERVICE
状态是否存在
以及配置指示器故障状态的方法
我认为这种方法的其他一些好处是:
- 所需的代码库比提交的拉取请求小得多
- 拥有一组固定的端点(而不是
/actuator/health/groupA
特定于应用程序的端点)可以更轻松地配置下游工具,例如负载均衡器、客户端发现注册表等
- 消除了指标不参与任何组的问题