领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多更新:此博文已更新,以反映 Spring Boot 2.3.0.RC1 中发布的更改。
Spring Boot 团队正在积极为即将发布的 2.3.0 版本开发 Kubernetes 主题。在创建 Docker 镜像和优雅关闭支持之后,现在该介绍存活和就绪探针支持了。
在我们的 2.2.0 版本中,Spring Boot 附带了健康组支持,允许开发者选择健康指标的子集,并将它们分组到单个相关的健康状态下。
即使有了这项新功能,我们发现我们仍然可以为 Spring 社区提供更多内容,在 Kubernetes 方面提供更多意见和指导。
在 Kubernetes 中,存活和就绪 Kubernetes 概念代表了应用程序状态的各个方面。
应用程序的存活状态表示其内部状态是否有效。如果存活状态中断,则表示应用程序本身处于故障状态,无法从中恢复。在这种情况下,最佳做法是重新启动应用程序实例。例如,依赖本地缓存的应用程序如果本地缓存损坏且无法修复,则应使其存活状态失败。
就绪状态表示应用程序是否已准备好接受客户端请求。如果就绪状态为未就绪,则 Kubernetes 不应将流量路由到此实例。如果应用程序过于繁忙地处理任务队列,则可以将其声明为繁忙状态,直到其负载再次可控。
这些存活和就绪概念不仅适用于 Kubernetes,而且通常很有用,无论部署平台如何。我们正在引入LivenessState
和ReadinessState
,它们是这些概念的不可变表示。您可以随时从ApplicationAvailability
中获取它们。
// Available as a component in the application context
ApplicationAvailability availability;
LivenessState livenessState = availabilityProvider.getLivenessState();
ReadinessState readinessState = availabilityProvider.getReadinessState()
仅轮询模型,需要执行检查才能知道应用程序的状态是不完整的。只有应用程序本身知道其生命周期(启动、关闭)或可以提供有关运行时错误的上下文(在处理任务时最终处于损坏状态)。Spring Boot 应用程序上下文在应用程序的生命周期中会原生发布这些事件;您的应用程序代码也应该能够对此做出贡献。
这就是我们选择使用 Spring Application Event 模型来更改可用性状态并侦听更新的原因。
/**
* Component that checks that the local cache is in a valid state.
*/
@Component
public class LocalCacheVerifier {
private final ApplicationEventPublisher eventPublisher;
public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void checkLocalCache() {
try {
//...
}
catch (CacheCompletelyBroken ex) {
AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
}
}
}
组件还可以使用@EventListener
(或通过实现ApplicationListener
)侦听这些事件。查看参考文档以获取更多信息。
此支持直接随spring-boot
模块一起提供,并为所有 Spring Boot 应用程序激活;这使其可用于所有类型的应用程序(Web、批处理等),并允许您实现不一定要与 HTTP 绑定的探针。
您可能对一个非常常见的用例感兴趣:在 Kubernetes 上部署 Web 应用程序并配置 HTTP 探针。将 Spring Boot Actuator 依赖项添加到您的应用程序是唯一的要求!Actuator 将使用健康支持来配置存活和就绪 HTTP 探针。
Actuator 将从ApplicationAvailability
收集“存活”和“就绪”信息,并在专用健康指标中使用这些信息:LivenessStateHealthIndicator
和ReadinessStateHealthIndicator
。这些指标将显示在全局健康端点("/actuator/health"
)上。它们还将作为使用健康组的单独 HTTP 探针公开:"/actuator/health/liveness"
和"/actuator/health/readiness"
。
在 Kubernetes 上运行的应用程序将显示以下健康报告
// https://127.0.0.1:8080/actuator/health
// HTTP/1.1 200 OK
{
"status": "UP",
"components": {
"diskSpace": {
"status": "UP",
"details": { //...
}
},
"livenessProbe": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"readinessProbe": {
"status": "UP"
}
},
"groups": [
"liveness",
"readiness"
]
}
调用存活组时,Kubernetes 将获取以下内容
// https://127.0.0.1:8080/actuator/health/liveness
// HTTP/1.1 200 OK
{
"status": "UP",
"components": {
"livenessstate": {
"status": "UP"
}
}
}
标记为未就绪的应用程序将为就绪组报告以下内容
// https://127.0.0.1:8080/actuator/health/readiness
// HTTP/1.1 503 SERVICE UNAVAILABLE
{
"status": "OUT_OF_SERVICE",
"components": {
"readinessstate": {
"status": "OUT_OF_SERVICE"
}
}
}
HTTP 探针仅为在 Kubernetes 上运行的应用程序配置。您可以通过使用management.health.probes.enabled=true
配置属性手动启用探针来在本地试用。由于探针是健康组,因此您将获得许多其他功能,例如配置 HTTP 状态映射器、安全性、详细信息可见性……
当然,您可以配置其他健康指标作为探针的一部分,检查外部系统(数据库、Web API、共享缓存)的状态。给定现有的CacheCheckHealthIndicator
,您可以使用以下方法增强存活探针:
management.endpoint.health.group.liveness.include=livenessstate,cacheCheck
您应该仔细考虑将外部状态与存活或就绪状态关联起来,这就是 Spring Boot 默认情况下不添加任何内容的原因。每个应用程序和部署都不同,但我们致力于在社区的帮助下提供指导并调整默认值 - 查看我们参考文档中的“使用 Kubernetes 探针检查外部状态”部分。
结合优雅关闭,此功能将帮助您处理 Kubernetes 中应用程序和容器的生命周期 - 我们已经开始在参考文档中提供有关 Kubernetes 部署和配置的指导。
此新功能将与我们即将推出的 2.3 里程碑版本一起提供;我们迫不及待地想听到您的反馈!