【转】rpc框架设计
转,原文:https://www.cnblogs.com/ice-image/p/14554250.html
----------------------------
RPC 框架设计
RPC 框架设计
初识 RPC
服务化有什么好处?
- 防止代码拷贝
- 防止底层复杂性的扩散
- 防止公共库的耦合
- 保证 SQL 的质量,能够解除数据库的耦合
什么是 RPC
RPC:Remote Procedure Call Protocol,远程过程调用协议,像调用本地函数一样,去调用一个远端服务。
相比“同一个进程”的“本地”函数调用,有没有办法,调用一个“跨进程”的“远程”函数呢?
Socket 通讯,只能传递连续的字节流,如何将 “入参/函数” 放到连续的字节流里呢?需要设计“应用层报文(协议)”
“跨进程”“远程”调用的过程
RPC 框架的架构职责
上述跨进程调用远端的服务,存在的问题是没有将通用操作抽离出来。
RPC框架职责:
- 让调用端,像调用本地函数一样,便捷的调用远程的服务
- 让服务端,像提供本地函数一样,便捷的提供远程的服务
向调用方屏蔽各种复杂性,向服务方也屏蔽各种复杂性,让调用方感觉上就是在调用本地函数一样,来调用一个远端的服务;让服务方就像实现一个本地函数一样,便捷地提供远端服务。
序列化与反序列化
为什么需要序列化?
需要将对象等数据进行二进制转储。
所谓序列化,是将“对象”形态的数据转化为“连续空间二进制字节流”形态数据的过程。
如何进行序列化?
如何将一个 class User
的内存实体 u1 转化为二进制字节流?
-
方案一:自描述
自描述的标记性语言
(XML/JSON)
,来进行转换。规定好转换规则。 -
方案二:序列化协议
序号 | key 长度 | key 值 | value 长度 | value 值
序列化协议设计,要考虑什么因素?
- 解析效率
- 压缩率,传输有效性
- 扩展性,兼容性
- 可读性,可调试性
- 跨语言
- 通用性
常见的序列化方法(协议)
- xml/json
- protobuf
- Avro
- CORBA
- mc_pack
字节流发送 + 字节流接收
同步 RPC 系统架构,核心流程
RPC-server:IO
线程,中间是一个队列,工作线程处理结果,返回。
连接池组件
异步 RPC 系统架构,核心流程
调用方调用,生成上下文,编程报文,放入队列;调用结束
异步架构,上下文管理器
- 为什么需要上下文管理器?
- 如何将请求-响应-回调等信息匹配起来?
一条连接,异步请求、响应报文如何匹配? 可以通过“请求ID”关联!!!
通过“请求ID”关联 请求-响应-回调
异步架构,超时管理器
RPC-Server
监听一个端口,收发线程收发数据库包,中间一个包队列,工作线程来处理,整个 RPC-Server 就是一个比较简单的生产者-消费者。
总结
-
什么是 RPC?
像调用本地函数一样,去调用一个远端服务
-
为什么需要 RPC 框架?
用来屏蔽 rpc 调用过程中,跟业务代码无关的底层技术细节
-
什么是序列化?为什么需要序列化?
将对象转换为二进制流的过程
-
同步 RPC-Client 的核心组件是什么?
序列化/反序列化、连接池
-
异步 RPC-Client 的核心组件是什么?
收发队列(用于解耦)、工作线程、上下文管理器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-03-18 makefile 小记
2020-03-18 [转]gcc - lm的含义