RPC 框架设计

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

初识 RPC

服务化有什么好处?数据库

  • 防止代码拷贝编程

  • 防止底层复杂性的扩散json

  • 防止公共库的耦合架构

  • 保证 SQL 的质量,可以解除数据库的耦合框架

什么是 RPC

RPC:Remote Procedure Call Protocol,远程过程调用协议,像调用本地函数同样,去调用一个远端服务。异步

相比“同一个进程”的“本地”函数调用,有没有办法,调用一个“跨进程”的“远程”函数呢?ide

Socket 通信,只能传递连续的字节流,如何将 “入参/函数” 放到连续的字节流里呢?须要设计“应用层报文(协议)”函数

“跨进程”“远程”调用的过程线程

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

RPC 框架的架构职责

上述跨进程调用远端的服务,存在的问题是没有将通用操做抽离出来。设计

RPC框架职责:

  1. 让调用端,像调用本地函数同样,便捷的调用远程的服务

  2. 让服务端,像提供本地函数同样,便捷的提供远程的服务

向调用方屏蔽各类复杂性,向服务方也屏蔽各类复杂性,让调用方感受上就是在调用本地函数同样,来调用一个远端的服务;让服务方就像实现一个本地函数同样,便捷地提供远端服务。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

序列化与反序列化

为何须要序列化?

须要将对象等数据进行二进制转储。

所谓序列化,是将“对象”形态的数据转化为“连续空间二进制字节流”形态数据的过程。

如何进行序列化?

如何将一个 class User 的内存实体 u1 转化为二进制字节流?

  • 方案一:自描述

    自描述的标记性语言 (XML/JSON),来进行转换。规定好转换规则。

  • 方案二:序列化协议

    序号 | key 长度 | key 值 | value 长度 | value 值

序列化协议设计,要考虑什么因素?

  1. 解析效率

  2. 压缩率,传输有效性

  3. 扩展性,兼容性

  4. 可读性,可调试性

  5. 跨语言

  6. 通用性

常见的序列化方法(协议)

  1. xml/json

  2. protobuf

  3. Avro

  4. CORBA

  5. mc_pack

字节流发送 + 字节流接收

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

同步 RPC 系统架构,核心流程

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

RPC-server:IO线程,中间是一个队列,工做线程处理结果,返回。

链接池组件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

异步 RPC 系统架构,核心流程

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

调用方调用,生成上下文,编程报文,放入队列;调用结束

异步架构,上下文管理器

  1. 为何须要上下文管理器?

  2. 如何将请求-响应-回调等信息匹配起来?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

一条链接,异步请求、响应报文如何匹配? 能够经过“请求ID”关联!!!

经过“请求ID”关联 请求-响应-回调

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

异步架构,超时管理器

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

RPC-Server

监听一个端口,收发线程收发数据库包,中间一个包队列,工做线程来处理,整个 RPC-Server 就是一个比较简单的生产者-消费者。

总结

  1. 什么是 RPC?

    像调用本地函数同样,去调用一个远端服务

  2. 为何须要 RPC 框架?

    用来屏蔽 rpc 调用过程当中,跟业务代码无关的底层技术细节

  3. 什么是序列化?为何须要序列化?

    将对象转换为二进制流的过程

  4. 同步 RPC-Client 的核心组件是什么?

    序列化/反序列化、链接池

  5. 异步 RPC-Client 的核心组件是什么?

    收发队列(用于解耦)、工做线程、上下文管理

相关文章
相关标签/搜索