【问题标题】:How to detect the error when grpc server is shutdown in Go?在 Go 中关闭 grpc 服务器时如何检测错误?
【发布时间】:2025-12-01 16:30:01
【问题描述】:

我正在尝试在 Go gRPC 客户端代码中检测 gRPC 服务器关闭,例如

import (
     pb "mysample.com/api/rpc"
     "google.golang.org/grpc"
)
var stream pb.SearchProductService_MarketStreamClient
for {
    r, err := stream.Recv()
    if err == io.EOF {
        log.Println("Info: server close")
        break
    } else if err != nil {
        log.Println("Err: grpc code:", grpc.Code(err))
        if err != nil {
          log.Fatal(err)
        }
    }
    outs := printOrderbook(r)
    fmt.Println(outs)
    if outf != nil {
        outf.WriteString(time.Now().Format("030405.000 ") +
            outs + "\n")
    }
}

输出消息是

mysample.go:122: Err: grpc code: Unavailable
panic: rpc error: code = Unavailable desc = transport is closing

我正在尝试在 Go 的源代码和 $GOPATH/src/ 中搜索“传输正在关闭”,但我找不到这样的短语。有没有什么聪明的方法来处理这种更深层次的错误?

【问题讨论】:

  • check() 是做什么的?如果它没有恐慌,那么您可能正在从已终止的流中读取。也许不完全是您正在寻找的东西,但我有类似的代码,一旦观察到错误就会终止循环。
  • 我只想在服务器在流中间关闭时漂亮地关闭客户端程序。我只需要过滤掉已知错误,显示未知错误

标签: go grpc


【解决方案1】:

gRPC 总是需要正确返回错误,如果您不处理错误,连接将进入 TRANSIENT_FAILURE 状态,并且您无法使用此客户端连接请求任何查询。正确捕获错误并使用 grpc 错误代码将其返回。你可以在这里https://www.grpc.io/docs/guides/error/ 找到更深入的站点并使用这个内置包 grpc:google.golang.org/grpc/status

conn *grpc.ClientConn conn.GetState() 会给出当前的连接状态

【讨论】: