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

gRPC vs REST:内部服务用 gRPC,对外接口用 REST

你好我是码哥《Redis 高手心法》畅销书作者可以叫我靓仔gRPC vs REST新项目启动技术方案评审架构师问一句「内部服务间通信你打算用什么协议」很多 2-3 年经验的工程师这时候会说「REST 比较通用但 gRPC 性能好我们可以先用 REST 后面再迁……」这个答案在架构师眼里等于没答。我见过太多团队因为这种模糊判断三个月后陷入两种困境要么内部微服务全用 REST接口联调堆满 DTO 转换序列化开销吃掉了 20% 的 CPU要么一上来全用 gRPC对外接口也用结果移动端 SDK 调试两周没跑通产品催着上线。这篇文章给出的结论很明确内部服务间通信用 gRPC对外 API 用 REST。这条线不是拍脑袋后面会用数据和具体原因说清楚。先给出答案image-20260322211840586如果你时间紧先看这张表你的场景推荐协议核心理由微服务之间的内部调用gRPC性能高、强类型契约、天然流式支持对外暴露的业务 APIWeb/App 消费REST生态成熟、调试方便、前端直接用需要浏览器直接调用RESTgrpc-web 需要 Envoy 代理复杂度高不值得实时数据流日志、监控、音视频gRPC双向流式通信是核心能力REST 做不到第三方开放平台 APIREST开发者体验优先REST OpenAPI 文档生成是行业标准IoT 设备上报数据gRPC或MQTTProtobuf 体积小弱网环境友好一句话总结以服务通信边界为核心——跨组织/跨端边界用 REST组织内部的服务网格用 gRPC。它们分别在解决什么问题理解这两个东西为什么会同时存在要从它们的设计初衷说起。REST诞生于 2000 年 Roy Fielding 的博士论文。它的设计目标是互联网级别的可扩展性——任何人用任何语言拿到一个 URL 就能调用。HTTP JSON 的组合让接口描述几乎不需要额外文档curl一条命令就能测试。这种「人可读、工具无关」的特性使它在对外 API 领域几乎无可替代。gRPC是 Google 2015 年开源的 RPC 框架脱胎于 Google 内部使用了十年的 Stubby。设计目标完全不同高效的机器间通信。Google 内部每天有数十亿次 RPC 调用每一毫秒的序列化开销乘以这个量级都是真金白银。它用 Protobuf 替代 JSON用 HTTP/2 替代 HTTP/1.1牺牲了人类可读性换来机器处理效率。两个东西解决的是不同层次的问题。REST 优化的是「接口契约的可理解性和互操作性」gRPC 优化的是「服务间通信的效率和类型安全」。性能到底差多少有数字很多文章在这里用「gRPC 性能更好」一句话带过。我们看具体数字。image-20260322212132168序列化体积对比同样一条用户数据{id: 1001, name: Alice, email: aliceexample.com, age: 28}JSON 编码约68 字节Protobuf 编码约28 字节约小2.4 倍复杂嵌套对象如订单详情含商品列表差距更大Protobuf 通常比 JSON小 3-10 倍。序列化速度对比根据 Protobuf 官方 benchmark 和社区测试数据操作JSONJacksonProtobuf倍数序列化 100 万次~1800ms~320ms5.6x 更快反序列化 100 万次~2100ms~400ms5.3x 更快测试环境JVMIntel Core i7数据来自 github.com/eishay/jvm-serializers吞吐量对比在微服务场景下Uber Engineering 分享的内部测试 显示在 p99 延迟相同的条件下gRPC 的吞吐量约是 REST/JSON 的5-8 倍。这个倍数听起来吓人但要注意一件事这个差距在低频调用场景下几乎感知不到。如果你的接口 QPS 是 100REST 20msgRPC 4ms这 16ms 的差距对用户体验没有任何影响。差距真正暴露是在两种情况下高频调用服务间每秒数万次 RPC序列化开销累积成明显的 CPU 负担大 payload如批量数据同步、推荐系统特征向量传输体积差异直接影响带宽成本gRPC 的真实优势不只是性能很多工程师选 gRPC 只想到性能但实际上 gRPC 对工程质量的提升更值钱。强类型契约消灭接口文档漂移REST JSON 的典型问题接口文档和代码实现脱节。字段改了名字文档没更新联调时浪费一下午排查。gRPC 的.proto文件就是代码客户端和服务端都从同一份 proto 文件生成代码。字段类型、是否必填、枚举值——全部强制一致。// user.proto syntax proto3; package user.v1; service UserService { rpc GetUser (GetUserRequest) returns (User); rpc ListUsers (ListUsersRequest) returns (stream User); // 服务端流式 } message GetUserRequest { int64 user_id 1; } message User { int64 id 1; string name 2; string email 3; UserStatus status 4; // 枚举不会出现魔法字符串 } enum UserStatus { USER_STATUS_UNSPECIFIED 0; USER_STATUS_ACTIVE 1; USER_STATUS_INACTIVE 2; }这份 proto 文件提交到 Git任何字段变更都走 code review。接口漂移的问题从根本上解决。流式通信REST 真的做不到REST 是请求-响应模型想做实时推送要靠 SSE 或 WebSocket不在 REST 规范里。gRPC 原生支持四种通信模式模式说明适用场景Unary RPC普通请求-响应80% 的场景Server Streaming服务端持续推送实时日志、数据订阅Client Streaming客户端持续上传文件上传、数据采集Bidirectional Streaming双向实时通信聊天、协同编辑、游戏多语言代码生成微服务异构不是问题protoc 支持生成 Go、Java、Python、Node.js、Rust、C、Swift 等十几种语言的客户端代码。团队里 Go 写服务端Java 写消费端不需要手写 HTTP client直接用生成的 stub。REST 的真实优势别急着抛弃它gRPC 有这么多好处是不是所有接口都该迁移不是。调试体验是 REST 的护城河REST 接口用curl、Postman、浏览器 DevTools 都能直接测。gRPC 要用 grpcurl、BloomRPC 或 gRPC UI出了问题 Wireshark 抓包看到的是二进制不是可读的 JSON。这在排查生产问题时影响非常大。凌晨三点报警你更想对着 JSON 日志还是 Protobuf 二进制浏览器直接调用 gRPC 问题很多标准 gRPC 使用 HTTP/2 的特性浏览器的 Fetch API 没有暴露对应的底层控制能力不能直接调用 gRPC 服务。解决方案是 gRPC-Web但它需要在前端和 gRPC 服务之间加一层 Envoy 代理做协议转换。这套架构能跑但增加了运维复杂度。对外的 Web APIREST 才是正确选择。生态成熟度没得比REST OpenAPI 的文档自动生成Swagger、Mock 工具、测试框架、API 网关集成——几乎每个工具链都原生支持。gRPC 这些年追上来很多但对于对外开放平台REST 的开发者体验还是更好。综合评分评估维度gRPCREST说明原始性能吞吐/延迟★★★★★★★★gRPC 领先 5-8x序列化效率★★★★★★★★Protobuf 比 JSON 快 5x调试便利性★★★★★★★REST 完胜浏览器支持★★★★★★★gRPC-Web 需要额外代理流式通信★★★★★★★gRPC 原生支持REST 需要 hack类型安全★★★★★★★★proto 契约 vs OpenAPI非强制上手成本★★★★★★★★gRPC 需要学 proto 工具链第三方生态★★★★★★★★★REST 更成熟多语言支持★★★★★★★★★★两者都很好真实踩坑迁移到 gRPC 前要想清楚的事image-20260322212252556踩坑一Proto 字段删除导致的静默错误Protobuf 向后兼容的规则是老字段只能废弃用reserved标记不能直接删除并复用字段编号。message User { reserved 3; // 原来的 phone 字段删掉了但编号要保留 reserved phone; // 字段名也要保留防止被复用 int64 id 1; string name 2; // int64 phone 3; // 不能删了直接复用 3 号 string address 4; // 新字段用新编号 }没处理好这个新老版本服务共存时会出现字段解析到错误值的 bug而且不报错。我们生产环境踩过排查了半天。踩坑二gRPC 的错误码不是 HTTP 状态码gRPC 有自己的状态码体系OK、INVALID_ARGUMENT、NOT_FOUND、INTERNAL 等共 17 个和 HTTP 4xx/5xx 不一样。如果你的错误处理、监控告警都是基于 HTTP 状态码建的接入 gRPC 需要重新适配。// Go gRPC 服务端返回错误的正确方式 importgoogle.golang.org/grpc/codes importgoogle.golang.org/grpc/status func (s *UserServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.User, error) { user, err : s.db.FindUser(req.UserId) if err ! nil { if errors.Is(err, ErrNotFound) { // 用 gRPC 状态码不是 HTTP 404 returnnil, status.Errorf(codes.NotFound, user %d not found, req.UserId) } returnnil, status.Errorf(codes.Internal, database error: %v, err) } return user, nil }踩坑三负载均衡器对 HTTP/2 的支持gRPC 基于 HTTP/2很多传统 L4 负载均衡器比如 AWS Classic ELB对 HTTP/2 多路复用的支持有问题——会把所有 gRPC 请求都路由到同一个后端实例负载均衡变成摆设。要用支持 HTTP/2 的 L7 负载均衡器AWS ALB、Nginx 1.13.10、Envoy或者在客户端做负载均衡配合服务发现。我的建议经历过几次从 REST 迁 gRPC 的完整项目后我的判断是新建微服务项目内部服务间直接用 gRPC不要「先 REST 以后再迁」。迁移的代价远比你想象的大——不只是改接口还有监控体系、错误处理、日志格式、API 网关配置全套都要动。从一开始就选对比中途迁移省事得多。对外接口就算内部全是 gRPC也要在边界层转成 REST。最干净的做法是 gRPC 做内部服务网格在 API Gateway 层统一转换为 REST 对外暴露。这条架构线不要打破。REST 没有落后只是应用层不同。看到有人说「gRPC 是 REST 的替代品」就应该警惕——这是不理解它们设计目标差异的说法。2026 年 Stack Overflow 调查REST API 使用率仍然超过 80%不是大家保守而是 REST 在它该用的地方确实是最优解。选型不是技术比拼是用合适的工具解决合适的问题。这条边界划清楚了比任何 benchmark 数字都管用。常见问题Q现有项目全是 REST值得迁移到 gRPC 吗A看 QPS 和服务数量。单体应用或 QPS 在万级以下、服务数在 10 个以内的项目迁移收益基本覆盖不了成本。真正值得迁移的场景是高频服务间调用单个服务日均亿级请求或者跨语言服务数量超过 5 个proto 的代码生成能显著减少维护成本。QgRPC 能用 JSON 序列化而不是 Protobuf 吗A可以gRPC 支持grpc-json-transcoding也可以用google.golang.org/protobuf/encoding/protojson把 proto message 序列化成 JSON。但这样你就把 gRPC 最核心的性能优势放弃了——通常是为了兼容不支持 Protobuf 的系统做过渡方案不建议作为长期选择。QGraphQL 在这个对比里处于什么位置AGraphQL 是另一个维度的工具主要解决「前端按需取数据、避免多次请求」的问题。和 REST/gRPC 的对比不在同一层——GraphQL 通常跑在 REST over HTTP 上关注的是查询灵活性不是传输效率。如果你的核心痛点是前端多次 round-trip可以考虑 GraphQL但它不是 gRPC 的替代品。QgRPC-Web 成熟了吗可以在生产用了吗A技术上已经稳定Improbable、Square 等公司在生产用了。但架构复杂度不低——需要 Envoy 或其他代理做 HTTP/1.1 到 HTTP/2 的协议翻译调试链路变长。如果团队有 Envoy 运维经验可以上否则对外接口还是 REST 更省事。真正的 gRPC over fetch不需要代理还在草案阶段预计 2026 年底会有更成熟的方案。QProtobuf 文件如何管理版本团队协作怎么做A推荐用独立的 proto 仓库或 monorepo 里的proto/目录配合 Bufbuf.build做 lint 和破坏性变更检测。Buf 会在 CI 里拦截破坏向后兼容的字段变更是目前最好的 proto 工程化工具。buf breaking --against .git#branchmain这条命令加到 CI pipeline 里字段删除、类型变更这类问题会在合并前暴露。关注我超多硬核知识参考资料gRPC 官方文档Protocol Buffers 官方文档gRPC vs REST Performance Benchmarks - jvm-serializersBuf — Protobuf 工程化工具Uber Engineering: Introducing Hive for gRPCgRPC-Web: Bringing gRPC to the Browser

