一、RPC架构

RPC(Remote Procedure Call),一种进程间通信方式。允许像调用本地服务一样调用远程服务

框架原理

RPC框架负责屏蔽底层的传输方式(TCP、UDP)、序列化通信细节。框架使用者,仅需要关注需要什么样的远程服务接口即可。不需要关心通信细节与调用过程。

image.png

RPC框架核心技术点

  1. 远程服务提供者,以某种形式(例如jar)提供服务调用相关信息。包括但不限于服务接口定义、数据结构
  2. 远程代理对象:服务调用者调用的服务是远程服务的本地代理。对于java,是JDK的动态代理,通过动态代理的拦截机制,将本地调用封装成远程服务调用。
  3. 通信:框架应该与具体的协议无关。
  4. 序列化:远程通信,需将对象转换成二进制进行网络传输。

    架构原理

    不同分布式服务框架实现细节存在差异,但核心功能差异不大。
    image.png
    分布式服务框架可以抽象为三层

  5. RPC层:包含底层通信框架(netty、http等)、序列化、反序列化、屏蔽底层通信协议细节和序列化差异的Remoting框架。

  6. Filter Chain层:服务调用职责链,提供多种服务调用切面,方便框架自身以及使用者扩展。(例如负载均衡、失败重发、调用性能统计等)
  7. Service层:主要包括Java动态代理。

消费者端:将服务提供者的接口利用动态代理,封装成远程服务调用。
提供者端:根据消费者请求消息(接口名、方法名、参数列表),反射调用接口实现类。
分布式框架另外的两个重要功能:注册中心、监控中心(也可称为服务治理中心)

分布式框架必须的功能特性

特性名 功能名 说明
服务订阅发布 配置化发布和引用服务

| | | 服务自动发现机制 | 支持服务实时自动发现,注册中心实时推送给消费者 | | | 服务在线注册和去注册 | 支持服务运行状态,上、下线新服务 | | 服务路由 | 默认提供随机、轮询、基于权重的路由策略 | 默认提供常用策略,避免重复开发 | | | 粘滞连接 | 同一消费者,总向同一台服务发送请求(不必重新建立连接),除非服务宕机 | | | 路由定制 | 支持用户自定义路由策略 | | 集群容错 | Failover | 失败自动切换,失败后,重试其他服务 | | | Failback | 失败后,定时重发 | | | Failfast | 快速失败,仅发起一次调用,失败立刻报错(非幂等系统) | | 服务调用

| 同步调用 | 消费者发起请求后,阻塞等待 | | | 异步调用 | 消费者发起请求后,不阻塞立即返回,由提供者异步通知 | | | 并行调用 | 消费者同时对多个提供者批量发起请求,然后集中等待应答 | | 多协议 | 私有协议 | 支持二进制等私有协议,支持协议定制和扩展 | | | 公有协议 | 提供websevice等公有协议,用于外部服务对接 | | 序列化 | 二进制类序列化 | Thrift等二进制序列化 | | | 文本类序列化 | JSON、XML等文本序列化方式 | | 统一配置 | 本地静态配置 | 部署时修改,存放到本地配置文件中 | | | 基于配置中心的动态配置 | 运行态调整参数,统一放到配置中心(注册中心),实时生效 |