gRPC 连接问题:如何判断是服务端还是客户端?
gRPC connectivity problem: How to figure out if it is the server or the client?
我正在阅读一本名为 "Go Blueprints" 的 Golang 书。所以其中一章是关于实现微服务的。与该服务的通信可以是 http 或 gRPC。我认为我做的一切都是对的,但是我无法进行 gRPC 通信。当我尝试从客户端询问服务器时,出现此错误:
rpc error: code = Unimplemented desc = unknown service Vault
我的问题是如何开始调试这个?如何判断问题出在服务器端还是客户端?
在您的实施中,当您为 Hash
和 Validate
初始化端点时,服务名称是错误的。它应该是 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,
}
}
一般来说,您应该参考匹配 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",
}
我正在阅读一本名为 "Go Blueprints" 的 Golang 书。所以其中一章是关于实现微服务的。与该服务的通信可以是 http 或 gRPC。我认为我做的一切都是对的,但是我无法进行 gRPC 通信。当我尝试从客户端询问服务器时,出现此错误:
rpc error: code = Unimplemented desc = unknown service Vault
我的问题是如何开始调试这个?如何判断问题出在服务器端还是客户端?
在您的实施中,当您为 Hash
和 Validate
初始化端点时,服务名称是错误的。它应该是 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,
}
}
一般来说,您应该参考匹配 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",
}