go服务与python服务之间进行数据交互,使用gRPC框架暴露服务,进行Protobuf 交换后,对方服务收到Protobuf数据非必要无需转json,xml格式数据;
go和python都可以直接通过预生成代码获取Protobuf中的键值信息不需要非得转化为json,xml格式数据,不必去解析json,xml 的key 值信息,这样传输效率更高,比http resful 快。
解释几个名词
gRPC :本质是一个高性能、跨语言的开源 RPC(远程过程调用)框架,由 Google 开发并开源。核心目标是让不同机器上的服务像调用本地函数一样交互,简化分布式系统发。类比理解为传统 RPC 像“打电话”——告诉对方要做什么,对方返回结果;gRPC 是“升级版电话”:通话质量更高(高性能)、支持多国语言(跨语言)、还能双向实时对话(流式通信)
I.协议层:
gRPC 依赖 HTTP/2 协议传输数据(二进制传输)但封装了二进制帧和流控制,性能高于普通 HTTP API,相比 http RESTful,http/2支持多路复用、头部压缩,Protobuf 序列化速度比 json快 5-10 倍
II.服务部署:
✅ 默认要求 HTTPS协议强制加密
gRPC 基于 HTTP/2 传输协议,而 HTTP/2 标准要求必须使用 TLS 加密(即 HTTPS)。
若未配置HTTPS,客户端连接会因协议不兼容失败(常见错误如StatusCode=Unavailable)。
⚠️ 例外情况:允许 HTTP 的场景
需同时满足以下条件:
内网安全环境仅限可信内部网络(如企业内网、Kubernetes 集群内),无需防范中间人攻击。
显式配置服务端与客户端
服务端:监听协议指定为Http2(如.NETCore的Kestrel 配置 “Protocols”: “Http2”)。
b.客户端:启用非加密HTTP/2支持.NET设置
AppContext.SetSwitch(“Http2UnencryptedSupport”, true)
语言支持
需编程语言 SDK提供 HTTP兼容方案(Java/C++/Go等可通过配置实现)。
注意:公网或生产环境慎使用 HTTP,否则面临数据泄露风险
Protobuf:(Protocol Buffers)是 Google 开发的一种数据打包工具,就像快递员打包物品一样,它能把你的数据压缩成很小的二进制包裹,方便在不同服务之间快速递。
简单来说:
它比 JSON/XML 更小更快(体积小60-80%,速度快5-10倍)
用 .proto 文件定义数据结构(就像写快递单说明包裹里有什么)
通过 protoc 工具生成各种语言的代码(自动生成打包/拆包说明书)
一、直接访问 Protobuf 数据的正确性
无需 JSON 转换
Protobuf 在编译时会预生成强类型代码,Go/Python 可通过生成的类/结构体直接读写字段值
示例(Python 接收端直接访问字段):
response = person_pb2.Person(name=“Alice”, id=123)
print(response.name) # 输出: Alice
Go 发送端同理通过 GetName() 等方法访问。
避免额外序列化开销
JSON 转换涉及两次序列化(Protobuf→二进制→JSON),直接操作 Protobuf 对象省去中间步骤,降低 CPU 和内存消耗
。
✅ 直接操作 Protobuf 对象是最佳实践(这是 Protobuf 设计的核心目的)
二、传输效率更高
指标
Protobuf 直接交互
①网络带宽:节省 60%~80%
②cpu开销:仅1次二进制
③数据访问速度:速度纳秒级(直接内存访问)
中转json方案
①网络带宽:文本冗余大
②CPU 开销:2 次序列化(Protobuf→二进制→JSON)
③微秒级(JSON 解析)
数据访问速度
纳秒级(直接内存访问)
微秒级(JSON 解析)
网络流量减少60-80%(二进制压缩)
序列化速度提升5-8倍(实测对比)
内存占用降低40%(无临时JSON对象)
三、其他优势
客户端与服务端保持长连接,避免频繁TCP握手(HTTP/1.1 需多次握手)。
适合高频调用场景(如微服务间通信),显著减少网络开销
。
四、总结
协议关联:
微服务架构中,Gin 常作为 gRPC 网关,Django 专注业务逻辑,两者通过 gRPC/HTTP 协同
框架定位:
Gin/Django 是 Web 开发框架,可通过扩展支持 gRPC 或 HTTP 双协议。
实践意义:
gRPC 是构建在 HTTP/2 之上的通信框架,非 HTTP 替代品。
HTTP (REST) 与 gRPC 是不同层级的解决方案(前者是协议,后者是框架)。