gRPC连接问题:如何判断它是服务器还是客户端?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gRPC连接问题:如何判断它是服务器还是客户端?相关的知识,希望对你有一定的参考价值。

我正在读一本名为“Go Blueprints”的Golang书。因此,其中一章是关于实施微服务。与该服务的通信可以是http或gRPC。我认为我做的一切都是正确的,但我无法获得gRPC通信工作。当我尝试从客户端询问服务器时,我收到此错误:

rpc error: code = Unimplemented desc = unknown service Vault

我的问题是如何开始调试这个?如何检查问题是在服务器中还是在客户端中?

答案

在您的实现中,初始化HashValidate的端点时服务名称错误。它应该是pb.Vault而不是Vault。所以New方法应如下所示:

func New(conn *grpc.ClientConn) vault.Service {
    var hashEndpoint = grpctransport.NewClient(
        conn, "pb.Vault", "Hash",
        vault.EncodeGRPCHashRequest,
        vault.DecodeGRPCHashResponse,
        pb.HashResponse{},
    ).Endpoint()
    var validateEndpoint = grpctransport.NewClient(
        conn, "pb.Vault", "Validate",
        vault.EncodeGRPCValidateRequest,
        vault.DecodeGRPCValidateResponse,
        pb.ValidateResponse{},
    ).Endpoint()

    return vault.Endpoints{
        HashEndpoint:     hashEndpoint,
        ValidateEndpoint: validateEndpoint,
    }
}

一般情况下,您应该查看匹配的.pb.go生成的proto文件,了解事物的名称。如您所见,它并不简单,它可能取决于proto生成器的实现。

在你的情况下,这是它的样子:

grpc.ServiceDesc{
    ServiceName: "pb.Vault",
    HandlerType: (*VaultServer)(nil),
    Methods: []grpc.MethodDesc{
        {
            MethodName: "Hash",
            Handler:    _Vault_Hash_Handler,
        },
        {
            MethodName: "Validate",
            Handler:    _Vault_Validate_Handler,
        },
    },
    Streams:  []grpc.StreamDesc{},
    Metadata: "vault.proto",
}

以上是关于gRPC连接问题:如何判断它是服务器还是客户端?的主要内容,如果未能解决你的问题,请参考以下文章

GRPC 浅析

GRPC负载均衡

如何在 gRPC 中从服务器到客户端进行广播?

如何关闭服务器的grpc流

如何使gRPC 获得最佳性能?

对GRPC的通用封装