Home >Backend Development >Golang >Why Does My gRPC Connection Fail with 'Connection Closed Before Server Preface Received'?
When establishing a gRPC connection to a Dgraph server deployed in Docker and following the documentation, you may encounter the following error:
rpc error: code = Unavailable desc = connection closed before server preface received
This sporadic error can disrupt your communication with the Dgraph service.
One common cause of this error is a mismatch between the server's TLS configuration and the client's lack of TLS configuration. When the server is running with TLS enabled, the client must also connect using TLS.
To resolve this issue, ensure that you have correctly configured TLS options on the client side:
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) }
When establishing the gRPC connection, use the 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 }
Beyond TLS misconfiguration, this error can occasionally arise due to transient network issues.
This fix addresses the issue of connection termination before the server preface is received. By configuring TLS settings correctly on the client side, you can establish a stable and secure gRPC connection to the Dgraph server.
The above is the detailed content of Why Does My gRPC Connection Fail with 'Connection Closed Before Server Preface Received'?. For more information, please follow other related articles on the PHP Chinese website!