2026-04-25 01:18:30 +08:00

47 lines
1.2 KiB
Go

package grpchealth
import (
"context"
"sync/atomic"
)
// ServingChecker 覆盖无外部硬依赖的占位或 stub gRPC 服务 readiness。
type ServingChecker struct {
serviceName string
serving atomic.Bool
draining atomic.Bool
}
// NewServingChecker 创建只依赖 gRPC listener 和 draining 状态的 checker。
func NewServingChecker(serviceName string) *ServingChecker {
return &ServingChecker{serviceName: serviceName}
}
// ServiceName 返回标准 gRPC health 使用的服务边界名。
func (c *ServingChecker) ServiceName() string {
return c.serviceName
}
// MarkServing 标记 gRPC listener 已进入 Serve 循环。
func (c *ServingChecker) MarkServing() {
c.serving.Store(true)
}
// MarkStopped 标记 gRPC listener 已退出 Serve 循环。
func (c *ServingChecker) MarkStopped() {
c.serving.Store(false)
}
// MarkDraining 让 ready 立即失败,服务下线时不再进入可用池。
func (c *ServingChecker) MarkDraining() {
c.draining.Store(true)
}
// Ready 返回无数据库类硬依赖服务的最小 readiness。
func (c *ServingChecker) Ready(_ context.Context) []Check {
return []Check{
Bool("grpc_listener", c.serving.Load(), "gRPC listener is not serving"),
Bool("draining", !c.draining.Load(), "node is draining"),
}
}