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

RPC 核心概念 01:什么是 RPC?为什么需要 RPC?

RPC 核心概念 01:什么是 RPC?为什么需要 RPC?

一、从函数调用说起

我们写代码的最基本动作就是调用函数:

result:=add(1,2)

这种调用发生在同一个进程内,CPU 直接跳转到函数地址执行。但当业务越来越大,单个进程容纳不下所有功能,我们就要把不同模块拆到不同进程、不同机器上。问题来了:A 机器上的代码如何调用 B 机器上的函数?

这就是 RPC(Remote Procedure Call,远程过程调用)要解决的核心问题——让远程函数调用看起来像本地函数调用一样简单

二、RPC 的定义

RPC:一种让程序透明地调用另一个地址空间(通常是远程服务器)函数的协议与技术。

调用方(Client)的代码长这样:

result,err:=userClient.GetUser(ctx,&GetUserReq{ID:1})

被调方(Server)的代码长这样:

func(s*UserService)GetUser(ctx context.Context,req*GetUserReq)(*GetUserResp,error){return&GetUserResp{Name:"Tom"},nil}

中间发生的网络通信、序列化、连接管理等细节全部被框架隐藏。

三、为什么需要 RPC?

3.1 微服务架构的必然需求

随着业务复杂度提升,单体应用面临:

  • 编译部署慢;
  • 任意模块出 bug 影响全局;
  • 团队协作冲突;
  • 难以按模块独立扩缩容。

拆分成多个微服务后,服务间通信就是头等大事。HTTP+JSON 当然可以,但有诸多缺点(后述),RPC 框架是更合适的方案。

3.2 性能与开发效率的平衡

维度HTTP/JSONRPC
协议开销较大(HTTP 头、JSON 文本)小(二进制协议)
序列化效率慢(文本)快(Protobuf 等)
接口契约弱(依赖文档)强(IDL 强约束)
开发体验手写客户端代码自动生成
服务治理自行实现框架内置

四、RPC 的本质:本地调用 + 网络通信

一次 RPC 调用的完整流程:

Client Server │ │ │ 1. 调用 stub (生成的客户端代码) │ │ │ │ 2. 参数序列化 (Marshal) │ │ │ │ 3. 通过网络发送 (TCP / HTTP/2 / QUIC) │ ├─────────────────────────────────────────────────────►│ │ │ 4. 接收并反序列化 │ │ │ │ 5. 路由到具体方法 │ │ │ │ 6. 执行业务逻辑 │ │ │ │ 7. 序列化结果 │◄─────────────────────────────────────────────────────┤ │ 8. 反序列化得到返回值 │

可以发现 RPC 框架要解决的核心问题:

  1. 接口约定(IDL)
  2. 序列化协议(如 Protobuf)
  3. 传输协议(TCP、HTTP/2 等)
  4. 服务发现与负载均衡
  5. 错误处理与超时
  6. 可观测性(日志、监控、链路追踪)

五、RPC 的发展历程

年代代表技术特点
1980sSun RPC、CORBA早期跨平台尝试,复杂笨重
2000sXML-RPC、SOAP文本协议,性能差但跨语言好
2010sThrift(Facebook)、Dubbo(阿里)二进制协议,性能跃升
2015+gRPC(Google)HTTP/2 + Protobuf,事实标准
国内tRPC(腾讯)、Kitex(字节)业务定制 + 多协议互通

六、与其他通信方式的对比

6.1 RPC vs REST

REST 是资源导向的设计风格,基于 HTTP 语义;RPC 是动作导向的远程调用。

  • 对外暴露的开放 API:建议 REST(生态、调试方便);
  • 内部微服务通信:建议 RPC(性能、强契约)。

6.2 RPC vs 消息队列(MQ)

  • RPC:同步、点对点
  • MQ:异步、解耦、广播

复杂业务往往两者结合:核心链路同步 RPC,旁路通知用 MQ。

6.3 RPC vs GraphQL

  • RPC:客户端直接调用具体方法;
  • GraphQL:客户端按需查询字段。

GraphQL 适合面向多端 BFF 场景,RPC 适合内部微服务。

七、一个最小 RPC 示例(伪代码)

服务端

typeCalculatorstruct{}func(c*Calculator)Add(req AddReq)AddResp{returnAddResp{Sum:req.A+req.B}}server:=rpc.NewServer()server.Register(&Calculator{})server.Listen(":8000")

