英文:
Are the grpc examples intended to speak across languages?
问题
gRPC示例的目的是互操作吗?我可以完全使用Java运行Java客户端-服务器示例。我可以完全使用Go运行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,并且我一直无法为C++构建grpc)。
英文:
Are the gRPC examples intended to interoperate? I can run the Java client-server examples entirely with Java. I can Go examples entirely with Go. But Go's hello world client won't talk with Java's hello world server.
In one terminal, from 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
In another terminal, from 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
Not the cross-language example I was expecting. SayHello is there, but is the problem with path or case sensitivity? Am I missing something, or is this cross-language cooperation an intent not yet realized?
(Caveat--I don't know Go, and I've been unable to build grpc for C++).
答案1
得分: 4
你正在使用的两个示例基于不兼容的proto定义。问题在于Java示例使用了包名grpc.example.helloworld
,而Go示例只使用了helloworld
。
由于包名是URL
路径的一部分(/helloworld.Greeter/SayHello
),所以调用失败(Java服务器期望的是/grpc.example.helloworld.Greeter/SayHello
)。
你可以在生成的代码中看到这一点。
Java:
private GreeterServiceDescriptor() {
sayHello = createMethodDescriptor(
"grpc.example.helloworld.Greeter", METHOD_SAY_HELLO);
}
Go:
var _Greeter_serviceDesc = grpc.ServiceDesc{
ServiceName: "helloworld.Greeter",
HandlerType: (*GreeterServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SayHello",
Handler: _Greeter_SayHello_Handler,
},
},
Streams: []grpc.StreamDesc{},
}
英文:
The two examples you are using are based on incompatible proto definitions. The problem is that the java example is using the package name grpc.example.helloworld
and the go example is using just the helloworld
.
And because the package name is part of the URL
path (/helloworld.Greeter/SayHello
) the call fails (the java server is expecting /grpc.example.helloworld.Greeter/SayHello
).
You can see it in the generated code.
Java:
private GreeterServiceDescriptor() {
sayHello = createMethodDescriptor(
"grpc.example.helloworld.Greeter", METHOD_SAY_HELLO);
}
Go:
var _Greeter_serviceDesc = grpc.ServiceDesc{
ServiceName: "helloworld.Greeter",
HandlerType: (*GreeterServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SayHello",
Handler: _Greeter_SayHello_Handler,
},
},
Streams: []grpc.StreamDesc{},
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论