如何运行Python实现的gRPC客户端与C++实现的服务端?
gRPC 跨语言开发(Python客户端/C++服务端)实操指南
先搞懂核心概念,别上来就瞎跑代码
- Protobuf:gRPC默认的序列化协议,所有接口定义、传输的数据结构都写在
.proto后缀的文件里,不管你用什么语言写客户端/服务端,都靠这个文件生成对应语言的接口代码,是跨语言能通信的核心契约,缺了它啥都跑不起来 - 服务端:负责实现
.proto里定义好的服务接口逻辑,绑定端口监听客户端发过来的请求,处理完返回结果,你手里的server.cpp就是C++写的服务端逻辑实现 - 客户端:gRPC会自动生成对应语言的存根(Stub),你直接调用存根里的方法就行,不用自己写TCP连接、序列化、网络收发这些底层逻辑,
client.py就是Python写的客户端调用逻辑 - Makefile:一般是提前写好的自动化脚本,包含了Protobuf代码生成、C++服务端编译、依赖库链接的所有命令,不用你手动敲一长串编译参数
跑代码前先检查文件完整性
你当前目录下除了client.py、server.cpp、Makefile,必须要有对应的.proto接口定义文件,一般命名类似hello.proto、rpc_service.proto,这是所有代码生成的源头,没有的话先找提供代码的人要。
按顺序执行就能跑通
- 先执行Protobuf代码生成+服务端编译,直接在当前目录跑命令:
make
执行完目录里会多出自动生成的代码文件:- C侧:
xxx.pb.h、xxx.pb.cc(Protobuf数据结构的序列化/反序列化代码)、xxx.grpc.pb.h、xxx.grpc.pb.cc(gRPC C端的存根代码) - Python侧:
xxx_pb2.py(Python版的数据结构代码)、xxx_pb2_grpc.py(Python版的客户端存根代码)
如果make报错,先补依赖:C++端提前装grpc、protobuf、grpc-dev的系统开发包;Python端提前用pip装
grpcio、grpcio-tools两个包。 - C侧:
- 启动C服务端:
make执行成功后会生成C服务端的可执行文件,一般就叫server,直接跑:./server
正常启动后终端会打印监听端口的日志(默认一般是0.0.0.0:50051),这个终端别关,服务端要一直挂着。 - 启动Python客户端:
新开一个终端,切到同一个目录,执行:python3 client.py
正常情况下客户端会发起请求,收到服务端的返回结果并打印在终端,说明整个gRPC链路跑通了。
日常修改操作方法
- 要改接口定义、传输数据结构:别直接改自动生成的pb后缀文件,直接改
.proto源文件,改完重新执行make生成所有语言的新代码,再重启服务端、重跑客户端就行 - 要改服务端业务逻辑:直接改
server.cpp里对应服务方法的实现代码,改完重新执行make编译,重启服务端就生效 - 要改客户端调用逻辑:直接改
client.py里的请求参数构造、方法调用逻辑,改完不用编译,直接重跑Python脚本就行
常见踩坑点
- 服务端监听的地址端口必须和客户端连接的地址端口一致,别服务端绑了50051端口,客户端写50052,肯定连不上
- Python客户端导入pb文件报错的话,把生成的
_pb2.py、_pb2_grpc.py文件放到和client.py同目录,或者手动把当前目录加到Python导入路径里 - 改完
.proto文件一定要两端都重新生成代码,别只更了C++端或者只更了Python端,会出现字段对不上、序列化失败的问题
内容的提问来源于stack exchange,提问作者Vsdm in
相关产品推荐
相关产品推荐

