36 lines
793 B
Go
36 lines
793 B
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// ReadinessChecker 定义统一的就绪检查能力。
|
|
type ReadinessChecker interface {
|
|
Ready(ctx context.Context) error
|
|
}
|
|
|
|
type readinessGroup struct {
|
|
checkers []namedChecker
|
|
}
|
|
|
|
type namedChecker struct {
|
|
name string
|
|
check func(context.Context) error
|
|
}
|
|
|
|
// newReadinessGroup 创建一个按顺序执行的就绪检查器组合。
|
|
func newReadinessGroup(checkers ...namedChecker) ReadinessChecker {
|
|
return readinessGroup{checkers: checkers}
|
|
}
|
|
|
|
// Ready 逐个执行检查,只要有一个失败就返回未就绪。
|
|
func (g readinessGroup) Ready(ctx context.Context) error {
|
|
for _, checker := range g.checkers {
|
|
if err := checker.check(ctx); err != nil {
|
|
return fmt.Errorf("%s not ready: %w", checker.name, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|