腾讯高性能RPC开发框架Tars实现服务治理(微服务)

2023-11-13

Github:https://github.com/Tencent/Tars

1. 介绍

Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。

Tars是将腾讯内部使用的微服务架构TAF(Total Application Framework)多年的实践成果总结而成的开源项目。Tars这个名字来自星际穿越电影人机器人Tars,电影中Tars有着非常友好的交互方式,任何初次接触它的人都可以轻松的和它进行交流,同时能在外太空、外星等复杂地形上,超预期的高效率的完成托付的所有任务。拥有着类似设计理念的Tars也是一个兼顾易用性、高性能、服务治理的框架,目的是让开发更简单,聚焦业务逻辑,让运营更高效,一切尽在掌握。

目前该框架在腾讯内部,有100多个业务、1.6多万台服务器上运行使用。

2. 设计思想

Tars的设计思路是采用微服务的思想对服务进行治理,同时对整个系统的各个模块进行抽象分层,将各个层次之间相互解耦或者松耦合,如下图:

tars

最底的协议层,设计思路是将业务网络通信的协议进行统一,以IDL(接口定义语言)的方式,开发支持多平台、可扩展、协议代码自动生成的统一协议。在开发过程中,开发人员只需要关注通讯的协议字段的内容,不需要关注其实现的细节,大大减轻了开发服务时需要考虑的协议是否能跨平台使用、是否可能需要兼容、扩展等问题。

中间的公共库、通讯框架、平台层,设计思路是让业务开发更加聚焦业务逻辑的本身。因此,从使用者的角度出发,封装了大量日常开发过程中经常使用的公共库代码和远程过程调用,让开发使用更简单方便;从框架本身的角度出发,做到高稳定性、高可用性、高性能,这样才能让业务服务运营更加放心;从分布式平台的角度出发,解决服务运营过程中,遇到的容错、负载均衡、容量管理、就近接入、灰度发布等问题,让平台更加强大。

最上面的运营层,设计思路是让运维只需要关注日常的服务部署、发布、配置、监控、调度管理等操作。

3. 整体架构

3.1. 架构拓扑图

tars

整体架构的拓扑图主要分为2个部分:服务节点与公共框架节点。

服务节点:

服务节点可以认为是服务所实际运行的一个具体的操作系统实例,可以是物理主机或者虚拟主机、云主机。随着服务的种类扩展和规模扩大,服务节点可能成千上万甚至数以十万计。每台服务节点上均有一个Node服务节点和N(N>=0)个业务服务节点,Node服务节点会对业务服务节点进行统一管理,提供启停、发布、监控等功能,同时接收业务服务节点上报过来的心跳。

公共框架节点:

除了服务节点以外的服务,其他服务节点均归为一类。

公共框架节点,数量不定,为了自身的容错容灾,一般也要求在在多个机房的多个服务器上进行部署,具体的节点数量,与服务节点的规模有关,比如,如果某些服务需要打较多的日志,就需要部署更多的日志服务节点。

又可细分为如下几个部分:

Web管理系统:在Web上可以看到服务运行的各种实时数据情况,以及对服务进行发布、启停、部署等操作;

Registry(路由+管理服务):提供服务节点的地址查询、发布、启停、管理等操作,以及对服务上报心跳的管理,通过它实现服务的注册与发现;

Patch(发布管理):提供服务的发布功能;

Config(配置中心):提供服务配置文件的统一管理功能;

Log(远程日志):提供服务打日志到远程的功能;

Stat(调用统计):统计业务服务上报的各种调用信息,比如总流量、平均耗时、超时率等,以便对服务出现异常时进行告警;

Property(业务属性):统计业务自定义上报的属性信息,比如内存使用大小、队列大小、cache命中率等,以便对服务出现异常时进行告警;

Notify(异常信息):统计业务上报的各种异常信息,比如服务状态变跟信息、访问db失败信息等,以便对服务出现异常时进行告警;

原则上要求全部的节点之间网络互通,至少每台机器的node能够与公共框架节点之间都是可以连通的。

3.2. 服务交互流程图

tars

框架服务在整个系统中运行时,服务之间的交互分:业务服务之间的交互、业务服务与框架基础服务之间的交互。

服务发布流程:在Web系统上传server的发布包到patch,上传成功后,在web上提交发布server请求,由registry服务传达到node,然后node拉取server的发布包到本地,拉起server服务。

