go - 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 服务器启动上添加挂钩基本上是相同的问题?没有答案
解决方案
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 健康检查协议了解更多信息。
推荐阅读
- python - python logger的后代-好处
- java - Spring Boot(用户''@'localhost'拒绝访问数据库'myappdb')
- python - TF Estimator:无法从保存的模型中加载 *.pb
- haskell - 我的记录字段名称与同一范围内的其他记录字段冲突
- php - 将命令作为变量传递时 proc_open 不起作用
- python-3.x - 以下的输出是什么?
- angular - 如何正确使用在角?
- matlab - 在任何偏移对角线上创建一个矩阵
- excel - Excel VBA:将公式插入单元格会导致运行时错误“1004”
- java - Java XML Reader 不适用于 URL 中的多个元素