文章目录
- 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)
  




















