最近在搞微服务,学习了一下 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
leonme 2022-02-23 12:35:57 +08:00 via iPhone
报错信息不是说 implement 问题吗?
|
2
CEBBCAT 2022-02-23 12:41:53 +08:00 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-02-23 13:01:33 +08:00
@longmeier90 拿 message 举例,因为这些定义是大家都要用的,那么可以把 message 放到单独一个仓库,构建时引入,然后 protoc 编译
另外查到了一个问题 https://stackoverflow.com/q/55922886 |
6
masterclock 2022-02-23 13:08:29 +08:00
reflection 查看 python-server 端的 method 名字是什么
log 、抓包等方法查看 go-client 发出的请求的 method 不共享 proto 的 buf 的模式挺常见的,但确实麻烦 https://docs.buf.build buf 用来集中管理很不错 |
7
so1n 2022-02-23 13:33:03 +08:00
你可以抽到一个 common 仓库里面,这个仓库用一个文件夹存 proto 文件 然后每次当一个版本进行提交,提交的时候使用工具或者 ci 在提交时顺便用工具生成对应语言的代码并打包(或者这个仓库就是一个包), 这样对应的语言就可以用到这个包了
|
8
longmeier90 OP 貌似这个问题解决啦, 我把 python-server 服务的端口由 50051 -> 9400 ; go-client 就可以正常调用啦。有点搞呀
|