grpc 示例是不是旨在跨语言交流?

Posted

技术标签:

【中文标题】grpc 示例是不是旨在跨语言交流?【英文标题】:Are the grpc examples intended to speak across languages?grpc 示例是否旨在跨语言交流? 【发布时间】:2015-03-10 23:18:19 【问题描述】:

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,我一直是 unable to build grpc for C++)。

【问题讨论】:

【参考方案1】:

您使用的两个示例基于不兼容的原型定义。问题是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);

去:

var _Greeter_serviceDesc = grpc.ServiceDesc
        ServiceName: "helloworld.Greeter",
        HandlerType: (*GreeterServer)(nil),
        Methods: []grpc.MethodDesc
            
                MethodName: "SayHello",
                Handler: _Greeter_SayHello_Handler,
            ,
        ,
        Streams: []grpc.StreamDesc,

【讨论】:

那么解决办法是什么?这些示例声称是基于相同的helloworld.proto 构建的。他们是?它不应该构建兼容的 URL 吗? (抱歉。如果我能够构建 expletive C++ 的东西,我可能会理解这一点。当我解决这个问题时,我并不打算学习 Go。) 他们不是,java示例使用的是这个:github.com/grpc/grpc-java/blob/master/examples/src/main/proto/…

以上是关于grpc 示例是不是旨在跨语言交流?的主要内容,如果未能解决你的问题,请参考以下文章

深度解析gRPC以及京东分布式服务框架跨语言实战

漫谈grpc 2:实战grpc,跨语言的rpc框架到底好不好用,试试就知道

gRPC收发请求过程解析

06-gRPC收发请求过程解析

06-gRPC收发请求过程解析

每天进步一点点:go基于grpc构建微服务框架-服务注册与发现