gpt4 book ai didi

Golang grpc : how to determine when the server has started listening?

转载 作者:行者123 更新时间:2023-12-04 03:31:00 24 4
gpt4 key购买 nike

所以我有以下内容:

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 channel 来告诉我 grpc 服务器何时真正开始监听。我该如何实现?

这与 How to add hook on golang grpc server start? 本质上是同一个问题没有答案

最佳答案

s.Serve(listener) block ,所以你不能通过 done chan 来实现你的目的,相反你必须实现 healthcheck和准备好您的服务,并在执行客户的任何请求之前检查这些。服务器应实现以下协议(protocol):

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 proxy grpc_health_check适用于上述原型(prototype)。

阅读GRPC Health Checking Protocol获取更多信息。

关于Golang grpc : how to determine when the server has started listening?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66798278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com