CodeWalk

gRPC Python:protobuf定义与服务实现

作者:专业代码师 · 2026-05-30 12:55

请介绍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 |