1. 什么是 gRPC
gRPC 是 Google 开源的高性能、通用的开源 RPC 框架,支持多种编程语言。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特点。由于 gRPC 采用 Protocol Buffers (protobuf)做为其 IDL(接口定义语言),可使其具有更高效的序列化和更紧凑的消息格式。 因此,gRPC 得到了云原环境,微服务架构以及性能密集型应用程序的广泛应用。
2. 安装 gRPC
2.1 安装 protobuf
在安装 gRPC 之前,需要先安装 Protobuf 3,可从 官网 下载相应的版本进行安装。
假设 protobuf 已安装到本地,并且 PATH 配置正确,可在命令行输入以下命令验证:
# 查看 protoc 版本
protoc -version
2.2 安装 gRPC
推荐使用 pip 安装 gRPC:
python -m pip install grpcio
若要安装 gRPC 的依赖包 grpcio-tools:
python -m pip install grpcio-tools
3. 使用 Python 实现 gRPC 服务端和客户端
下面通过一个简单的示例,介绍如何使用 Python 实现一个 gRPC 服务端和客户端:
3.1 定义 protobuf 文件
首先定义一个 .proto 文件:
syntax = "proto3";
package helloworld;
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
3.2 使用 protobuf 编译器生成代码
在 .proto 文件所在目录下,运行以下命令:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
执行此命令后,将生成以下两个 Python 文件:
helloworld_pb2.py :包含了与 proto 文件中 message 和 service 相关的类。
helloworld_pb2_grpc.py :包含了服务端的类,可覆盖 rpc 方法等。
3.3 实现服务端程序
在 Python 文件中实现服务端程序:
import grpc
from concurrent import futures
import time
import helloworld_pb2
import helloworld_pb2_grpc
class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
reply = helloworld_pb2.HelloReply()
reply.message = f"Hello, {request.name}!"
return reply
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(60 * 60 * 24)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
注意:
add_GreeterServicer_to_server()
:将服务对象添加到服务器上。
server.start()
:启动服务器。
server.stop()
:停止服务器。
3.4 实现客户端程序
在客户端中需要连接到服务器并调用其方法。
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name='world'))
print("Greeter client received: " + response.message)
if __name__ == '__main__':
run()
注意:
with grpc.insecure_channel()
:创建一个未经身份验证的通道。
stub.SayHello()
:调用 RPC 方法。
4. 运行 Python 程序
在控制台执行以下命令以启动服务器:
python greeter_server.py
在另一个终端中,执行以下命令以启动客户端:
python greet_client.py
运行结果如下:
Greeter client received: Hello, world!
总结
gRPC 框架为分布式系统提供高效、可扩展的远程调用机制。Python 实现 gRPC 服务端和客户端虽然不如 C++、Java、Go 等语言效率高,但在某些场景下其优雅简洁的语言特性可以带来更好的编写体验和更快的开发速度。