go - gRPC 连接问题 : How to figure out if it is the server or the client?

标签 go connection 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",
}

关于go - gRPC 连接问题 : How to figure out if it is the server or the client?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52221720/

相关文章:

go - 寻找一种在golang mysql中查看内插查询的方法

Golang 推迟对调用者/外部函数采取行动?

java - PubSubException : io. grpc.StatusRuntimeException:不可用

sockets - 是否可以在不使用 Android SDK 管理实用程序的情况下下载 Android SDK 组件?

rest - 如何在同一端口上启用带TLS的gRPC和REST服务

ssl - 如何使用 TLS 连接到 GRPC?

function - 更改函数中的全局 slice

go - 在 golang pprof 中显示函数调用次数

java - 这个打开/关闭 JDBC 连接代码可以吗?

c# - ADO.NET:检查数据库服务器是否可访问的更快方法?