相关文章:

gRPC vs REST:内部服务用 gRPC,对外接口用 REST

你好,我是码哥,《Redis 高手心法》畅销书作者,可以叫我靓仔gRPC vs REST新项目启动,技术方案评审,架构师问一句:「内部服务间通信你打算用什么协议?」很多 2-3 年经验的工程师这时候会说&#x…...

IP5108电源管理IC驱动库深度解析与工程实践

1. IP5108电源管理IC库深度解析:面向嵌入式工程师的全栈控制指南IP5108是集成度极高的单芯片锂离子电池电源管理IC,广泛应用于移动电源、便携式医疗设备、IoT终端及手持工业仪表等对体积、功耗与可靠性有严苛要求的场景。其核心价值在于将充电管理、升压…...

RevokeMsgPatcher 2.1:Windows平台终极防撤回解决方案

RevokeMsgPatcher 2.1:Windows平台终极防撤回解决方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.co…...

3步解锁B站缓存:m4s-converter让视频格式自由

3步解锁B站缓存:m4s-converter让视频格式自由 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到这样的困境:在B站精心缓存的教学视频、精彩直…...

Zotero文献管理终极指南:用阅读进度可视化告别学术混乱

Zotero文献管理终极指南:用阅读进度可视化告别学术混乱 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址…...

