运维与微服务结合?深度解析微服务框架Tars整体解决方案

Posted 马哥教育

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维与微服务结合?深度解析微服务框架Tars整体解决方案相关的知识,希望对你有一定的参考价值。

内容导航

  • 什么是Tars?

  • Tars框架源码部署
  • Tars服务部署管理
  • Tars配置中心
  • Tars服务发现
  • Tars远程日志
  • Tars状态监控

什么是Tars

Tars是一个支持多语言内嵌服务治理功能的框槛,能与DevOps比较好的协同开发。提供了包含开发、运维、以及测试的一整套解决方案。Tars集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过Tars可快速用微服务的方式构建自己高可用的分布式应用,并实现完整有效的服务治理。总体来讲,Tars是一个跨平台、跨语言的软件运行环境,是基于service mesh设计理念实现的开发框架。

Tars框架源码部署

注:用CentOS7部署,CentOS6 需升级glic

部署环境

  • Docker环境安装
  • mysql安装
  • Linux/Mac源码部署
  • Windows源码部署
  • TarsDocker部署
  • K8s Docker部署
  • TarsNode部署

依赖环境

软件 软件要求
linux内核版本 2.6.18及以上版本(操作系统依赖)
gcc版本 4.8.2及以上版本、glibc-devel(C++语言框架依赖)
bison工具版本 2.5及以上版本(C++语言框架依赖)
flexl具版本 2.5及以上版本(C++语言框架依赖)
cmake版本 3.2及以上版本(C++语言框架依赖)
mysql版本 4.1.17及以上版本(框架运行依赖)
nvm版本 0.35.1及以上版本(web管理系统依赖,脚本安装过程中自动安装)
node版本 12.13.0及以上版本(web管理系统依赖,脚本安装过程中自动安装)

Tars服务部署管理

  • 部署过程有生命周期完整的页面交互
  • 零配置或配置模板化,页面配置化操作执行文件,部署服务
  • 部署后可以在页面上进行验证,并在页面上查看服务的运行状态以及产生的日志,方便问题的排查上报
  • 版本管理页面直观可见,可以进行版本的升降级
  • VPN或公网网络互通后,可以实现远程部署
  • 部署过程无需技术背景,操作简单
  • 部署方案可以跨平台

服务发布架构实现

  • tars patch 组件将war包上传到 patch 目录 (/usr/local/app/patch/tars.upload/)
  • tars注册中心通知node拉取对应的包到本地
  • 启动对应的服务
  • 服务启动后web页面可以查看启动状态
  • 服务启动后web页面可以通过流式日志查看服务的启动日志.

灰度发布

Tars支持灰度发布,具体可查看下图

熔断策略

当客户端和服务端需要交互时,可在注册中心拉取路由。客户端从注册中心拉取到注册信息之后可以根据内部对服务的判断决定请求什么服务。

服务发布

  • 运维管理

服务部署

  • 模版管理

  • 发布管理

  • 服务管理

  • 框架检查

Tars服务发布与传统服务发布对比

对比项 Tars服务发布 传统服务发布
服务发布 页面可视化,傻瓜式操作 ssh远程登录,上传文件,脚本启 动服务
服务升级 页面上传war包,选择war包发布 与服务发布冋样流程,但要考虑历史文件的备份
服务降级 页面选择对应的版,发布 如果有备份文件,还原服务包文件, 脚本启动,没有备份文件,需要源码回滚打包上传,再通过脚本启动
需要技能 不需要 一定的运维经验,服务器操作, shell脚本的编写
集群发布 选择多个节点,发布 需要将包copy到对应的机器,重新启动服务

Tars配置中心

配置中心提供服务配置文件的统一管理功能。是实时更新配置文件、push配置文件到服务、服务主动pull配置文件的统一管理中心。主要包含以下优点:

  • 对业务配置进行集中管理并且提供操作页面,使配置修改更容易,通知更及时,配置变更也更安全;
  • 对配置变更进行历史记录,让配置可以轻松回退到前一版本。
  • 配置拉取简单,服务只需调用配置服务的接口即可获取到配置文件。
  • 能灵活管理配置文件,配置文件分为几个级别:应用配置、Set配置、服务配置和节点配置。

配置信息维护

tars框架通过两个数据表(存在mysq I中)来维护这些配置信息:t_config_file s和 t_config_references。

  1. t_config_files表的主要信息:服务配置文件名称、配置文件类型、配置文件所属服务名,配置文件所属set分组,配置文件所属节点ip以及配置文件的索引id值以及该服务所在set分组信息。
  2. t_config_references表的主要信息:配置文件的索引id以及该id所引用的配置文件索引id。

