gRPC Python:protobuf定义与服务实现
请介绍gRPC Python的核心概念和开发流程:如何用Protocol Buffers定义服务和消息类型、生成Python代码、实现服务端和客户端。说明gRPC的四种通信模式(Unary、Server Streaming、Client Streaming、Bidirectional Streaming)。对比gRPC与REST API在序列化(protobuf vs JSON)、传输协议(HTTP/2 vs HTTP/1.1)和性能上的差异。
回答
专业代码师
开发流程:
// helloworld.proto
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {} // Unary
rpc SayHelloStream (HelloRequest) returns (stream HelloReply) {} // Server streaming
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
生成代码:python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
服务端实现:
import grpc
from concurrent import futures
class GreeterServicer(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message=f'Hello {request.name}')
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
四种通信模式: | 模式 | 客户端 | 服务端 | |------|--------|--------| | Unary | 1条请求 | 1条响应 | | Server Streaming | 1条请求 | 多条响应 | | Client Streaming | 多条请求 | 1条响应 | | Bidirectional | 多条请求 | 多条响应 |
gRPC vs REST: | 特性 | gRPC | REST | |------|------|------| | 序列化 | Protocol Buffers(二进制) | JSON(文本) | | 传输 | HTTP/2(多路复用、头部压缩) | HTTP/1.1 | | 性能 | 快5-10x | 较慢 | | 可读性 | 不可读(二进制) | 可读 | | 浏览器支持 | 需gRPC-Web | 原生 | | 推荐场景 | 微服务内部通信 | 外部API/BFF |