Python gRPC 与跨语言 gRPC 调用
本文是我上一篇文章《 Go 微服务基础:Protobuf & gRPC》的延伸,在开始本文前,建议先看一看那篇文章。
在《 Go 微服务基础:Protobuf & gRPC》一文中,我们介绍了 protobuf 的基础。随后定义了一个 userinfo proto 作为接口,实现了一套 Golang 版本的服务端、客户端。
本文中,我们继续使用那个 userinfo proto 作为接口,去实现一套 Python 版本的服务端、客户端,在实例中入门 Python gRPC 使用。然后,我们做一个有意思的尝试 —— Golang 与 Python 版本客户端、服务端的跨语言调用。
文章目录
Python gRPC 入门
首先,我们了解一下如何配置 Python 的 gRPC 环境,如何把 proto 文件编译出 Python 接口,如何实现服务端、客户端。
安装 gRPC Python
安装 gRPC Python 组件:
pip3 install grpcio
pip3 install grpcio-tools
编写 proto 生成接口
编写 proto 文件,这里我们直接复制《 Go 微服务基础:Protobuf & gRPC》一文中的 proto:
syntax = "proto3";
package proto;
// 用户信息请求参数
message UserRequest {
string name = 1;
}
// 用户信息请求响应
message UserResponse {
int32 id = 1;
string name = 2;
int32 age = 3;
repeated string hobby = 4;
}
// 用户信息接口
service UserInfo {
// 获取用户信息,请求参数为 UserRequest,返回响应为 UserResponse
rpc GetUserInfo (UserRequest) returns (UserResponse) {}
}
编译。注意是使用 grpc_tools.protoc
这个 Python 专用的编译器,而不是使用 protoc
哦:
python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. ./userinfo.proto
会生成两个文件:
userinfo_pb2.py
:请求、响应数据结构的定义的类:(proto 文件中的 message)UserRequest
UserResponse
userinfo_pb2_grpc.py
:服务端、客户端的定义的类:(proto 文件中的 service)UserInfoServicer
:服务端UserInfoStub
:客户端
注:这里文件名里的
pb2
和 protobuf 语法的版本(syntax = "proto3"
)没关系。这个 pb2 只是表示是用的 Protocol Buffers Python API 版本为 2。
服务端实现
查看 userinfo_pb2_grpc.py
里生成的代码可以知道,Python gRPC 的服务实现是写一个子类去继承 proto 编译生成的 userinfo_pb2_grpc.UserInfoServicer
,在子类中实现 RPC 的具体服务处理方法。
from concurrent import futures
import grpc
import userinfo_pb2
import userinfo_pb2_grpc
class UserInfoServicer(userinfo_pb2_grpc.UserInfoServicer):
"""UserInfoServicer 具体实现 userinfo_pb2_grpc.UserInfoServicer,处理 RPC 服务
"""
def GetUserInfo(self, request, context):
"""获取用户信息,请求参数为 UserRequest,返回响应为 UserResponse
"""
name = request.name
# Fake query
if name ==