服务配置

tars web管理系统上添加配置、添加引用文件、push配置文件到服务。配置文件会被推到相应的目录下。

服务代码中pull配置文件到本地。

Tars服务发现

Tars协议采用接口描述语言(Interface description language,缩写 IDL)来实现,它是一种二进制、可扩展、代码自动生成、支持平台的协议,使得在不同平台上运行的对象和用不同语言编写的程序可以用RPC远程调用的方式相互通信交流,主要应用在后台服务之间的网络传输协议,以及对象的序列化和反序列化等方面。 注册中心主要涉及到三大角色: 服务提供者、服务消费者、注册中心 。

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

数据结构

协议支持的类型分两种,基本类型和复杂类型。

  • 基本类型包括:void、bool、byte、short、int、long、float、double、string、unsigned byte、unsigned short、unsigned int。
  • 复杂类型包括:enum、const、struct、vector、map, 以及struct、vector、map的嵌套。

寻址方式

自动寻址: 客户端Endpoint注册表的缓存更新周期,主动方式(周期刷新一分钟,refreshEndpointInterval) 自动寻址用的负载均衡算法(包含多种)

直接寻址: 可以通过手动填写IP port实现直接寻址,调试特殊场景下使用

调用方式

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

  • 同步调用:客户端发出调用请求后等待服务返回结果后再继续逻辑。
  • 异步调用:客户端发出调用请求后继续其他业务逻辑,服务端返回结果又由回调处理类 处理结果。
  • 单向调用:客户端发出调用请求后就结束调用,服务端不返回调用结果。

Tars文件定义结构演示

服务注册

Tars服务注册优点:

  • 简单易用:对开发者透明
  • 高可用:几台注册中心坏掉不会导致整个服务瘫痪,注册服务整体持续可用
  • 避免跨越机房调用:最好调用优先同一个机房的服务以减少网络延迟
  • 跨语言:允许开发者使用多种编程语言构建微服务
  • 负载均衡:负载均衡支持轮询、hash、权重等多种方式。
  • 容错保护:名字服务排除和Client主动屏蔽。

名字服务排除的策略:

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

Client主动屏蔽:

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

页面上手动上传进行的注册,注册到了 mysql.也可以通过Web API实现自动上传和部署

服务注册过程如下图所示:

服务发现过程如下图所示:

客户端实现原理

服务端实现原理

Tars调用链

在Tars管理平台上选中要开启调用链的服务,点击“编辑”

最终效果如下图所示:

点开单词调用链查看详细信息

Tars远程日志

Tarslog是Tars日志服务,基于Logback作为日志系统,用于将日志内容打到本地或远程服务器,并且支持服务内日志调用链路追踪以及日志染色。

Tarslog提供了十分灵活的配置项,可以为用户提供更加强大的日志功能。

Tars内置的远程日志功能是以logback插件的模式存在,只需将插件引入到logback配置文件即可,配置简单,并且可自定义日志打印到本地以及远程。

Tars日志模块可通过MDC实现服务内日志链路跟踪以及自定义日志染色。MDC内部持有一个ThreadLocal对象,其中存储了一个Map,因此用户可以根据需要向其中添加键值对。

Tars日志模块通过配置可支持高可用。

日志打印

