首页 > 解决方案 > Golang grpc:如何判断服务器何时开始监听?

问题描述

所以我有以下内容:

type Node struct {
    Table map[string]string
    thing.UnimplementedGreeterServer
    address string
}




func (n *Node) Start() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer()
    thing.RegisterGreeterServer(s, n)
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

在我的主要功能中,我将像这样启动多个节点:

func main() {
    n :=Node{Table: map[string]string{}}
    go n.Start()
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())

}

问题是,因为我正在同时启动节点,所以拨号连接可能无法正常工作,因为节点可能尚未设置。

理想情况下,我想要一个done告诉我 grpc 服务器何时真正开始收听的频道。我该如何做到这一点?

这与如何在 golang grpc 服务器启动上添加挂钩基本上是相同的问题没有答案

标签: goconcurrencygrpc

解决方案


s.Serve(listener)块,因此您无法通过完成 chan 来实现您的目的,相反,您必须为您的服务实施健康检查和准备情况,并在执行客户端的任何请求之前检查这些内容。服务器应实现以下原型:

syntax = "proto3";

package grpc.health.v1;

message HealthCheckRequest {
  string service = 1;
}

message HealthCheckResponse {
  enum ServingStatus {
    UNKNOWN = 0;
    SERVING = 1;
    NOT_SERVING = 2;
    SERVICE_UNKNOWN = 3;  // Used only by the Watch method.
  }
  ServingStatus status = 1;
}

service Health {
  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);

  rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}

例如,envoy 代理 grpc_health_check与上述 proto 一起工作。

阅读GRPC 健康检查协议了解更多信息。


推荐阅读