一、RPC架构
RPC(Remote Procedure Call),一种进程间通信方式。允许像调用本地服务一样调用远程服务
框架原理
RPC框架负责屏蔽底层的传输方式(TCP、UDP)、序列化、通信细节。框架使用者,仅需要关注需要什么样的远程服务接口即可。不需要关心通信细节与调用过程。
RPC框架核心技术点
- 远程服务提供者,以某种形式(例如jar)提供服务调用相关信息。包括但不限于服务接口定义、数据结构
- 远程代理对象:服务调用者调用的服务是远程服务的本地代理。对于java,是JDK的动态代理,通过动态代理的拦截机制,将本地调用封装成远程服务调用。
- 通信:框架应该与具体的协议无关。
-
架构原理
不同分布式服务框架实现细节存在差异,但核心功能差异不大。
分布式服务框架可以抽象为三层 RPC层:包含底层通信框架(netty、http等)、序列化、反序列化、屏蔽底层通信协议细节和序列化差异的Remoting框架。
- Filter Chain层:服务调用职责链,提供多种服务调用切面,方便框架自身以及使用者扩展。(例如负载均衡、失败重发、调用性能统计等)
- Service层:主要包括Java动态代理。
消费者端:将服务提供者的接口利用动态代理,封装成远程服务调用。
提供者端:根据消费者请求消息(接口名、方法名、参数列表),反射调用接口实现类。
分布式框架另外的两个重要功能:注册中心、监控中心(也可称为服务治理中心)
分布式框架必须的功能特性
特性名 | 功能名 | 说明 |
---|---|---|
服务订阅发布 | 配置化发布和引用服务 |
| | | 服务自动发现机制 | 支持服务实时自动发现,注册中心实时推送给消费者 | | | 服务在线注册和去注册 | 支持服务运行状态,上、下线新服务 | | 服务路由 | 默认提供随机、轮询、基于权重的路由策略 | 默认提供常用策略,避免重复开发 | | | 粘滞连接 | 同一消费者,总向同一台服务发送请求(不必重新建立连接),除非服务宕机 | | | 路由定制 | 支持用户自定义路由策略 | | 集群容错 | Failover | 失败自动切换,失败后,重试其他服务 | | | Failback | 失败后,定时重发 | | | Failfast | 快速失败,仅发起一次调用,失败立刻报错(非幂等系统) | | 服务调用
| 同步调用 | 消费者发起请求后,阻塞等待 | | | 异步调用 | 消费者发起请求后,不阻塞立即返回,由提供者异步通知 | | | 并行调用 | 消费者同时对多个提供者批量发起请求,然后集中等待应答 | | 多协议 | 私有协议 | 支持二进制等私有协议,支持协议定制和扩展 | | | 公有协议 | 提供websevice等公有协议,用于外部服务对接 | | 序列化 | 二进制类序列化 | Thrift等二进制序列化 | | | 文本类序列化 | JSON、XML等文本序列化方式 | | 统一配置 | 本地静态配置 | 部署时修改,存放到本地配置文件中 | | | 基于配置中心的动态配置 | 运行态调整参数,统一放到配置中心(注册中心),实时生效 |