首页 >后端开发 >Golang >为什么我的 gRPC 连接失败并显示'连接在收到服务器前言之前已关闭”?

为什么我的 gRPC 连接失败并显示'连接在收到服务器前言之前已关闭”?

Linda Hamilton
Linda Hamilton原创
2024-12-10 11:12:14143浏览

Why Does My gRPC Connection Fail with

对 gRPC 错误进行故障排除:“连接在收到服务器前言之前已关闭”

与部署在 Docker 中的 Dgraph 服务器建立 gRPC 连接并按照文档进行操作时,您可能会遇到以下错误:

rpc error: code = Unavailable desc = connection closed before server preface received

此偶发错误可能会中断您与 Dgraph 的通信service.

根本原因

此错误的一个常见原因是服务器的 TLS 配置与客户端缺少 TLS 配置之间不匹配。当服务器在启用 TLS 的情况下运行时,客户端也必须使用 TLS 进行连接。

解决方案

要解决此问题,请确保您已在客户端正确配置 TLS 选项:

import (
    "crypto/tls"
    "crypto/x509"
    "google.golang.org/grpc/credentials"
)

// Certificates and CAs used for TLS.
var (
    myCertificate = ...
    myCAPool      = ...
)

// DialWithTLS establishes a TLS-enabled gRPC connection.
func DialWithTLS(ctx context.Context, host string) (*grpc.ClientConn, error) {
    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{myCertificate},
        RootCAs:      myCAPool,
    }

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

    return grpc.DialContext(ctx, host, tlsOpt)
}

建立 gRPC 连接时,使用 DialWithTLS函数:

import (
    "context"
    "google.golang.org/grpc"
)

// NewClientWithTLS establishes a new gRPC client with TLS enabled.
func NewClientWithTLS(host string) (*dgo.Dgraph, error) {
    conn, err := DialWithTLS(context.Background(), host)
    if err != nil {
        return nil, err
    }

    return dgo.NewDgraphClient(api.NewDgraphClient(conn)), nil
}

其他注意事项

除了 TLS 配置错误之外,由于短暂的网络问题偶尔也会出现此错误。

结论

此修复地址在收到服务器前言之前连接终止的问题。通过在客户端正确配置 TLS 设置,您可以与 Dgraph 服务器建立稳定且安全的 gRPC 连接。

以上是为什么我的 gRPC 连接失败并显示'连接在收到服务器前言之前已关闭”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn