4

gRPC の例は相互運用を意図していますか? Java クライアント/サーバーの例はすべて Java で実行できます。Go で完全に Go の例を使用できます。しかし、Go の hello world クライアントは、Java の hello world サーバーと通信しません。

1 つのターミナルで、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

使用している 2 つの例は、互換性のないプロト定義に基づいています。問題は、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 に答える