管理命令流程:Web系统上的可以提交管理server服务命令请求,由registry服务传达到node服务,然后由node向server发送管理命令。

心跳上报流程:server服务运行后,会定期上报心跳到node,node然后把服务心跳信息上报到registry服务,由registry进行统一管理。

信息上报流程:server服务运行后,会定期上报统计信息到stat,打印远程日志到log,定期上报属性信息到property、上报异常信息到notify、从config拉取服务配置信息。

Client访问Server流程:client可以通过server的对象名Obj间接访问server,Client会从registry上拉取server的路由信息(如ip、port信息),然后根据具体的业务特性(同步或者异步,tcp或者udp方式)访问server(当然client也可以通过ip/port直接访问server)。

3.3. web管理系统

tars

web管理系统主要包含以下功能:

  • 业务管理:包括已部署的服务,以及服务管理、发布管理、服务配置、服务监控、特性监控等;

  • 运维管理:包括服务部署、扩容、模版管理等;

3.4. 服务结构图

框架核心的服务端与客户端实现结构图如下:

tars

服务端:

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的处理基类对象;

4. 平台特性

4.1. 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的嵌套。

例如:

tarsproto

4.2. 调用方式

通过IDL语言协议,可以定义服务提供的接口,并自动生成客户端和服务端的相关通信代码,服务端只需实现业务逻辑即可对外提供服务,客户端通过自动生成的代码即可调用服务,调用方式支持三种模式:

同步调用:客户端发出调用请求后等待服务返回结果后再继续逻辑;

异步调用:客户端发出调用请求后继续其他业务逻辑,服务端返回结果又由回调处理类处理结果;

单向调用:客户端发出调用请求后就结束调用,服务端不返回调用结果;

4.3. 负载均衡

框架通过名字服务来实现服务的注册与发现,Client通过访问名字服务获取到被调服务的地址信息列表,Client再根据需要选择合适的负载均衡方式来调用服务,

负载均衡支持轮询、hash、权重等多种方式。

tars

4.4. 容错保护

容错保护通过两种方式实现:名字服务排除和Client主动屏蔽。

tars

名字服务排除的策略:

业务服务主动上报心跳给名字服务,使名字服务知道服务部署的节点存活情况,当服务的某节点故障时,名字服务不在返回故障节点的地址给Client,达到排除故障节点的目标。名字服务排除故障需要通过服务心跳和Client地址列表拉取两个过程,故障排除时间在1分钟左右

Client主动屏蔽:

为了更及时的屏蔽故障节点,Client根据调用被调服务的异常情况来判断是否有故障来更快进行故障屏蔽。具体策略是,当client调用某个svr出现调用连续超时,或者调用的超时比率超过一定百分比,client会对此svr进行屏蔽,让流量分发到正常的节点上去。对屏蔽的svr节点,每隔一定时间进行重连,如果正常,则进行正常的流量分发。

4.5. 过载保护

为了防止业务因为访问量突增或服务器故障造成系统整体的繁忙,进而导致全部服务的不可用,框架内部做相应设计来应对。实现请求队列,服务调用通过非阻塞方式实现异步系统,从而达到提升系统处理能力的目的。并且对队列的长度进行监控,当超过某个阀值,则拒绝新的请求。对请求设置超时时间,当请求包从队列里读取出来是判断请求是否超时,如果超时则不做处理。

tars

4.6. 消息染色

框架提供了对某服务某接口的特定请求进行染色的能力,染色的消息可以透传到后面需要访问的所有服务上,对染色的请求,服务自动把日志上报到特定的染色日志服务器上,使用者只需在染色服务器上即可分析请求访问的路径,方便跟踪定位问题。如下:

tars

4.7. IDC分组

为了加快服务间的访问速度,建设跨地区、跨机房调用带来的网络资源消耗,减少网络故障带来的影响,框架提供了跨地区、跨机房,就近接入的功能。

tars

详细介绍参见docs目录下的tars_idc_set.md

4.8. SET分组

为了方便对业务服务部署管理进行标准化和容量化,框架提供了Set部署能力,set之间没有调用关系,互不干扰,故障隔离,提高运维效率和服务可用性。

tars

详细介绍参见docs目录下的tars_idc_set.md

4.9. 数据监控

为了更好反映和监控小到服务进程、大到业务的运行质量情况,框架支持以下数据上报的功能:

