当前位置: 首页 > news >正文

gRPC技术解析与python示例

在这里插入图片描述

一、gRPC 核心架构

1. 多语言存根
2. HTTP/2传输
3. 多语言实现
生成
生成
客户端
gRPC客户端库
gRPC服务端库
服务端业务逻辑
Protobuf IDL

二、成为「多语言RPC标准」的 5 大支柱

1. 语言无关的接口定义

使用 Protobuf 作为接口定义语言(IDL):

// 服务定义 (hello.proto)
syntax = "proto3";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}
2. 多语言代码生成
# Python
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto# Go
protoc --go_out=. --go-grpc_out=. hello.proto# Java
protoc --java_out=. --grpc-java_out=. hello.proto

生成的语言特定代码:

  • Python:hello_pb2.py, hello_pb2_grpc.py
  • Go:hello.pb.go
  • Java:HelloGrpc.java
3. 基于 HTTP/2 的传输层
Client Server HEADERS帧(开始调用) DATA帧(序列化的请求) HEADERS帧(响应头) DATA帧(序列化响应) Client Server

优势:

  • 二进制帧多路复用(单连接并发处理)
  • 头部压缩(HPACK)
  • 双向流式传输
4. 跨语言数据类型系统

Protobuf 定义通用数据类型:

Protobuf 类型PythonGoJava
stringstrstringString
int32intint32int
boolboolboolboolean
repeatedList[...][]...List<...>
5. 统一的服务治理

所有语言共享相同能力:

// 健康检查服务(所有语言通用)
service Health {rpc Check(HealthCheckRequest) returns (HealthCheckResponse);rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}

三、多语言通信示例(Python ↔ Go)

Python 服务端
# server.py
from concurrent import futures
import grpc
import hello_pb2, hello_pb2_grpcclass Greeter(hello_pb2_grpc.GreeterServicer):def SayHello(self, request, context):return hello_pb2.HelloReply(message=f"Python服务欢迎您, {request.name}!")def serve():server = grpc.server(futures.ThreadPoolExecutor())hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)server.add_insecure_port('[::]:50051')server.start()server.wait_for_termination()if __name__ == '__main__':serve()
Go 客户端
// client.go
package mainimport ("context""log""os""google.golang.org/grpc"pb "path/to/hello.pb.go" // 自动生成的代码
)func main() {conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())defer conn.Close()client := pb.NewGreeterClient(conn)resp, _ := client.SayHello(context.Background(), &pb.HelloRequest{Name: "Go开发者"})log.Printf("收到Python响应: %s", resp.Message)
}
运行结果
# 启动Python服务
$ python server.py# 运行Go客户端
$ go run client.go
2023/05/20 10:00:00 收到Python响应: Python服务欢迎您, Go开发者!

四、gRPC 核心优势解析

特性传统 RPCgRPC
传输协议自定义 TCP/UDP标准 HTTP/2
数据编码各实现不同(JSON/二进制)Protobuf(高效二进制编码)
接口定义语言特定接口文件统一的 Protobuf IDL
跨语言调用需手动适配自动代码生成 + 统一规范
流式处理部分支持原生支持四种流模式
服务治理分散实现内置健康检查/负载均衡/超时控制

五、四种流式通信模式(多语言通用)

service StreamService {// 1. 简单RPCrpc SimpleCall(Request) returns (Response) {};// 2. 服务端流式rpc ServerStream(Request) returns (stream Response) {};// 3. 客户端流式rpc ClientStream(stream Request) returns (Response) {};// 4. 双向流式rpc BidirectionalStream(stream Request) returns (stream Response) {};
}

Python 双向流示例

# 服务端实现
def BidirectionalStream(self, request_iterator, context):for request in request_iterator:yield process_request(request)# 客户端调用
responses = stub.BidirectionalStream(iter([req1, req2]))
for response in responses:handle_response(response)

六、适用场景

  1. 微服务间通信

    gRPC
    gRPC
    Python订单服务
    Java库存服务
    Go支付服务
  2. 移动APP与后端通信

    • iOS/Android 直接使用 gRPC 原生库
  3. 物联网设备通信

    • 资源受限设备使用 gRPC-Web
  4. 云原生基础设施

    • Kubernetes 的 etcd 使用 gRPC 通信
    • Istio 服务网格控制平面

七、生态工具链

工具用途多语言支持
grpc-gateway自动生成 RESTful API 代理
grpc-web浏览器支持
grpc-health-probeKubernetes 健康检查
OpenTelemetry分布式追踪

通过 Protobuf 统一契约 + HTTP/2 高效传输 + 自动代码生成,gRPC 实现了真正的跨语言 RPC 标准化。其设计哲学是:一次定义接口,随处生成客户端,使多语言微服务体系成为可能。

http://www.lqws.cn/news/545005.html

相关文章:

  • Python基础知识之文件
  • JMH (Java Microbenchmark Harness)
  • .NET MAUI跨平台串口通讯方案
  • (LeetCode 面试经典 150 题 ) 238. 除自身以外数组的乘积 (前缀和)
  • LeetCode 312 戳气球题解(Swift)+ 区间 DP 原理详解 + 可运行代码
  • WSL升级到24.04
  • 使用 asp.net core webapi 导出数据文件
  • .NetCore+Vue快速生产框架开发详细方案
  • LeetCode 349题解 | 两个数组的交集
  • 苍穹外卖day5--Redis设置店铺营业状态
  • 基于ubuntu 22.04环境安装NEURON仿真器
  • jenkins中执行python脚本导入路径错误
  • 跟着AI学习C#之项目实战-电商平台 Day3
  • 《聊一聊ZXDoc》之汽车服务导向SOME/IP
  • 自动登录脚本神器-Mac电脑实现自动登录堡垒机并自动输入账号密码跳转不同机器环境
  • uniapp处理后端返回的html字符串
  • spring-security-oauth2系列:自定义认证服务器
  • 为什么python处理csv文件将某个值替换成另一个值并另存后,csv文件的大小减小了一半
  • Nginx 与 Apache:有什么区别?哪种服务器最适合您?
  • 【数据挖掘】数据采集和预处理
  • 如何确保京东商品数据采集的准确性和及时性?
  • 【lua】Linux上安装lua和luarocks包管理工具
  • 提升AI准确性的关键:精准添加上下文
  • 【NodeJs】【npm】npm安装electron报错
  • Python Async 编程快速入门 | 超简明异步协程指南
  • C++常用算法解析:sort、find、for_each、copy
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-116节(封装)
  • cuda编程笔记(5)--原子操作
  • UI前端与数字孪生结合案例分享:智慧零售的可视化解决方案
  • 北京燃气集团管道腐蚀智能预测实践:LSTM算法驱动能源设施安全升级