Qwen2.5-VL在物流行业的应用:包裹识别与分拣

Qwen2.5-VL在物流行业的应用:包裹识别与分拣 1. 引言 每天清晨,物流分拣中心总是最忙碌的地方。成千上万的包裹在传送带上快速移动,工人们需要准确识别每个包裹的目的地、重量和特殊处理要求。传统的人工分拣不仅效率低下,还容易…...

Comsol变压器多物理场耦合仿真:解锁铁心振动奥秘

Comsol变压器电路-磁场-振动多物理场耦合仿真,求解了电磁场和固体力学,描述了在磁致伸缩下的变压器铁心的振动规律;提供comsol详细学习资料及模型,在电力领域,变压器的性能至关重要,而其铁心在运行时的振动…...

SOONet模型数据库课程设计项目:校园视频库智能检索系统

SOONet模型数据库课程设计项目:校园视频库智能检索系统 每次上完讲座,想回顾某个精彩片段,是不是都得在长长的视频里来回拖动进度条,费时又费力?对于学生和老师来说,校园里海量的讲座、公开课视频&#xf…...

永磁同步电机匝间短路故障Simulink仿真探索

永磁同步电机(pmsm)匝间短路故障simulink仿真。 提供文档参考说明。在电机领域,永磁同步电机(PMSM)凭借其高效、节能等诸多优点,广泛应用于工业、交通等众多领域。然而,如同所有设备一样&#x…...

