TAF /tars必修课(一):整体架构理解
来自零点智能社区
一、前言
TAF,一个后台逻辑层的高性能RPC框架,目前支持C++,Java, node 三种语言, 往后可能会考虑提供更多主流语言的支持如 go等,自定义协议JCE,同时也支持HTTP。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。
当前已开源,易名为“TARS”,赶紧上github去star一下吧。
此系列文章选用Java语言进行描述,先对TAF部署开发环境、相关概念和整体架构做介绍,后面分taf-server、taf-client两部分展开,相关文档不多,主要从代码上进行理解。
二、部署开发环境
1. 部署
TAF的部署有管理平台的支持,如果是147或213测试环境,申请服务节点和部署都不需要管理人员的审批,已经接入docker环境,按需申请,上线成功后支持动态扩容,非常方便,使用完关闭下线即可。
2. 开发
需要使用maven进行项目管理,引入如下依赖:
<dependencies>
<dependency>
<groupId>qq-central</groupId>
<artifactId>taf-server</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>qq-central</groupId>
<artifactId>taf-proxy</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
然后需要在code平台上创建一个svn代码仓库,将创建好对应的位置填写到管理平台的编译选项中,这样平台就可以直接从你填写的位置去拉取代码到编译机上进行编译了。注意:代码仓库需要添加一个用户svn_taf 的读权限;当然也可以采用其他的编译方式,如申请编译机和开发机,可km上查找并理解区分一下taf 测试机,编译机,开发机。
最后需要有一个mnet 跳板机,这个需要leader审批,申请之后安装go工具用来远程登录taf节点看日志,这样准备工作就基本完成了。
在开发中只需要关注业务逻辑实现即可,但如果想进一步了解清楚框架底层的机制和实现,后面的文章将进行相关探讨。
部署开发过程如下图所示:
三、整体交互流程
官方文档的这张图再清晰不过了
其中registry为主控服务,提供路由查询; 另外这里的patch为发布服务请求,传达到patch服务后由node服务在各个节点上拉起;
petsvr服务会定期上报心跳到node服务,由node服务统一将心跳上报registry,我觉得这样是要比单独一个个上报更加高效的,同时可以向petsvn发送管理admin命令;
下面的各个服务节点就是TAF提供的运营支持,定期上报统计信息到stat,打印远程日志到log,定期上报属性信息到property、上报异常信息到notify、从config拉取服务配置信息 ;
最后需要注意,Java部分代码没有主控的实现,仅包括Server和Client端,但在使用上只要将registry,node和各个运营服务部署运行成功,服务之间都是可以通过走JCE协议进行交互的。
四、配置管理
TAF有配置管理服务,此外管理平台上也有许多配置项,代码中有很多地方都会从配置文件中读取配置项的,容易搞混,这里先简单做个介绍。
服务上线后,跳板机登录进入到目录 /usr/local/app/taf,展开目录结构如下:
├── app_log -> /dockerdata
└── app.service
├── bin
│ ├── apps
│ ├── conf
│ ├── lib
│ └── log
├── conf
│ └── app.service.config.conf
└── data
└── tafnodes.dat
其中:app.service为你上线服务对应的应用名和服务名;
apps目录下的ROOT即为项目代码资源所在位置;
管理平台的服务配置项上添加的配置文件,可push或拉取到本地 bin/conf 目录;
另外,有三个重要的默认目录提一下,
应用根目录:basepath=/user/local/app/taf/app.service/bin 日志目录:logpath=/user/local/app/taf/app_log 数据目录:datapath=/user/local/app/taf/app.service/data
当然以上这些配置你也在配置文件中看到,管理平台上的操作为:
服务管理页中,点击私有模版可对模版进行更改;
点击Servant管理页可对单个服务的最大连接数,线程数,线程池大小,是否灰度等选项进行更改,如下图:
五、RPC
RPC(Remote Procedure Call),即远程过程调用,可理解为一种通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序。使用RPC框架的好处就是不需要额外编写网络交互这部分代码了,这部分代码编写上也极容易出错,因此框架相当于在Socket层之上做了一层可靠的应用层封装。另外,远程调用涉及数据包的编解码,框架通常会定义接口描述语言(Interface Description Language,IDL),方便跨平台的远程过程调用。
TAF框架正是提供了以上问题的完整方案,服务端采用异步NIO通信模式,客户端可支持同步或异步调用; 数据编码提供了JCE协议支持,同时支持编写IDL运行脚本实现代码自动生成。从某种意义来说,我觉得可以简化跨语言混合编程,
在服务端处理客户端的并发请求中,TAF实现上采用了Reactor多线程模式,这里贴两张网上看到觉得比较好的NIO时序图,有利于理解。
服务端:
客户端:
下节单独对TAF线程模型做介绍。
感谢阅读,有错误之处还请不吝赐教。
上周答辩结束,终于有时间把之前整理的整理一下
这段时间的实习还是收获良多,除了技术上的,还有思维逻辑和方法论上的吧,有许多的致谢,留待以后慢慢言谢吧
0827 update:
不知不觉已完成了预期的总结,该系列文章汇总如下,欢迎阅读指教,交流学习:
TAF-必修课(一):整体架构理解
TAF-必修课(二):Reactor多线程模型
TAF-必修课(三):Server启动全过程
TAF-必修课(四):过载保护
TAF-必修课(五):Client端调用
TAF-必修课(六):容错
TAF-必修课(七):负载均衡
当然,TAF相关的内容远不止这些,比如这里暂时没有具体探讨的还有:协议、IDC分组、Set部署、就近接入、日志相关、消息染色、配置中心、运营监控服务等;
计划往后继续深入学习慢慢补充,或许还可以搞成一个系列,再升级到选修课 …..(先给自己定个小目标,比如 * * *是吧)
由于水平有限,文章难免有错误或纰漏之处,请各位看官不吝赐教
TAF /tars必修课(一):整体架构理解的更多相关文章
- 《深入理解bootstrap》读书笔记:第二章 整体架构
一. 整体架构 1. CSS-12栅格系统 把网页宽度均分为12等分(保留15位精度)--这是bootstrap的核心功能. 2.基础布局组件 包括排版.按钮.表格.布局.表单等等. 3.jQu ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- Underscore 整体架构浅析
前言 终于,楼主的「Underscore 源码解读系列」underscore-analysis 即将进入尾声,关注下 timeline 会发现楼主最近加快了解读速度.十一月,多事之秋,最近好多事情搞的 ...
- jQuery整体架构源码解析(转载)
jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...
- MINIX3 内核整体架构回顾及内核定 性分析
MINIX3 内核整体架构回顾及内核定 性分析 12.1 注意事项 由于本文档不对 I/O 文件系统做出分析,所以在此不对 MINIX3 整体做出一个分 析,本章主要是针对内核进程分析.并且这里的模 ...
- LevelDB系列之整体架构
LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口.为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度.从静态角度,可以假想整个系 ...
- Bootstrap学习笔记之整体架构
之前有粗略地看过一下Bootstrap的内容,不过那只是走马观花式地看下是怎么用的,以及里面有什么控件,所以就没想着记笔记.现在由于要给部门做分享,所以不得不深入地去学习下,不然仅是简单地说下怎么用, ...
- jQuery整体架构源码解析
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- ODI 系列学习--整体架构概念
ODI 系列学习--整体架构概念 ODI整体架构没有Oracle Database复杂,因为它属于程序功能的使用,更多是程序开发和配置的工作,当然ODI的优化涉及到很多数据库优化的工作,从整体架构入手 ...
随机推荐
- Socket 初识 用Socket建立一个简易Web服务器
摘自<Asp.Net 本质论>作者:郝冠军 //在.Net中.system.Net命名空间提供了网络编程的大多数数据据类型以及常用操作,其中常用的类型如下: /* IPAddress 类表 ...
- Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
insert元素 属性详解 其属性如下: parameterType ,入参的全限定类名或类型别名 keyColumn ,设置数据表自动生成的主键名.对特定数据库(如PostgreSQL),若自动生成 ...
- 一步步构建iOS路由
什么是移动端路由层: 路由层的概念在服务端是指url请求的分层解析,将一个请求分发到对应的应用处理程序.移动端的路由层指的是将诸如App内页面访问.H5与App访问的访问请求和App间的访问请求,进行 ...
- selinux介绍/状态查看/开启/关闭
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统--百度百科. 基于经验来说SELinux在 ...
- git rebase commit 信息处理
pick:正常选中 reword:选中,并且修改提交信息: edit:选中,rebase时会暂停,允许你修改这个commit(参考这里) squash:选中,会将当前commit与上一个commit合 ...
- js如何返回两个数的商的整数和余数部分?
js中,如何返回两个数的商的整数和余数部分? 如: num1:100 ,num2:12 var num = parseFloat(100/12); //值: 8.333333333333334 那么如 ...
- 微信PC客户端无法发送图片,怎么解决?
今天登陆电脑的微信客户端,无法发送截图图片,该怎么办? 解决方法 1.在任务栏找到程序,右键找到设置
- js string对象方法
substr(start,length) substring(start,end) 返回子串,原字符串不改变.
- day04控制流程之if判断
一.控制流程之if判断 1.什么是if判断 判断一个条件如果成立则...不成立则... 2.为何要有if判断 让计算机能够像人一样具有判断能力 3.如何用if判断 ''' # 语法1: ''' if ...
- images