Tars
RPC 框架 —— Tars
简介
Tars 是基于名字服务使用 Tars 协议的高性能 RPC 开发框架,配套一体化的运营管理平台,并通过伸缩调度,实现运维半托管服务。
设计思想
Tars的设计思路是采用微服务的思想对服务进行治理,同时对整个系统的各个模块进行抽象分层,将各个层次之间相互解耦或者松耦合。
整体架构
整体架构的拓扑图主要分为2个部分:服务节点与公共框架节点(除了服务节点以外的服务)
Tars 框架源码待深入研究
Tars 协议
Tars 协议采用接口描述语言(Interface description language,缩写IDL)来实现,它是一种二进制、可扩展、代码自动生成、支持多平台的协议,使得在不同平台上运行的对象和用不同语言编写的程序可以用 RPC 远程调用的方式相互通信交流, 主要应用在后台服务之间的网络传输协议,以及对象的序列化和反序列化等方面。
协议支持的类型分两种,基本类型和复杂类型:
基本类型包括:void、bool、byte、short、int、long、float、double、string、unsigned byte、unsigned short、unsigned int;
复杂类型包括:enum、const、struct、vector、map,以及struct、vector、map的嵌套。
通过IDL语言协议,可以定义服务提供的接口,并自动生成客户端和服务端的相关通信代码,服务端只需实现业务逻辑即可对外提供服务,客户端通过自动生成的代码即可调用服务,调用方式支持三种模式:
同步调用:客户端发出调用请求后等待服务返回结果后再继续逻辑;
异步调用:客户端发出调用请求后继续其他业务逻辑,服务端返回结果又由回调处理类处理结果;
单向调用:客户端发出调用请求后就结束调用,服务端不返回调用结果。
Soul 中的 Tars 插件
当请求来到 TarsPlugin ,会走到 TarsPlugin 的 doExecute() 方法,doExecute() 方法中 通过 ApplicationConfigCache类拿到 Tars 配置。ApplicationConfigCache类 会初始化代理,来订阅soul-admin中元数据的改变。
@Override
public void onSubscribe(final MetaData metaData) {
if (RpcTypeEnum.TARS.getName().equals(metaData.getRpcType())) {
MetaData metaExist = META_DATA.get(metaData.getPath());
List<TarsInvokePrx> prxList = ApplicationConfigCache.getInstance()
.get(metaData.getPath()).getTarsInvokePrxList();
boolean exist = prxList.stream().anyMatch(tarsInvokePrx -> tarsInvokePrx.getHost().equals(metaData.getAppName()));
if (!exist) {
// 初始化一个代理
ApplicationConfigCache.getInstance().initPrx(metaData);
}
if (Objects.isNull(metaExist)) {
META_DATA.put(metaData.getPath(), metaData);
}
}
}
从 PluginEnum 类可以看出,请求在 tars 插件的处理流程:
BodyParamPlugin ----> TarsPlugin ----> TarsResponsePlugin
BodyParamPlugin:对请求体进行分类处理
TarsPlugin:加载 tars配置,处理请求
TarsResponsePlugin:处理响应数据