来自零点智能社区

一、前言

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必修课(一):整体架构理解的更多相关文章

  1. 《深入理解bootstrap》读书笔记:第二章 整体架构

    一.  整体架构   1. CSS-12栅格系统 把网页宽度均分为12等分(保留15位精度)--这是bootstrap的核心功能. 2.基础布局组件 包括排版.按钮.表格.布局.表单等等. 3.jQu ...

  2. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. Underscore 整体架构浅析

    前言 终于,楼主的「Underscore 源码解读系列」underscore-analysis 即将进入尾声,关注下 timeline 会发现楼主最近加快了解读速度.十一月,多事之秋,最近好多事情搞的 ...

  4. jQuery整体架构源码解析(转载)

    jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...

  5. MINIX3 内核整体架构回顾及内核定 性分析

    MINIX3  内核整体架构回顾及内核定 性分析 12.1 注意事项 由于本文档不对 I/O 文件系统做出分析,所以在此不对 MINIX3 整体做出一个分 析,本章主要是针对内核进程分析.并且这里的模 ...

  6. LevelDB系列之整体架构

    LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口.为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度.从静态角度,可以假想整个系 ...

  7. Bootstrap学习笔记之整体架构

    之前有粗略地看过一下Bootstrap的内容,不过那只是走马观花式地看下是怎么用的,以及里面有什么控件,所以就没想着记笔记.现在由于要给部门做分享,所以不得不深入地去学习下,不然仅是简单地说下怎么用, ...

  8. jQuery整体架构源码解析

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. ODI 系列学习--整体架构概念

    ODI 系列学习--整体架构概念 ODI整体架构没有Oracle Database复杂,因为它属于程序功能的使用,更多是程序开发和配置的工作,当然ODI的优化涉及到很多数据库优化的工作,从整体架构入手 ...

随机推荐

  1. 克隆linux系统网卡问题

    如果没有 ifcfg-eth0  手动创建 删掉uuid uwaddr 保存退出 然后清空 >/etc/udev/rules.d/70-persistent-net.rules 然后重启 reb ...

  2. 时间序列(六): 炙手可热的RNN: LSTM

    目录 炙手可热的LSTM 引言 RNN的问题 恐怖的指数函数 梯度消失* 解决方案 LSTM 设计初衷 LSTM原理 门限控制* LSTM 的 BPTT 参考文献: 炙手可热的LSTM 引言 上一讲说 ...

  3. JDK8的ConcurrentHashMap也会造成CPU 100%

    转载:不止 JDK7 的 HashMap ,JDK8 的 ConcurrentHashMap 也会造成 CPU 100%?原因与解决~ 现象 大家可能都听过JDK7中的HashMap在多线程环境下可能 ...

  4. python dpkt解析ssl流

    用法:python extract_tls_flow.py -vr  white_pcap/11/2018-01-10_13-05-09_2.pcap  -o pcap_ssl_flow.txt  & ...

  5. Qt_Pro详解

    在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从“#”开始,到这一行结束. 2.模板变量告诉qmake为这个应用程 ...

  6. Java Code Examples for org.codehaus.jackson.map.DeserializationConfig 配置

    The following code examples are extracted from open source projects. You can click  to vote up the e ...

  7. List.contains()与自动拆箱

    最近项目引入sonarQube这种代码静态检查的东东,以前没有人力和精力review,现在只要扫描一下项目,就发现很多有趣的地方. 有这么一段代码: List<Long> list = L ...

  8. Regex Password Validation

    You need to write regex that will validate a password to make sure it meets the follwing criteria: A ...

  9. Uboot代码分析

    (1)确定链接脚本文件:uboot根目录下Makefile中的LDSCRIPT宏值,就是指定链接脚本(如:arch/arm/cpu/u-boot.lds)路径用的.(2)从脚本文件找入口: 在链接脚本 ...

  10. 【资料收集】QT学习资料

    几个专栏 Qt学习之路(3):Hello, world!(续) - 豆子空间 - 51CTO技术博客 http://devbean.blog.51cto.com/448512/194137 Qt 学习 ...