health.go的源码学习
Dapr health package中的 health.go 文件的源码分析,health checking的客户端实现
代码实现
Option 方法定义
healthCheckOptions 结构体定义
healthCheckOptions 结构体
With系列方法
WithXxx 方法用来设置上述5个健康检查的选项,每个方法都返回一个 Option 函数:
StartEndpointHealthCheck 方法
StartEndpointHealthCheck 方法用给定的选项在指定的地址上启动健康检查。它返回一个通道,如果端点是健康的则发出true,如果满足失败条件则发出false。
applyDefaults() 方法设置默认属性:
健康检查方式总结
对某一个给定地址 endpointAddress 进行健康检查的步骤和方式为:
- 先 sleep initialDelay 时间再开始健康检查:可能对方还在初始化过程中
- 每隔间隔时间 interval 时间发起一次健康检查
- 每次健康检查是向目标地址 endpointAddress 发起一个 HTTP GET 请求,超时时间为 requestTimeout
- 检查应答判断是否健康
- 返回应答并且应答的状态码是 successStatusCode 则视为本地健康检查成功
- 超时或者应答的状态码不是 successStatusCode 则视为本地健康检查失败
- 如果失败则开始累加计数器,然后间隔 interval 时间之后再次进行健康检查
- 如果多次失败,累计达到阈值 failureThreshold,报告为健康检查失败
- 只要单次成功,则清理之前的错误累计次数,报告为健康检查成功。
server.go的源码学习
Dapr health package中的 server.go 文件的源码分析,healthz server的实现
代码实现
Health server
healthz server 的接口定义:
server 结构体,ready 字段保存状态:
创建 healthz server的方法:
设置 ready 状态的两个方法:
运行healthz server
Run 方法启动一个带有 healthz 端点的 http 服务器,端口通过参数 port 指定:
启动之后:
healthz server 处理请求
healthz() 方法是 health endpoint 的 handler,根据当前 healthz server 的 ready 字段的状态值返回 HTTP 状态码:
使用场景
healthz server 在 injector / placement / sentry / operator 中都有使用,这些进程都是在 main 方法中启动 healthz server。
injector
injector 启动在 8080 端口:
placement
placement 默认启动在 8080 端口(也可以通过命令行参数修改端口):
sentry
sentry 启动在 8080 端口:
operator
operator 启动在 8080 端口:
darpd
特别指出:daprd 没有使用 healthz server,daprd 是直接在 dapr HTTP api 的基础上增加了 healthz 的功能。
具体代码在 http/api.go 中:
onGetHealthz() 方法处理请求:
注意:这里成功时返回的状态码是 204 StatusNoContent,而不是通常的 200 OK。