go - 在 Go 中关闭 grpc 服务器时如何检测错误?

标签 go grpc

我正在尝试在 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/中搜索“transport is closing”,但找不到这样的短语。有什么聪明的方法来处理这种更深层次的错误吗?

最佳答案

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

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

关于go - 在 Go 中关闭 grpc 服务器时如何检测错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57583346/

相关文章:

go - 测量每个流的 gRPC 带宽

caching - Golang 多模板缓存

amazon-web-services - TLS 的 AWS DocumentDB 连接问题

Java + GRPC,对于傻瓜来说?

c++ - grpc server 不会释放内存,是内存泄漏了吗?

python - 在打印 “Greeter client received: …”之前,gRPC Python quickstart/helloworld(greeter_client.py)已挂起

javascript - 无法找到聊天消息的 Steam UMQID

java - 如何在gRPC拦截器中访问消息请求?

c# - C# 中的 gRPC 压缩

nginx - 无法使用 NginX/FastCGI 建立 Websocket 连接