package main import ( "context" "flag" "fmt" "log" "os" "time" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" healthpb "google.golang.org/grpc/health/grpc_health_v1" ) // main 是本地容器 healthcheck 使用的最小 gRPC health probe。 func main() { addr := flag.String("addr", "", "gRPC address to probe") service := flag.String("service", "", "gRPC health service name") timeout := flag.Duration("timeout", 800*time.Millisecond, "probe timeout") flag.Parse() if *addr == "" { log.Fatal("-addr is required") } ctx, cancel := context.WithTimeout(context.Background(), *timeout) defer cancel() conn, err := grpc.DialContext(ctx, *addr, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock()) if err != nil { log.Fatal(err) } defer conn.Close() resp, err := healthpb.NewHealthClient(conn).Check(ctx, &healthpb.HealthCheckRequest{Service: *service}) if err != nil { log.Fatal(err) } if resp.GetStatus() != healthpb.HealthCheckResponse_SERVING { _, _ = fmt.Fprintf(os.Stderr, "service %q is %s\n", *service, resp.GetStatus()) os.Exit(1) } }