gRPC 错误:如何解决“连接在收到服务器序言之前关闭”?

Dev*_*cer 3 go grpc-go

我在docker中部署了DgraphAlpha和DgraphZero。我正在按照文档中的描述连接到 Dgraph。

func newClient() *dgo.Dgraph {
    d, err := grpc.Dial("localhost:9080", grpc.WithInsecure())
    if err != nil {
        log.Fatal(err)
    }

    return dgo.NewDgraphClient(
        api.NewDgraphClient(d),
    )
}
Run Code Online (Sandbox Code Playgroud)

并且客户端已成功创建,但是当我尝试搜索时

txn := i.dgraphClient.NewReadOnlyTxn()
defer txn.Discard(context.Background())

dgraphQuery := "search here"

response, err := txn.Query(context.Background(), dgraphQuery)
if err != nil {
    // error here
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

rpc error: code = Unavailable desc = connection closed before server preface received
Run Code Online (Sandbox Code Playgroud)

这个错误并不总是在意想不到的时刻发生,因此我很难确定其根源。有人遇到过类似的事情吗?可能是什么问题呢?

bla*_*een 5

除了其他暂时性原因之外,导致此错误的一个常见原因是服务器在启用 TLS 的情况下运行,而客户端尝试在不使用 TLS 的情况下进行连接。

确保您在客户端上正确配置了 TLS 选项:

tlsConfig := &tls.Config{
    Certificates: []tls.Certificate{myCertificate},
    RootCAs:      myCAPool,
}

tlsOpt := grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))

conn, err := grpc.DialContext(ctx, "<connection_string>", tlsOpt)
Run Code Online (Sandbox Code Playgroud)

还要确保您实际上在客户端连接上使用客户端证书。