1、Tars 框架的定义
Tars是【基于名字服务】【使用Tars协议】的高性能【RPC】开发框架,同时配套一体化的【服务治理平台】,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。
Tars也是一个兼顾易用性、高性能、服务治理的框架,目的是让开发更简单,聚焦业务逻辑,让运营更高效,一切尽在掌握。
解决了如上图的问题,框架整体思维 就是把开发 运营,测试 整合到一起,简单易用
2、设计思路
Tars的设计思路是采用微服务的思想对服务进行治理,同时对整个系统的各个模块进行抽象分层,将各个层次之间相互解耦或者松耦合,
最底的协议层,设计思路是将业务网络通信的协议进行统一,以IDL(接口定义语言)的方式,开发支持多平台、可扩展、【协议代码自动生成】的统一协议。在开发过程中,开发人员只需要关注通讯的协议字段的内容,不需要关注其实现的细节,大大减轻了开发服务时需要考虑的协议是否能跨平台使用、是否可能需要兼容、扩展等问题。
中间的公共库、通讯框架、平台层,设计思路是让业务开发更加聚焦业务逻辑的本身。因此,从使用者的角度出发,封装了大量日常开发过程中经常使用的公共库代码和远程过程调用,让开发使用更简单方便;从框架本身的角度出发,做到高稳定性、高可用性、高性能,这样才能让业务服务运营更加放心;从分布式平台的角度出发,解决服务运营过程中,遇到的容错、负载均衡、容量管理、就近接入、灰度发布等问题,让平台更加强大。
最上面的运营层,设计思路是让运维只需要关注日常的服务部署、发布、配置、监控、调度管理等操作。
3、框架节点
整体架构的拓扑图主要分为2个部分:服务节点与公共框架节点。
服务节点:
服务节点可以认为是服务所实际运行的一个具体的操作系统实例,可以是物理主机或者虚拟主机、云主机。随着服务的种类扩展和规模扩大,服务节点可能成千上万甚至数以十万计。
每台服务节点上均有一个Node服务节点和N(N>=0)个业务服务节点,Node服务节点会对业务服务节点进行统一管理,提供启停、发布、监控等功能,同时接收业务服务节点上报过来的心跳。
公共框架节点:
除了服务节点以外的服务,其他服务节点均归为一类。
公共框架节点,数量不定,为了自身的容错容灾,一般也要求在在多个机房的多个服务器上进行部署,具体的节点数量,与服务节点的规模有关,比如,如果某些服务需要打较多的日志,就需要部署更多的日志服务节点。
又可细分为如下几个部分:
Web管理系统:在Web上可以看到服务运行的各种实时数据情况,以及对服务进行发布、启停、部署等操作;
Registry(路由+管理服务):提供服务节点的地址查询、发布、启停、管理等操作,以及对服务上报心跳的管理,通过它实现服务的注册与发现;
Patch(发布管理):提供服务的发布功能;
Config(配置中心):提供服务配置文件的统一管理功能;
Log(远程日志):提供服务打日志到远程的功能;
Stat(调用统计):统计业务服务上报的各种调用信息,比如总流量、平均耗时、超时率等,以便对服务出现异常时进行告警;
Property(业务属性):统计业务自定义上报的属性信息,比如内存使用大小、队列大小、cache命中率等,以便对服务出现异常时进行告警;
Notify(异常信息):统计业务上报的各种异常信息,比如服务状态变跟信息、访问db失败信息等,以便对服务出现异常时进行告警;
原则上要求全部的节点之间网络互通,至少每台机器的node能够与公共框架节点之间都是可以连通的。
4、服务结构图
框架核心的服务端与客户端多线程模型如下:
服务端:
NetThread:网络线程,负责收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp;
BindAdapter: 绑定端口类,用于管理servent(业务线程)对应的绑定端口的信息操作;
ServantHandle:业务线程类,根据对象名分派Servant的对象和接口调用;
AdminServant: 管理端口的对象;
ServantImp: 继承Servant的业务处理基类(Servent:服务端接口对象的基类);
客户端:
NetThread:网络线程, 收发包,连接管理,多线程(可配置),采用epoll ET触发实现,支持tcp/udp;
AdapterProxy: 具体服务器某个节点的本地代理,管理到服务器的连接,以及请求超时处理;
ObjectProxy: 远程对象代理,负责路由分发、负载均衡、容错,支持轮询/hash/权重;
ServantProxy: 远程对象调用的本地代理,支持同步/异步/单向,Tars协议和非Tars协议;
AsyncThread: 异步请求的回应包处理线程;
Callback: 具体业务Callback的处理基类对象;
5、 tars协议
tars协议采用接口描述语言(Interface description language,缩写IDL)来实现,它是一种二进制、可扩展、代码自动生成、支持多平台的协议,使得在不同平台上运行的对象和用不同语言编写的程序可以用PRC远程调用的方式相互通信交流, 主要应用在后台服务之间的网络传输协议,以及对象的序列化和反序列化等方面。
协议支持的类型分两种,基本类型和复杂类型。
基本类型包括:void、bool、byte、short、int、long、float、double、string、unsigned byte、unsigned short、unsigned int;
复杂类型包括:enum、const、struct、vector、map,以及struct、vector、map的嵌套。
6、调用方式
通过IDL语言协议,可以定义服务提供的接口,并自动生成客户端和服务端的相关通信代码,服务端只需实现业务逻辑即可对外提供服务,客户端通过自动生成的代码即可调用服务,调用方式支持三种模式:
同步调用:客户端发出调用请求后等待服务返回结果后再继续逻辑;
异步调用:客户端发出调用请求后继续其他业务逻辑,服务端返回结果又由回调处理类处理结果;
单向调用:客户端发出调用请求后就结束调用,服务端不返回调用结果;
7、tars部署
实际上 如上图 Tars-Web 还有tarspatch 必须部署在一台机器上,其他的如tarsAdminRegistry、tarsregistry、tarsconfig、tarsnotify、tarsquerystat、tarsqueryproperty 可以部署在不同的机器上,支持多机部署。而tarsstat、tarsproperty、tarslog 必须部署在一台机器上