ホームページ >バックエンド開発 >Golang >gRPC 接続が「サーバー プレフェイスを受信する前に接続が閉じられました」というメッセージで失敗するのはなぜですか?

gRPC 接続が「サーバー プレフェイスを受信する前に接続が閉じられました」というメッセージで失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-10 11:12:14148ブラウズ

Why Does My gRPC Connection Fail with

gRPC エラーのトラブルシューティング:「サーバー プレフェイスを受信する前に接続が閉じられました」

Docker にデプロイされた Dgraph サーバーへの gRPC 接続を確立し、ドキュメントに従っていると、次のような問題が発生する可能性があります。次のエラー:

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

この散発的なエラーにより、通信が中断される可能性があります。 Dgraph サービス。

根本原因

このエラーの一般的な原因の 1 つは、サーバーの 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 を使用します。 function:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。