客户端

client:=rpc.Dial("127.0.0.1:8000")deferclient.Close()resp,err:=client.Call("Calculator.Add",AddReq{A:1,B:2})fmt.Println(resp.Sum)// 3

看起来就像本地调用,但底层经历了序列化、网络、反序列化等一系列步骤。

八、RPC 不是银弹

引入 RPC 的代价:

  1. 网络不可靠:超时、抖动、断连必须处理;
  2. 延迟变大:本地调用 ns 级,RPC 至少 ms 级;
  3. 可观测性复杂:跨进程调用要做链路追踪;
  4. 版本兼容:服务升级要考虑客户端旧版本。

经典理论:Fallacies of Distributed Computing(分布式计算谬误)告诫我们网络不是 100% 可靠。

九、什么时候不该用 RPC?

  • 单进程内:直接函数调用;
  • 极高吞吐 + 异步处理:用 MQ;
  • 数据流式传输:考虑 gRPC streaming 或专用协议;
  • 与浏览器直连:用 REST/WebSocket 更兼容。

十、小结

  • RPC 让远程调用像本地调用一样简单;
  • RPC 框架解决:IDL、序列化、传输、治理、观测;
  • 内部微服务首选 RPC,对外开放接口可用 REST;
  • 享受便利的同时要尊重网络不可靠的事实。

下一篇我们将深入 RPC 的"骨架":IDL 与 Protobuf

http://www.jsqmd.com/news/859941/

相关文章:

  • 如何利用OOTDiffusion实现智能虚拟试衣:从技术原理到实战应用的完整指南
  • 谷歌推出搭载 AI 的音频智能眼镜,携手 Warby Parker 与 Gentle Monster 合作
  • 5月(2026年)生鲜肉气调包装机口碑企业不容错过,贴体真空包装机/热缩机/牛排贴体包装机,气调包装机厂家找哪家 - 品牌推荐师
  • 观察Taotoken账单明细实现精准成本追溯
  • FanControl终极教程:3步搞定Windows电脑风扇静音控制
  • 从零打造直流电机 PID 驱动系统(三):iOS 蓝牙控制 APP 开发(新手友好版)
  • 解锁AI搜索流量密码:AI搜索优化企业解析 - 品牌测评鉴赏家
  • 【技术干货】微小间距、热敏感区域焊接难?激光锡球焊接在芯片封装中的高精零飞溅解决方案
  • 初三中考英语作文模板万能句型及范文大全电子版
  • 高效智能的Windows音频管理神器:AudioSwitch让你的音频设备切换更简单
  • JCMsuite应用:太阳能电池的抗反射惠更斯超表面模拟
  • xml格式转成yolo格式 txt标签格式 yolo划分训练 测试数据集(附全部代)
  • OpenClaw 3 机集群(Windows + Linux 混合)一键脚本 + 完整配置
  • 从零打造可落地的直流电机 PID 驱动系统(四):Android 蓝牙控制 APP 开发(新手友好版)
  • 边仓线与线边仓详解:边仓线和线边仓如何协同优化物料流转效率?
  • 2026年盲审前论文降AI攻略:盲审阶段AI率超标4.8元一次过知网完整处理指南
  • 最好用的AI论文写作软件推荐(从开题选题到定稿排版全流程)适合全体毕业生
  • 血泪教训:一行 apt install docker* 让我搞了一晚上 Docker
  • LangChain与LangGraph详解:用法、差异与实战指南
  • Agent面试八股文
  • RPC 核心概念 02:IDL 与 Protobuf 详解
  • 升级 macOS Tahoe 26 后启动台消失?终端命令已失效,这个方案实测可用
  • 【linux使用技巧】复制粘贴快捷键
  • 初创公司如何利用Taotoken的Token Plan降低AI原型开发成本
  • 通过Taotoken CLI工具一键配置多款AI开发工具环境
  • 为什么很多政府部门的系统这么难用
  • Pearcleaner:macOS应用彻底清理的终极指南,3步告别垃圾文件
  • ElevenLabs新疆语语音生成合规红线清单(含《互联网信息服务深度合成管理规定》第12条实操解读)
  • Sunshine游戏串流终极指南:5大优化策略实现300%性能提升
  • 使命召唤21:黑色行动6 官方正版2026最新版pc免费下载(看到请立即转存 资源随时失效)手机版通用