Smart猫小萌
在 grpc 包中实现健康检查示例的最简单方法/* * * Copyright 2020 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */// Binary server is an example server.package mainimport ( "context" "flag" "fmt" "log" "net" "time" "google.golang.org/grpc" pb "google.golang.org/grpc/examples/features/proto/echo" "google.golang.org/grpc/health" healthgrpc "google.golang.org/grpc/health/grpc_health_v1" healthpb "google.golang.org/grpc/health/grpc_health_v1")var ( port = flag.Int("port", 50051, "the port to serve on") sleep = flag.Duration("sleep", time.Second*5, "duration between changes in health") system = "" // empty string represents the health of the system)type echoServer struct { pb.UnimplementedEchoServer}func (e *echoServer) UnaryEcho(ctx context.Context, req *pb.EchoRequest) (*pb.EchoResponse, error) { return &pb.EchoResponse{ Message: fmt.Sprintf("hello from localhost:%d", *port), }, nil}var _ pb.EchoServer = &echoServer{}func main() { flag.Parse() lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() healthcheck := health.NewServer() healthgrpc.RegisterHealthServer(s, healthcheck) pb.RegisterEchoServer(s, &echoServer{}) go func() { // asynchronously inspect dependencies and toggle serving status as needed next := healthpb.HealthCheckResponse_SERVING for { healthcheck.SetServingStatus(system, next) if next == healthpb.HealthCheckResponse_SERVING { next = healthpb.HealthCheckResponse_NOT_SERVING } else { next = healthpb.HealthCheckResponse_SERVING } time.Sleep(*sleep) } }() if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) }}