1.提供了服务模块间调用信息统计上报的功能,方便用户查看服务的流量、延时、超时、异常等情况;

tars

2.提供了用户自定义属性数据上报的功能,方便用户查看服务的某些纬度或者指标,比如内存使用情况、队列大小、cache命中率等;

tars

3.提供了服务状态变更和异常信息上报的功能,方便用户查看服务的何时发布过、重启过、宕过以及遇到的异常致命错误等;

tars

4.10. 集中配置

对业务配置进行集中管理并且操作web化,使配置修改更容易,通知更及时,配置变更也更安全;对配置变更进行历史记录,让配置可以轻松回退到前一版本。配置拉取服务化,服务只需调用配置服务的接口即可获取到配置文件。

为了能灵活管理配置文件,配置文件分为几个级别:应用配置、Set配置、服务配置和节点配置。

应用配置为最高一级的配置文件,它是多个服务配置提炼出来的公共配置,服务配置通过引用它来使用其配置内容。

Set配置是具体一个Set分组下所有服务的公共配置,在应用配置的基础上进行补充追加。

服务配置是具体一个服务下所有节点的公共配置,可以引用应用配置。

节点配置是一个应用节点的个性化配置,它和服务配置合并成为具体一个服务节点的配置。

详细介绍可以参见docs目录下的tars_config.md

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

腾讯高性能RPC开发框架Tars实现服务治理(微服务) 的相关文章

  • Weblogic 12c 集群部署和session复制

    在上一篇Weblogic12c集群搭建的基础上 这一篇介绍Weblogic12c集群应用的部署和session复制 1 启动服务 首先在weblogic12c控制台 启动受托管服务server1 server2 server3 2 将要部署
  • 一个普通聊友质问腾讯客服的录音 过瘾哈

    http yumengluentan uueasy com read htm tid 146 html
  • 同城双活与异地多活架构分析

    本文首发于 vivo互联网技术 微信公众号 链接 https mp weixin qq com s OjfFcjnGWV5kutxXndtpMg 作者 vivo官网商城开发团队 采用高可用系统架构支持重要系统 为关键业务提供7x24的不间断
  • 在 Linux 中归档文件和目录的 3 个最流行的工具

    Linux 系统中有多种工具可用于创建归档文件 在本文中 您将发现使用多种工具通过命令行创建或提取存档文件 Tool 1 Zip zip 是 Linux 系统中最流行的命令行归档实用程序 创建文件存档 zip output zip var
  • Eureka迁移到Nacos之服务名称大小问题解决

    我们应用往Eureka中注册使用的名称以及应用内部通过Feign调用 使用的服务名称都是小写 如user service 但是注册到Eureka中后 应用的名称全部都是以大写的形式存储及展现 由于Eureka客户端对大小写的支持都是一样的
  • 从架构师的角度看服务器端架构点滴

    任何服务器端的架构设计 都是性能 一致性和成本三者的权衡 从我在目前的大规模互联网视频公司的负责APP服务器端的角度来讲 我主要关注以下几个点 业务 可靠性 性能 可维护性 一 业务 框架上保证业务的快速迭代 在性能要求不高的情况下 同步架
  • 如何在 Linux 中提取 tar.gz 文件

    Linux 是一个功能强大且灵活的操作系统 因其稳健性和多功能性而备受赞誉 它广泛应用于服务器 嵌入式系统和个人计算机等领域 然而 对于新用户 甚至对于一些有经验的用户来说 某些任务可能看起来令人畏惧 其中一项任务是文件压缩和提取 尤其是在
  • 将 tar/gzip 添加到 Windows 命令行

    正如标题所说 有人知道将 tar gzip 添加到 Windows 命令行的方法吗 我已经安装了 Cygwin 但不知道是否必须在 PATH 环境变量中添加一些内容才能将 tar 作为 cmd 选项 我用来解决这个问题的方法是安装 Cygw
  • 将 .tar.gz 文件的内容从网站读取到 python 3.x 对象中

    我是Python新手 当尝试将 tar gz 文件的内容读入 python 时 我无法弄清楚我做错了什么 我想要阅读的 tar 文件托管在以下网址 ftp ftp ncbi nlm nih gov pub pmc b0 ac Breast
  • 将 tar.gz 打包成 shell 脚本

    我想知道如何将 tar gz 文件打包到 shell 脚本中 就像 idk bin 那样 这样我就可以在一个 shell 文件中交付该程序 而不是 tar gz 有一个Linux 期刊文章 http www linuxjournal com
  • 如何在Linux/Unix中创建大小超过2GB的文件?

    我有一项家庭作业 我必须使用 BitTorrent 算法将一个非常大的文件从一个源传输到多台机器 最初 我将文件切成块 然后将块传输到所有目标 目标具有与其他目标共享其拥有的块的智能 效果很好 我想传输 4GB 文件 因此我对四个 1GB
  • 仅 Tar 目录结构

    我想复制不包括文件的目录结构 tar 中是否有任何选项可以忽略所有文件并仅递归复制目录 您可以使用 find 来获取目录 然后将它们打包 find type d print0 xargs 0 tar cf dirstructure tar
  • Curl 发送 .tar.gz 文件时出现错误 56“从对等方接收数据时失败”

    我对这个 CURL 调用有问题 curl X POST data binary File01 tar gz http website intra prova it gore orgac PINGU TEST lots Test 017 co
  • 通过 ssh 将脚本和二进制数据传输到 stdin

    我想远程执行一个 bash 脚本 该脚本使用 tarball 并对其执行一些逻辑 诀窍是我只想使用一个 ssh 命令来完成此操作 而不是scp对于 tarball 然后是ssh对于脚本 bash 脚本如下所示 cd tmp tar zx a
  • 使用“xargs”和“tar”进行“查找”

    我有以下想做的事情 find maxdepth 6 name tar gz o name bediskmodel o name src o name ciao o name heasoft o name firefly o name sta
  • 删除 tar 生成的尾随空字符

    我正在尝试压缩一些文件并通过 php passthru 命令将它们传递给用户 问题是 尽管 tar 文件应该只有 2k 大小 但它始终是 10240 有趣的数字对吗 所以我把它分解为 sh 4 1 tar czf test wc c 102
  • 强制下载 tar 存档的标头

    我的服务器上有一个 tar 存档 必须可以通过 php 下载 这是我使用过的代码 content file get contents tar header Content Type application force download he
  • 从 Nim 中的 tar.gz 存档中读取文件

    寻找一种使用 Nim 编程语言 版本 0 11 2 从 tar gz 存档中读取文件的方法 说我有一个档案 my path to archive tar gz 以及该存档中的一个文件 my path to archive file txt
  • 如何在不解压缩的情况下检查 Unix .tar.gz 文件是否是有效文件?

    我已经找到问题了如何确定数据是否是有效的没有文件的tar文件 https stackoverflow com questions 1788236 how to determine if data is valid tar file 但我想知
  • 修改 tar 存档中嵌套的文件

    我正在尝试做一个grep然后一个sed搜索文件内的特定字符串 这些文件位于多个 tar 内 全部位于一个主 tar 存档内 现在 我通过以下方式修改文件 首先解压主 tar 存档 然后将里面的焦油全部提取出来 然后进行递归grep进而sed

