
最近在搞微服务,学习了一下 grpc ,试着写了连个测试,发现一个问题
go-client 无法调用 python-server 错误 error:code = Unimplemented desc = RPC method not implemented /Greeter/SayHello; 但是 python-client 访问 python-server 、go-server 都没问题,go-client 访问 go-server 也没有问题。查了一下都说是包名称的不一样。我把两边的 proto 文件弄成一模一样重新生成也还是报这个 error --------python------- syntax = "proto3"; package proto; service Greeter{ rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest{ string name = 1; } message HelloReply{ string message = 1; } --------go---------- syntax = "proto3"; option go_package = ".;proto"; package proto; service Greeter{ rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest{ string name = 1; } message HelloReply{ string message = 1; } 1 leon0318 2022 年 2 月 23 日 via iPhone 报错信息不是说 implement 问题吗? |
2 CEBBCAT 2022 年 2 月 23 日 via iPhone 我只是想问一下,这两边的 proto 文件是不是应该共享一个? |
3 longmeier90 OP @CEBBCAT 怎么共享,两个项目有可能都不在同一台服务器上。 |
4 longmeier90 OP @leonme 是呀,我没指定包名称的时候 提示 RPC method not implemented /Greeter/SayHello ;当我指定包名称 proto 时提示 RPC method not implemented /protol.Greeter/SayHello 。就单单 go-client 无法调用 python-server; |
5 CEBBCAT 2022 年 2 月 23 日 @longmeier90 拿 message 举例,因为这些定义是大家都要用的,那么可以把 message 放到单独一个仓库,构建时引入,然后 protoc 编译 另外查到了一个问题 https://stackoverflow.com/q/55922886 |
6 masterclock 2022 年 2 月 23 日 reflection 查看 python-server 端的 method 名字是什么 log 、抓包等方法查看 go-client 发出的请求的 method 不共享 proto 的 buf 的模式挺常见的,但确实麻烦 https://docs.buf.build buf 用来集中管理很不错 |
7 so1n 2022 年 2 月 23 日 你可以抽到一个 common 仓库里面,这个仓库用一个文件夹存 proto 文件 然后每次当一个版本进行提交,提交的时候使用工具或者 ci 在提交时顺便用工具生成对应语言的代码并打包(或者这个仓库就是一个包), 这样对应的语言就可以用到这个包了 |
8 longmeier90 OP 貌似这个问题解决啦, 我把 python-server 服务的端口由 50051 -> 9400 ; go-client 就可以正常调用啦。有点搞呀 |