0

0

gRPC支持Json编码:不修改协议直接支持Rest访问

P粉602998670

P粉602998670

发布时间:2026-02-15 13:40:03

|

416人浏览过

|

来源于php中文网

原创

不能。grpc原生不支持json/http接口,需通过grpc-gateway添加转换层;必须在.proto中添加google.api.http注解(如post: "/v1/messages" body: "*"),并同时生成grpc stub与http handler,启动两个服务,无法跳过注解或自动映射。

grpc支持json编码:不修改协议直接支持rest访问

gRPC服务如何不改.proto就暴露JSON/HTTP接口

不能。gRPC原生协议是基于HTTP/2的二进制传输,grpc-gogrpc-java等官方实现默认不解析JSON请求体,也不自动生成REST路由。所谓“不修改协议直接支持”,本质是加一层转换层,而非gRPC自身能力。

用gRPC-Gateway实现JSON/HTTP到gRPC的透明转发

这是最常用、也最接近“不改.proto”的方案:在gRPC服务旁启动一个反向代理,把/v1/some/path这类REST请求,按预定义规则映射成gRPC调用。关键在于.proto里加google.api.http注解,不是完全不改,而是只改注释不改消息结构和方法签名。

  • 必须引入google/api/annotations.proto并import
  • 每个rpc方法上方加option (google.api.http) = {post: "/v1/messages" body: "*"}这类声明
  • 生成代码时需同时跑protoc生成gRPC stub + protoc-gen-grpc-gateway生成HTTP handler
  • 启动时要同时起gRPC server和gateway server(后者作为独立HTTP/1.1服务)

示例注解:option (google.api.http) = {get: "/v1/users/{name}"}; → 自动从URL path提取name字段填入request message

上班人导航
上班人导航

上班人必备的职场办公导航网站

下载

为什么不能跳过注解直接“自动映射”

因为gRPC没有URI路径、HTTP方法、查询参数这些概念,而REST依赖它们。没有google.api.http注解,gateway无法知道:ListUsers该对应GET /users还是POST /users:list?分页参数放query还是body?id字段该从path取还是从JSON body取?

  • 不写注解 → gateway生成空路由或报错no HTTP rule found
  • 注解写错(比如body: "user"但message里没user字段)→ 请求时返回400 Bad Request且无明确提示
  • 忽略body: "*"body: "id"区别 → 前者把整个JSON当message,后者只取JSON中id字段赋值,其余丢弃

性能与部署实际影响

gateway是独立进程或goroutine,每次REST请求会多一次HTTP解析+JSON反序列化+gRPC序列化+网络调用,延迟比直连gRPC高1–3ms(本地环境),吞吐下降约20–40%。线上务必让gateway和gRPC backend走localhost或同一AZ内网。

  • 不要把gateway和gRPC server打包进同一个二进制再用net/http复用端口 —— 它们协议不兼容,强行混用会导致HTTP/2连接被gRPC server拒绝
  • gateway默认不校验JWT,需要手动集成runtime.WithForwardResponseOption或中间件
  • gRPC服务升级时,gateway的.proto必须同步重新生成,否则新字段不会出现在JSON响应里

真正省事的点只有一个:不用重写业务逻辑,但注解、生成步骤、双服务部署,一个都绕不开。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

206

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

235

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

346

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

403

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

343

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

197

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

866

2025.06.17

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号