深度解析Unitree Go2机器人ROS2 SDK:3大实战方案与技术架构揭秘

深度解析Unitree Go2机器人ROS2 SDK:3大实战方案与技术架构揭秘 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk Unitree Go2机器人ROS2 SDK为四足机器人…...

RVC模型推理性能对比:不同GPU服务器配置下的速度与效果评测

RVC模型推理性能对比:不同GPU服务器配置下的速度与效果评测 最近在折腾RVC模型,发现一个挺实际的问题:同样的模型,放在不同的GPU服务器上跑,效果和速度能差多少?这直接关系到我们做项目时的成本预算和体验…...

Thief-Book IDEA插件:将开发等待时间转化为阅读时间,提升工作效率50%

Thief-Book IDEA插件:将开发等待时间转化为阅读时间,提升工作效率50% 【免费下载链接】thief-book-idea IDEA插件版上班摸鱼看书神器 项目地址: https://gitcode.com/gh_mirrors/th/thief-book-idea 在软件开发过程中,你是否经常遇到这…...

实战指南:高效利用Python百度搜索API实现自动化信息收集

实战指南:高效利用Python百度搜索API实现自动化信息收集 【免费下载链接】python-baidusearch 自己手写的百度搜索接口的封装,pip安装,支持命令行执行。Baidu Search unofficial API for Python with no external dependencies 项目地址: h…...

