首頁 >後端開發 >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