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"), } }