应用健康检查功能可以检测应用程序的健康状况,并对状态变化做出反应。
应用程序可能由于多种原因变得无响应。例如,您的应用程序:
有时这种情况可能是暂时的,例如:
应用健康检查默认情况下是禁用的。一旦启用,Dapr 运行时(sidecar)会通过 HTTP 或 gRPC 调用定期轮询您的应用程序。当检测到应用程序的健康状况出现问题时,Dapr 会通过以下方式暂停接受新工作:
这些变化是暂时的,一旦 Dapr 检测到应用程序恢复响应,它将恢复正常操作。
Dapr 的应用健康检查旨在补充而不是替代任何平台级健康检查,例如在 Kubernetes 上运行时的存活探针。
平台级健康检查(或存活探针)通常确保应用程序正在运行,并在出现故障时导致平台重启应用程序。
与平台级健康检查不同,Dapr 的应用健康检查专注于暂停当前无法接受工作的应用程序,但预计最终能够恢复接受工作。目标包括:
在这方面,Dapr 的应用健康检查是“较软”的,等待应用程序能够处理工作,而不是以“硬”方式终止正在运行的进程。
应用健康检查默认情况下是禁用的,但可以通过以下方式启用:
--enable-app-health-check
CLI 标志;或dapr.io/enable-app-health-check: true
注释。添加此标志是启用应用健康检查的必要且充分条件,使用默认选项。
完整的选项列表如下表所示:
CLI 标志 | Kubernetes 部署注释 | 描述 | 默认值 |
---|---|---|---|
--enable-app-health-check | dapr.io/enable-app-health-check | 启用健康检查的布尔值 | 禁用 |
--app-health-check-path | dapr.io/app-health-check-path | 当应用通道为 HTTP 时,Dapr 用于健康探测的路径(如果应用通道使用 gRPC,则忽略此值) | /healthz |
--app-health-probe-interval | dapr.io/app-health-probe-interval | 每次健康探测之间的秒数 | 5 |
--app-health-probe-timeout | dapr.io/app-health-probe-timeout | 健康探测请求的超时时间(以毫秒为单位) | 500 |
--app-health-threshold | dapr.io/app-health-threshold | 在应用被视为不健康之前的最大连续失败次数 | 3 |
请参阅完整的 Dapr 参数和注释参考以获取所有选项及其启用方法。
此外,应用健康检查受应用通道使用的协议影响,该协议通过以下标志或注释进行配置:
CLI 标志 | Kubernetes 部署注释 | 描述 | 默认值 |
---|---|---|---|
--app-protocol | dapr.io/app-protocol | 应用通道使用的协议。支持的值有 http 、grpc 、https 、grpcs 和 h2c (HTTP/2 明文)。 | http |
dapr.io/app-health-probe-timeout
值。当使用 HTTP(包括 http
、https
和 h2c
)作为 app-protocol
时,Dapr 通过对 app-health-check-path
指定的路径进行 HTTP 调用来执行健康探测,默认路径为 /health
。
为了使您的应用被视为健康,响应必须具有 200-299 范围内的 HTTP 状态码。任何其他状态码都被视为失败。Dapr 只关心响应的状态码,忽略任何响应头或正文。
当使用 gRPC 作为应用通道(app-protocol
设置为 grpc
或 grpcs
)时,Dapr 在您的应用程序中调用方法 /dapr.proto.runtime.v1.AppCallbackHealthCheck/HealthCheck
。您很可能会使用 Dapr SDK 来实现此方法的处理程序。
在响应健康探测请求时,您的应用可以决定执行额外的内部健康检查,以确定它是否准备好处理来自 Dapr 运行时的工作。然而,这不是必需的;这取决于您的应用程序的需求。
默认情况下,当启用应用健康检查时,Dapr 每 5 秒探测一次您的应用程序。您可以使用 app-health-probe-interval
配置间隔(以秒为单位)。这些探测会定期发生,无论您的应用程序是否健康。
当 Dapr 运行时(sidecar)最初启动时,Dapr 会等待成功的健康探测,然后才认为应用程序是健康的。这意味着在第一次健康检查完成并成功之前,pub/sub 订阅、输入绑定和服务调用请求不会为您的应用程序启用。
如果应用程序在 app-health-probe-timeout
中配置的超时内发送成功响应(如上所述),则健康探测请求被视为成功。默认值为 500,对应于 500 毫秒(半秒)。
在 Dapr 认为应用程序进入不健康状态之前,它将等待 app-health-threshold
次连续失败,默认值为 3。此默认值意味着您的应用程序必须连续失败健康探测 3 次才能被视为不健康。
如果您将阈值设置为 1,任何失败都会导致 Dapr 假设您的应用程序不健康,并停止向其传递工作。
大于 1 的阈值可以帮助排除由于外部情况导致的瞬态故障。适合您的应用程序的正确值取决于您的要求。
阈值仅适用于失败。单个成功响应足以让 Dapr 认为您的应用程序是健康的,并恢复正常操作。
使用 dapr run
命令的 CLI 标志启用应用健康检查:
dapr run \
--app-id my-app \
--app-port 7001 \
--app-protocol http \
--enable-app-health-check \
--app-health-check-path=/healthz \
--app-health-probe-interval 3 \
--app-health-probe-timeout 200 \
--app-health-threshold 2 \
-- \
<command to execute>
要在 Kubernetes 中启用应用健康检查,请将相关注释添加到您的 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
template:
metadata:
labels:
app: my-app
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "my-app"
dapr.io/app-port: "7001"
dapr.io/app-protocol: "http"
dapr.io/enable-app-health-check: "true"
dapr.io/app-health-check-path: "/healthz"
dapr.io/app-health-probe-interval: "3"
dapr.io/app-health-probe-timeout: "200"
dapr.io/app-health-threshold: "2"
观看此视频以获取使用应用健康检查的概述: