gRPC示例是否打算进行互操作?我可以完全使用Java运行Java客户端 - 服务器示例。我可以完全用Go去做例子。但Go的hello world客户端不会与Java的hello world服务器通信。
在一个终端中,来自grpc-java:
$ ./gradlew :grpc-examples:helloWorldServer
:grpc-core:compileJava UP-TO-DATE
...
:grpc-examples:helloWorldServer
Mar 10, 2015 7:01:50 PM io.grpc.examples.helloworld.HelloWorldServer start
INFO: Server started, listening on 50051
> Building 96% > :grpc-examples:helloWorldServer
在另一个终端,来自grpc-common / go
$ go run greeter_client/main.go
2015/03/10 19:02:47 could not greet: rpc error: code = 12 desc = "Method not found: /helloworld.Greeter/SayHello"
exit status 1
不是我期待的跨语言示例。 SayHello在那里,但路径或区分大小写的问题是什么?我错过了什么,或者这种跨语言合作的目的尚未实现?
(警告 - 我不知道Go,我一直是unable to build grpc for C++)。
答案 0 :(得分:3)
您使用的两个示例基于不兼容的原型定义。问题是java示例使用的是包名grpc.example.helloworld
,而go示例仅使用helloworld
。
因为包名是URL
路径(/helloworld.Greeter/SayHello
)的一部分,所以调用失败(java服务器期待/grpc.example.helloworld.Greeter/SayHello
)。
您可以在生成的代码中看到它。
爪哇:
private GreeterServiceDescriptor() {
sayHello = createMethodDescriptor(
"grpc.example.helloworld.Greeter", METHOD_SAY_HELLO);
}
转到:
var _Greeter_serviceDesc = grpc.ServiceDesc{
ServiceName: "helloworld.Greeter",
HandlerType: (*GreeterServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SayHello",
Handler: _Greeter_SayHello_Handler,
},
},
Streams: []grpc.StreamDesc{},
}