Go gRPC连接问题:如何确定是服务器还是客户端?

Go gRPC连接问题:如何确定是服务器还是客户端?,go,connection,grpc,Go,Connection,Grpc,我正在读一本叫《Go蓝图》的歌朗书。所以其中一章是关于实现微服务的。与该服务的通信可以是http或gRPC。我认为我做的每件事都是对的,但是我无法得到gRPC的沟通工作。当我试图从客户端询问服务器时,我得到以下错误: rpc error: code = Unimplemented desc = unknown service Vault 我的问题是如何开始调试它?如何检查问题是在服务器上还是在客户端?在您的实现中,当您为散列和验证初始化端点时,服务名称是错误的。它应该是pb.Vault,而不是

我正在读一本叫《Go蓝图》的歌朗书。所以其中一章是关于实现微服务的。与该服务的通信可以是http或gRPC。我认为我做的每件事都是对的,但是我无法得到gRPC的沟通工作。当我试图从客户端询问服务器时,我得到以下错误:

rpc error: code = Unimplemented desc = unknown service Vault

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

在您的实现中,当您为
散列
验证
初始化端点时,服务名称是错误的。它应该是
pb.Vault
,而不是
Vault
。因此,
新的
方法应该如下所示:

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,
    }
}
一般来说,您应该查阅匹配的
proto
文件中生成的
.pb.go
文件,了解事物的命名方式。如您所见,这并不简单,可能取决于
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",
}

在您的实现中,当您为
Hash
Validate
初始化端点时,服务名称是错误的。它应该是
pb.Vault
,而不是
Vault
。因此,
新的
方法应该如下所示:

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,
    }
}
一般来说,您应该查阅匹配的
proto
文件中生成的
.pb.go
文件,了解事物的命名方式。如您所见,这并不简单,可能取决于
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",
}

你能提供一些代码吗?因为我不确定问题在哪里,请查看整个项目。你能提供一些代码吗?因为我不确定问题在哪里,请查看整个项目。非常感谢!我真的很感谢你花时间去寻找那个愚蠢的问题。不用担心,伙计,很高兴能帮上忙:)那本书有一些拼写错误。刚开始的时候,这个例子真是太棒了。必须在对所发生的一切了解最少的情况下解决调试问题。这个决议对填补知识空白有很大帮助。非常感谢!我真的很感谢你花时间去寻找那个愚蠢的问题。不用担心,伙计,很高兴能帮上忙:)那本书有一些拼写错误。刚开始的时候,这个例子真是太棒了。必须在对所发生的一切了解最少的情况下解决调试问题。这个解决方案有助于填补知识空白。