工业自动化必备:深入解析主流工业级通信协议

1. 工业通信协议:自动化系统的"普通话" 想象一下,如果工厂里的每台设备都说不同的方言,PLC听不懂变频器在说什么,机器人收不到传感器的信号,那生产线就会乱成一锅粥。工业通信协议就是设备之间的"普通话…...

嵌入式NFC驱动库libSpookyAction:PN532与DESFire安全通信实战

1. 项目概述libSpookyAction是一个面向嵌入式平台的轻量级 NFC 底层驱动库,专为通过 NXP PN532 NFC 控制器与 MIFARE DESFire 系列智能卡(含 EV1/EV2/EV3、EV2/40K、EV3/80K 等型号)进行安全、可靠通信而设计。其名称“SpookyAction”源自量子…...

【华为OD机试真题】斗地主跑得快 · 最长顺子判定(JavaScript)

一、题目1. 题目描述斗地主起源于湖北十堰房县,据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上。牌型定义(顺子):又称顺子,最少 5 张…...

6个高效步骤打造m3u8下载器插件系统

6个高效步骤打造m3u8下载器插件系统 【免费下载链接】m3u8-downloader m3u8 视频在线提取工具 流媒体下载 m3u8下载 桌面客户端 windows mac 项目地址: https://gitcode.com/gh_mirrors/m3u8/m3u8-downloader m3u8下载器作为专业的流媒体视频下载工具,其插件…...

HTML5 的离线储存怎么使用?它的工作原理是什么?

HTML5 的离线存储主要通过 Application Cache (AppCache) 和 Service Workers (配合 Cache API) 两种技术实现。 重要提示: 早期的 AppCache (manifest 属性) 虽然简单,但存在严重的缺陷(如缓存更新困难、容易陷入死循环等)&#…...

2017-2023年商业银行相关数据

商业银行数据概览(2017-2023年)商业银行数据通常涵盖资产规模、盈利能力、不良贷款率、资本充足率等关键指标。以下是基于公开渠道整理的部分核心数据趋势和分析:数据来源建议中国银保监会年度报告中国人民银行《中国金融稳定报告》各上市银行…...

Qwen3-ASR在司法领域的应用:庭审语音自动转录系统

Qwen3-ASR在司法领域的应用:庭审语音自动转录系统 庭审记录是司法工作的核心环节,传统人工记录方式面临效率低、易出错、成本高等痛点 在传统的法庭庭审中,书记员需要全程专注地记录每一句发言,这不仅对人员的专注力是极大考验&am…...

ESP01S与Arduino IDE:从零搭建物联网开发环境