随机推荐

  • 【实践篇】推荐算法PaaS化探索与实践

    作者 京东零售 崔宁 1 背景说明 目前 推荐算法部支持了主站 企业业务 全渠道等20 业务线的900 推荐场景 通过梳理大促运营 各垂直业务线推荐场景的共性需求 对现有推荐算法能力进行沉淀和积累 并通过算法PaaS化打造通用化的推荐能力
  • Flutter图片放大(双击缩放、双指滑动缩放、拖拽)

    import dart ui import package flutter material dart import package flutter services dart import package flutter screenut
  • uniapp+vue3+ts 使用pinia报错

    hasInjectionContext is not exported by node modules vue demi lib index mjs imported by node modules pinia dist pinia mjs
  • springboot开启多线程支持

    springboot开启多线程支持 springboot默认是可以支持多线程的 配置类上加上 EnableAsync注解 就可以在想多线程支持的方法上加上 Async该方法就可以自持多线程了 配置类 配置线程池 import org spr
  • 接口失败--net::ERR_HTTP2_PROTOCOL_ERROR 200,无法加载响应数据

    问题 接口报错 net ERR HTTP2 PROTOCOL ERROR 200 无法加载响应数据 后端返回固定一条数据的 可以正常下载导出 一般数据返回为100KB 接口报错 不明原因 解决 关闭前端配置访问网页的https 接口正常 还
  • 相机IO硬件输入输出

    工作那么久了不怎么用硬件触发 今天恶补一下 干什么用的 通过IO输入来触发相机拍照 或者通过相机的IO输出来触发光源 来一波参考网页 1 Basler相机硬触发的接线方法 2 PNP NPN与PLC 你还在傻傻分不清楚吗 3 BASLAR相
  • Centos系统中mongodb的安装详解

    1 mongodb安装 MongoDB的下载网址 Download MongoDB Community Server MongoDB 将下载的压缩包文件上传到centos系统中 可以直接使用rz scp或者可视化工具上传 解压缩文件 Mon
  • Python中sklearn版本的升级

    调用sklearn的impute时 发现sklearn中没有impute的模块 from sklearn impute import SimpleImputer 报错 ModuleNotFoundError No module named
  • Python 数据分析与可视化实战

    一 Python环境搭建与配置 Python作为一门优秀的编程语言 受到很多程序员和编程爱好者的青睐 近年来 Python还在办公领域大展拳脚 许多白领纷纷加入了学习Python的行列 这是因为Python在数据的采集 处理 分析与可视化方
  • 关于C++匿名命名空间

    C 另外有一种匿名的命名空间 来保证生成的符号是局部的 这样对于匿名空间中的变量等 外部都是不可见的 test3 cpp static void bar namespace 匿名的命名空间 float bar2 int foo test4
  • java类的加载过程

    Java 类加载机制 类从被加载到JVM中开始 到卸载为止 整个生命周期包括 加载 验证 准备 解析 初始化 使用和卸载七个阶段 其中类加载过程包括加载 验证 准备 解析和初始化五个阶段 类的加载过程 png 类的加载过程 加载 1 通过类
  • Unity中GetAxisRaw和GetAxis的区别

    GetAxis带有变化程度 GetAxisRaw更精准 在Unity中 Input GetAxis和Input GetAxisRaw函数都用于读取输入轴的值 但它们有一些区别 GetAxis函数返回的值是经过平滑处理的 即它会在一定时间内将
  • vpn原理

    1 VPN原理 VPN是虚拟专用网络的简称 简单的说就是利用公用网络架设专用网络 当我们打开VPN的时候 VPN就会在电脑上虚拟一个IP地址 当电脑要传输数据包时 VPN会对这个数据包进行加密 发出数据包的地址是VPN虚拟出来的地址 而接受
  • WPF的RenderTransform特效

    RenderTransform特效 变形 WPF中的变形 RenderTransform 类是为了达到直接去改变某个Silverlight对象的形状 比如缩放 旋转一个元素 的目的而设计的 RenderTransform包含的变形属性成员就
  • 操作系统题库

    第一章作业一 一 单选题 共5题 25 0分 操作系统的 管理部分负责对进程进行调度 A 存储器 B 设备 C 文件 D 处理机 正确答案 D 我的答案 D 下面操作系统 要保证系统有较高的吞吐能力 A 批处理系统 B 分时系统 C 网络操
  • Linux-文本处理

    一 字段截取 1 1 cut字段提取命令 格式 cut d 间隔符 f 列号 c 字符 cut 选项 文件名 区别 grep是行提取命令 cut是列提取命令 d 指定分隔符类型 f 指定打印第几列 c 按字符分割 按照单个字符进行分割 比如
  • ElementUI实现el-table列的显示与隐藏和列拖拽(RuoYi分离版)

    显示隐藏步骤思路 一 table要实现v for循环添加列的操作 二 给列添加v if属性 方法返回当前列是否显示隐藏 在RightToolBar添加列显示隐藏的图标控件
  • 树莓派详解

    参考文献 1 树莓派教程第一课 树莓派简介 十分钟玩转系列入门篇 哔哩哔哩 bilibili
  • 计算机网络断开后怎么连接,电脑网络断开怎样重新连接

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 电脑网络断开重新连接的方法是 1 点击右下角网络图标 点击 打开网络和共享中心 2 点击 更改适配器设置 3 点击右键启用网络即可 网络是由节点和连线构成 表示诸多对象及其
  • 腾讯高性能RPC开发框架Tars实现服务治理(微服务)

    Github https github com Tencent Tars 1 介绍 Tars是基于名字服务使用Tars协议的高性能RPC开发框架 同时配套一体化的服务治理平台 帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用