我们在对项目进行操作的时候,离不开框架,其中,在远程调用的时候更需要RPC框架。
什么是RPC框架?
定义
- RPC:远程过程调用协议。客户端在不知道调用细节的情况下,调用远程计算机上的某个对象,就像调用本地应用程序中的对象一样。
- 官方定义:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
例子
比如,我喜欢在家里坐着点外卖。那么,我要在下单之后进行微信支付(支付宝也行,银行卡也可)。 在这里,我们用到了两个服务:
- 点菜商城
- 微信支付
二者关系如图所示:
概念模型
RPC需要解决三个问题:
- 函数映射
- 数据转化成字节流
- 网络传输
因此,我们可以推断出它的概念模型:
完整过程
- IDL (Interface description language) 文件IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
- 生成代码:通过编译器工具把 IDL 文件转换成语言对应的静态库
- 编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
- 通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
- 网络传输:通常基于成熟的网络走 TCP/UDP 传输
优点
- 单一职责,有利开发和运维
- 可扩展性强,资源使用率优秀
- 故障隔离,服务可靠性强
引用RPC框架
我们使用RPC有很多优点,但是不可避免地要解决很多问题,这就展现出了RPC框架的必要性。
问题
- 服务器死机,应该怎么办?
- 网络异常怎么办?
- 请求量突增,有什么措施?
分层设计
图片来自网络:
在上面的图片里,我们很难具体找到分层,但也起到了示意图的作用。 下列表格是详细分层与各层作用。
| 层名 | 作用 | 数据格式 |
|---|---|---|
| 编解码层 | 生成代码(go\c\c++) | 语言特定格式文本格式二进制编码:TLV编码含(标签、长度、值) |
| 特点:兼容性:加入新的字段不影响老的服务通用性:支持跨平台、跨语言性能:时空折中 | ||
| 协议层 | 特殊结束符变长协议 | LENGTH: 数据包大小,不包含自身HEADER MAGIC.标识版本信息,协议解析时候快速校验SEQUENCE NUMBER: 表示数据包的 segID可用于多路复用,单连接内递增HEADER SIZE: 头部长度,从第14个字节开始计算一直到 PAYLOAD前PROTOCOL ID:编解码方式,有 Binany 和Compact 两种TRANSFORM ID: 压缩方式,如 zlib 和snappyINFO ID: 传递一些定制的 meta 信忘PAYLOAD: 消息体 |
| 网络通信层 | 提供易用 API:封装底层 Socket API连接管理和事件分发功能:协议支持: tcp、udp 和 uds 等优雅退出、异常处理等性能:应用层 buffer 减少 copy高性能定时器、对象池等 | |
| 过程:套接字编程中的客户端必须知道两个信息: 服务器的IP 地址,以及端口号函数创建一个套接字,将其绑定到一个地址上,监听进来的连接,指定挂起的连接队列的长度,当客户端连接的时候,服务器可能正在处理其他逻而未接受连接,导致这个连接被挂起,内核维护挂起的连接队列,指定这队列的长度,再有函数从队列中取出接请求并接收它,从挂起列移除此连接;如果队列未满,客户端马上动,如果满了可能会阻塞等待队列。 |