gRPC 是由 Google 开源的一款高性能、跨语言的远程过程调用(RPC)框架,因为它是目前主流的框架,因此博主准备开始学习这个框架,并且基于此框架构建一套微服务
安装必须的第三方库:
py
pip install grpcio
文章目录
gRPC的程序分为两个部分,一个是服务端,一个是客户端,这里博主整理了一个简单的示例程序,方便学习:
服务端代码
py
import json
from concurrent import futures
import grpc
# 客户端的请求
def say_hello(request, _context):
return {"message": f"Hello, {request['name']}!"}
# ================== 开始服务端的配置 ======================
# 创建 gRPC 服务,并使用线程池处理客户端请求。
server = grpc.server(futures.ThreadPoolExecutor(max_workers=2))
# 注册 SayHello 方法,同时指定请求和响应的 JSON 转换方式。
handler = grpc.unary_unary_rpc_method_handler(
say_hello,
request_deserializer=lambda data: json.loads(data.decode("utf-8")),
response_serializer=lambda response: json.dumps(response).encode("utf-8"),
)
# 注册服务名称和方法名称,客户端必须使用相同的名称调用。
server.add_generic_rpc_handlers(
(grpc.method_handlers_generic_handler("hello.Greeter", {"SayHello": handler}),)
)
# 启动 gRPC 服务,监听 50051 端口。
server.add_insecure_port("[::]:50051")
server.start()
print("gRPC 服务已启动:127.0.0.1:50051")
# 阻塞直到主动退出
server.wait_for_termination()
这里就定义了一个简单的gRPC的服务:
- 它启动2个线程
- 注册了一个
"hello.Greeter"的服务名,这个服务下有个"SayHello"的方法(唯有方法名对外暴露),如果客户端调用这个方法,那么它被指引的执行函数是后面的handler
客户端代码
对应的客户端代码:
py
import json
import grpc
# 连接地址必须和 server.py 中的端口一致。
with grpc.insecure_channel("127.0.0.1:50051") as channel:
# 指定要调用的服务方法:/服务名/方法名。
say_hello = channel.unary_unary(
"/hello.Greeter/SayHello",
# 发送请求前:Python 字典转换为 JSON 字节。
request_serializer=lambda data: json.dumps(data).encode("utf-8"),
# 收到响应后:JSON 字节转换为 Python 字典。
response_deserializer=lambda data: json.loads(data.decode("utf-8")),
)
# 发送名称,并获取服务端返回的问候消息。
response = say_hello({"name": "World"})
print(response["message"])
这个客户端便是使用grcp调用之前注册的服务名/方法名的办法,并且传入参数进去。