文章目录
- 1. 分布式系统
- 1.1 横向拆分
- 1.2 分布式服务框架优缺点
- 1.3 功能/非功能需求
- 2. RPC架构
- 2.1 概述
- 2.2 网络通信
- 2.3 序列化
- 2.3.1 概述
- 2.3.2 传输协议
- 2.4 服务调用
- 2.4.1 概述
- 2.4.2 同步调用
- 2.4.3 异步调用(Future模式为例)
- 1)Future-Get模式
- 2)Future-Listener模式
- 3)二者时间成本对比
1. 分布式系统
1.1 横向拆分
分布式系统是横向拆分的的结果:
上图说明:
- 把订单、物流、商品、库存、交易和会员等业务抽象成独立的垂直化服务
- 在各个服务上层实现分布式环境下的调用和管理框架
- 业务
- 业务1:基于订单和物流服务
- 业务2:只依赖于交易和会员管理服务
1.2 分布式服务框架优缺点
- 优点
- 提供了一种按需构建的机制
- 保证各个分布式服务的技术、团队、交付独立发展
- 确保业务整合的灵活性和高效性。
- 问题
- 网络传输的多态性
- 服务的维护复杂性和可用性
- 服务的分布性和对等性
- 负载均衡的需求
- 分布式事务及数据节点的一致性
- ……
1.3 功能/非功能需求
- 其功能需求:提供服务接入
基本组件:括网络通信、序列化/反序列化、传输协议和服务调用 - 其非功能需求:
服务路由、集群容错、服务订阅发布、服务治理和服务监控等组件
2. RPC架构
2.1 概述
- 客户端职责
- RpcClient,负责导入(import)由Rpc Proxy提供的远程接口的代理实现。
- RpcProxy,远程接口的代理实现,提供远程服务本地化访问的入口。
- RpcInvoker,负责编码和发送调用请求到服务方并等待结果。
- RpcProtocol,负责网络传输协议的编码和解码。
- RpcConnector,负责维持客户端和服务端连接通道和发送数据到服务端。
- RpcChannel,网络数据传输通道。
- 服务端职责
- RpcServer,负责导出(export)远程接口。
- RpcInvoker,负责调用服务端接口的具体实现并返回结果。
- RpcProtocol,负责网络传输协议的编码和解码。
- RpcAcceptor,负责接收客户方请求并返回请求结果。
- RpcProcessor,负责在服务方控制调用过程,包括管理调用线程池、超时时间等。
- RpcChannel,网络数据传输通道。
2.2 网络通信
- 网络连接
- Rpc通常采用长连接
- IO模型
- 阻塞式IO(BIO)
BIO要求客户端请求数与服务端线程数一一对应,显然服务端可以创建的线程数会成为系统的瓶颈 - 非阻塞IO(NIO)
它和IO复用技术实际上也会在IO上形成阻塞 - 异步IO(AIO):不会阻塞
- 阻塞式IO(BIO)
- 可靠性
- 链路有效性检测
- 心跳检测
- 方法一:TCP层通过建立长链接传递心跳信息
- 方法二:在应用层,根据系统要求发送可能包含业务逻辑的心跳信息
- 心跳检测
- 断线之后的重连处理。
- 发送方检测到通信链路中断 ===》重连
- 重连失败 ===》周期性重连直至重连成功
- 链路有效性检测
2.3 序列化
2.3.1 概述
-
概念
- 序列化(Serialization):将对象转化为字节数组,用于网络传输、数据持久化或其他用途。
- 反序列化(Deserialization):把从网络、磁盘等读取的字节数组还原成原始对象,以便后续业务逻辑操作。
-
序列化实现
- 文本类:如 XML、JSON
- 二进制类:Google的Protocol Buffer和Facebook的Thrift等
-
实现方案选择
- 根据功能(主要)
- 接口友好性和中间语言
- 跨语言调用
- 根据性能(重要)
- 序列化之后码流大小
- 序列化/反序列化速度
- CPU/内存资源占用
- 根据兼容性
实现版本前向兼容,确保新、老接口可用
- 根据功能(主要)
图,序列化性能比较:
2.3.2 传输协议
- ISO/OSI(Open System Interconnect,开放系统互连)七层网络模型
- Dubbo私有协议
Dubbo协议在会话层中添加了自定义消息头。该消息头包括多协议支持和兼容的Magic Code属性、支持同步转异步并扩展消息头的Id属性等。
- Dubbo协议的数据包大小对比图
2.4 服务调用
2.4.1 概述
- 服务调用模式
- 单向模式:一般同步调用
- 请求应答模式:异步调用
2.4.2 同步调用
- 缺点:会造成业务线程阻塞
- 优点:开发和管理相对简单。
- 时序图
- 服务线程发送请求到IO线程之后就一直处于等待阶段
- 直到IO线程完成与网络的读写操作之后被主动唤醒
2.4.3 异步调用(Future模式为例)
利用Future模式发送请求后,无需等待响应的到来。在等待响应的过程中可以执行其他程序。
1)Future-Get模式
- 主动get结果的方式获取Future结果,而这个get过程是串行的,会造成执行get方法的线程形成阻塞。
2)Future-Listener模式
需要创建Listener,当Future结果生成时会唤醒注册到该Future上的Listener对象,从而形成异步回调机制。
3)二者时间成本对比
假设有3个任务,执行时间分别是T1、T2和T3,
- Future-Get 执行的总时间:T=T1+T2+T3
- FutureListener执行的总时间 :T=Max(T1,T2,T3)