4

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)。

4

1 回答 1

4

您使用的两个示例基于不兼容的原型定义。问题是 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{},
}
于 2015-03-11T00:11:00.563 回答