当 gRPC 连接关闭时,gRPC 客户端连接的状态将是
IDLE 或 TRANSIENT_FAILURE。这是我在 Go 中为 gRPC 双向流式传输自定义重新连接机制的示例。首先,我有一个 for 循环来保持重新连接,直到 gRPC 服务器启动,在调用 conn.Connect() 后状态将变为就绪。
for {
select {
case <-ctx.Done():
return false
default:
if client.Conn.GetState() != connectivity.Ready {
client.Conn.Connect()
}
// reserve a short duration (customizable) for conn to change state from idle to ready if grpc server is up
time.Sleep(500 * time.Millisecond)
if client.Conn.GetState() == connectivity.Ready {
return true
}
// define reconnect time interval (backoff) or/and reconnect attempts here
time.Sleep(2 * time.Second)
}
}
此外,将生成一个 goroutine 以执行重新连接任务。成功重新连接后,它将生成另一个 goroutine 来监听 gRPC 服务器。
for {
select {
case <-ctx.Done():
return
case <-reconnectCh:
if client.Conn.GetState() != connectivity.Ready && *isConnectedWebSocket {
if o.waitUntilReady(client, isConnectedWebSocket, ctx) {
err := o.generateNewProcessOrderStream(client, ctx)
if err != nil {
logger.Logger.Error("failed to establish stream connection to grpc server ...")
}
// re-listening server side streaming
go o.listenProcessOrderServerSide(client, reconnectCh, ctx, isConnectedWebSocket)
}
}
}
}
请注意,监听任务由另一个 goroutine 并发处理。
// listening server side streaming
go o.listenProcessOrderServerSide(client, reconnectCh, websocketCtx, isConnectedWebSocket)
您可以查看我的代码示例here。希望这可以帮助。