1. 硬件准备与基础认知 第一次接触ESP01S时,我完全被这个小东西震惊了——比指甲盖大不了多少的模块,居然能实现WiFi连接和物联网控制。对于刚入门的开发者来说,ESP01S确实是性价比极高的选择。市面上常见的开发套装通常包含两个关键部件&…...

AI应用架构师必看:企业AI效能评估的“工具链+流程化”落地方案

AI应用架构师必看:企业AI效能评估的“工具链流程化”落地方案 关键词 AI效能评估、业务价值对齐、工具链闭环、流程化运营、因果归因、数据驱动迭代、ROI量化 摘要 作为AI应用架构师,你是否曾遇到过这样的困境: 花费数月打磨的推荐模型&#…...

ESP32异步NeoPixel控制中间件设计与实现

1. NeopixelCommander 项目概述NeopixelCommander 是一个面向 ESP32 和 ESP32-S2 平台的轻量级、异步驱动型 NeoPixel 控制中间件,其核心设计目标是将物理 LED 控制能力通过标准化网络协议暴露为可远程调用的服务接口。它并非传统意义上的底层驱动库(如 …...

5步精通Driver Store Explorer:Windows驱动清理与空间释放全攻略

5步精通Driver Store Explorer:Windows驱动清理与空间释放全攻略 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows系统随着使用时间增长,C盘空间神…...

2024年AI辅助编程工具新物种:专注架构设计的AI助手横评(含架构图生成工具对比)

2024年AI辅助编程工具新物种:专注架构设计的AI助手横评(含架构图生成工具对比) 关键词:AI辅助编程工具、架构设计、AI助手、架构图生成工具、横评 摘要:本文聚焦于2024年新出现的专注架构设计的AI辅助编程工具,对不同的AI助手进行了详细横评,同时对比了相关的架构图生成…...

从零实现一个C++多进制计算器:蓝桥杯常见指令解析与避坑指南

从零构建C多进制计算器:蓝桥杯指令系统实战解析 在算法竞赛中,处理多进制计算问题一直是让初学者头疼的典型场景。蓝桥杯等赛事常通过这类题目考察选手对基础数据结构的掌握程度和逻辑抽象能力。本文将带您从零开始,用C实现一个支持动态进制转…...

从0开始理解并发、线程与等待通知机制(中)

线程启动与终止 线程启动方式 继承 Thread 类并重写 run() 方法。实现 Runnable 接口并交给 Thread 执行。 线程终止方式 不建议使用 stop() 方法,因其具有强制性,可能导致资源未正确释放。推荐使用中断机制:调用 interrupt() 方法&#xf…...

CLIP-GmP-ViT-L-14企业级部署:基于VMware虚拟化环境的高可用架构

CLIP-GmP-ViT-L-14企业级部署:基于VMware虚拟化环境的高可用架构 如果你在企业里负责IT运维或者系统架构,最近可能正琢磨着怎么把那些厉害的AI模型,比如CLIP-GmP-ViT-L-14这种能看懂图片又能理解文字的模型,给稳稳当当地跑起来。…...

ESXi虚拟化实战:如何用Web界面5分钟快速部署Ubuntu Server虚拟机

ESXi虚拟化实战:5分钟极速部署Ubuntu Server全指南 当你需要在企业内部快速搭建一套开发测试环境,或是为临时项目部署隔离的沙箱系统时,传统物理服务器的采购和配置流程显然无法满足时效需求。这正是ESXi这类企业级虚拟化平台展现价值的时刻—…...

电力系统动态无功补偿技术:基于MATLAB/Simulink仿真的静止无功发生器SVG与控制策...

电力系统动态无功补偿 MATLAB,simulink仿真 静止无功发生器SVG SVPWM控制,ip-iq瞬时无功电流检测,电压PI外环,电流PI内环控制。 三类负载,阻感性,阻容性,谐波负荷在电力系统中,动态无…...