流程如下图所示:

  1. 官网(https://github.com/TarsCloud/TarsJava)下载源码
  2. 通过mvn package 命令将 TarsJava 下的 tars-plugins 打成jar包
  3. 将打好的jar包放入到工程中。
  4. 配置logback文件,添加appender。如图配置
  5. 代码中通过 Logger logger = LoggerFactory. getLogger("root")获取Iogger对象。
  6. 通过logger.debug("message")打印日志,此时日志会打印到第四步附图中 logserverObjname配置的Iogserver中;

MDC服务内日志链路跟踪

  1. MDC内部持有一个ThreadLocal对象,在单个线程处理的请求链路中,通过 MDC. put(“traceId", value)设置调用链路 ID。
  2. 在logback配置文件中利用pattern获取traceld,如下图配置:。
  3. 此时单个请求链路中打印的所有日志已经包含第一步中MDC中put的traceId所对应的值。

MDC日志染色

  1. 通过实现 ForegroundCompositeConverterBase<ILoggingEvent> 接口封装染色 conversionRule。如下图所示:

  1. 配置logback.xml文件,增加conversionRule标签,指向第一步封装的染色conversionRule类,并在输出远端日志的Appender中使用此染色规则。如下图所示:

logback 整合 Kafka

方式1:手写Appender

  1. 引入Kafka jar包,导入到项目中。
  2. 手写Appender实现日志发送到Kafka。
  3. 配置logback.xml。

方式2:开源jar

具体请参考资料:https://github.com/danielwegener/logback-kafka-appender

  1. 引入开源jar包,导入到项目中。
</dependency> 
<groupld>com.github.danielwegener</groupld> 
<artifactld>logback-kafka-appender</artifactld> 
<version>0.2.0</version> 
<scope>runtime</scope> 
</dependency> 
  1. 配置logback.xml,配置kafkaAppender,以及kafka信息(host, topic等)。
  2. 把kafkaAppender放到日志输出。
<root level="lNFO"><appender-ref ref="kafkaAppender"/></root>  

总结

  • 目前远程日志服务不支持跨服务日志链路追踪,需要zipkin实现链路追踪。Tars已经集成zipkin)
  • 可配置多台远程日志服务地址,实现咼可用。
  • 可基于Logback做功能的横向扩展。

Tars状态监控

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

  • 提供了服务模块间调用信息统计上报的功能。方便用户查看服务的流量、延时、超时、异常等情况。
  • 提供了用户自定义属性数据上报的功能。方便用户查看服务的某些维度或者指标, 比如内存使用情况、队列大小、cache命中率等。
  • 提供了服务状态变更和异常信息上报的功能。方便用户查看服务的何时发布过、重启过、宕过以及遇到的异常致命错误等。

Tars统计信息

统计信息包含访问次数、耗时、异常和耗时。统计及聚合由各语言框架SDK提供,无论成功与否,框架 SDK都将会上报。

上报统计信息是向Tars框架内的tarsstat上报耗时信息和其他信息。无需用户开发,只需在程序初始化期间正确设置相关信息后,就可以在框架内自动报告。

客户端调用上报接口后,会暂时将信息存储在内存中,当到达某个时间点时,会向tarsstat服务上报(默认为1分钟上报一次)。两个上报时间点之间的时间间隔称为统计间隔,在统计间隔中会执行诸如聚合和比较相同key的一些操作。

Tars特性监控

特性监控上报的是服务脚本的自定义特性,它由特性名、特性值、以及统计方法构成,类似指标监控。每种语言SDK有默认的特性监控指标,比如 JAVA 默认包含 jvm.memory, jvm.gc 等。

也可以自定义拓展:

obj = property.create(name, [new property.POLICY.Count, new property.POLICY.Max]); 
obj.report(value) 

Tars服务监控

集群中所有机器都有Node服务用于管理应用,Node服务其中一个重要功能为服务监控。Node服务通过开启一个监控线程,负责定时(时间间隔可以配置)轮询监控Node所管理的所有服务的运行状态,并定时向主控上报服务的运行状态。

  • 应用服务SDK会定期上报心跳。
  • Node服务会定期检查SDK的心跳超时。
  • Node服务会定期检测服务进程是否存在。

写在最后

近年来,在AIOps领域极速发展的背景下,IT工具、平台能力、解决方案、AI场景及可用数据集的迫切需求在各行业迸发。基于此,云智慧在2021年8月发布了AIOps社区,旨在树起一面开源旗帜,为各行业客户、用户、研究者和开发者们构建活跃的用户及开发者社区,共同贡献及解决行业难题、促进该领域技术发展。

成立近半年,社区先后开源了数据可视化编排平台-FlyFish、运维管理平台OMP、云服务管理平台-摩尔平台、Hours算法等产品。其中FlyFish斩获中国开源云联盟2021优秀开源项目奖。OMP运维管理平台入选2021 年度 OSC 中国开源项目「最受欢迎项目」榜单。并在业内首次开源了智能运维开源数据集-GAIA数据集,填补了AIOps开源集数据领域的空白。欢迎大家点击下方链接了解更多云智慧开源项目~

GitHub地址:https://github.com/CloudWise

Gitee地址:https://gitee.com/CloudWise

以上是关于运维与微服务结合?深度解析微服务框架Tars整体解决方案的主要内容,如果未能解决你的问题,请参考以下文章

微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端

Tars腾讯微服务框架Tars介绍

腾讯开源|腾讯与阅文技术合作 微服务框架Tars再添PHP

容器云与微服务架构专题培训班

腾讯微服务框架TARS成功移植至Arm架构

开源推荐-C++开发的微服务框架Tars