RPC是把远程过程调用伪装成本地方法,抽象隔离具体实现和协议。
这种模式的优点是屏蔽了底层协议的消息编解码,调用双方的消息及上下文的维护委托给RPC框架,进而调用双方都可以面向类似本地函数调用的高阶接口编程。设计的技术点有:
1)客户端函数接口生成和拦截解释:(应用层)
从java角度看就是接口代理对象的生成,在不支持反射的语言里可以通过编译器技术来实现(C++仿函绑定rpc调用框架的方法实现)或者通过IDL来生成代码的方式来绕过。
2)会话管理(会话层)
通信序列化的协商,调用消息上下文及生命周期的维护。兼顾过程调用的本地存根维护。
3)追踪、路由、降级等治理方面
朴素的rpc模型中不包含该层,SOA的本质是度量,改进式反馈再度量的闭环。
4)网络通信传输客户端 (传输层)
传输层对上层透明,传输层‘连接’管理,传输层缓冲区管理。
5)编解码器(传输会话结合层)
适配应用层的协议头,以便支持多种不同层面的传输协议,比如dubbo协议是基于tcp的还有基于http还有其他协议。
6)序列化(表示层)
序列的本质:使得数据完全使用字节表示,数据间的关系表示脱离对内存地址的依赖,同时去除数据业务逻辑层面无关的运行时附加信息。这层的作用是多种编解码器的动态切换,缓冲的集约使用。
小结
客户端出栈方向不是按网络七层顺序组织的,对换了传输层和表示层,中间还插入了编解码层,使得管理传输方式和多种传输层和序列化协议适配提供便捷有效的沟通方式。这种传输层上浮,编解码和序列化作为委托的结构,对于管理传输的连续性有很大的好处。传统七层模型的缺点是表示层是面向网络字节的,丢失很多上下文信息,层与层间的隔离阻断了信息传递,使得消息在到达传输层前就要提前编码,为了保持这种隔离也增加复制的开销,同时对于通信异常的传播也是不利的。
服务端
入栈方向 (传输层监听服务作为容器,管理了编解码器和序列化器,上层是会话管理,再上层是服务调用骨架,主要的技术点有:网络io模型与线程模型,服务端对象生命周期管理,异步处理及线程调度,以及自动注册动态调用的简单技巧)
1)传输层
通过委托的解码器和和反序列化器得到应用层可处理的内存消息,这个解码的过程通常还受到网络编程的线程模型的影响,使其处在不同的线程中运行。
2)会话管理层
会话维护,身份鉴权。
- 服务骨架
动态调用是个基础,java用反射实现比较简单。交互对象存根维护,调用执行线程调度管理。
RPC的几个关键
- 代码分层要合理特别是层次顺,依赖关系。
- 动态代理技术 (客户端存根,服务端注册与处理请求时的动态调用)
- 网络编程技术
io模型与零拷贝
连接管理与C10M
时间轮盘定时器
缓冲区管理与内存池伙伴分配与引用计数
线程模型(reactor、proactor、leader-follower、half-sync half-async) - 多线程与异步技术
调度策略与异步上下文管理、协程等 - 序列化技术
兼容性、编解码性能、网络消耗、可读性 - 应用层协议头设计
兼容性、伸缩性、隔离性、完备性、效率