一、关于Tars
Tars是腾讯2017年开源出来的微服务开发框架,内部叫TAF框架,内部使用已经有十年,很多业务在用,部署了上万台机器,成熟度高。
Tars与业界其他同类或相识的应用框架相比:
一是Tars提供了支持多语言(C++/Java)的高性能(性能可达40w/s)RPC开发框架,比如业界开源的Dubbo只支持Java,业界开源的Thrift、gRPC性能没有Tars好;
二是Tars具有针对服务进行治理的运营管理平台,比如名字路由与发现、部署/发布/扩缩容、立体化监控、日志管理、配置管理等,让系统的运行状态一切尽在掌握,而业界的Thrift、gRPC只是RPC通信框架,业务在它们之上还要做很多时期;
三是Tars经过多年在不同业务上的实践和发展,其成熟度和稳定性更好。
Tars官网:
http://tars.tencent.com/
二、概述
本教程所用环境:腾讯云CVM centos 6.5 64bits
本教程Tars服务采用C++开发,服务管理平台采用tars公共管理平台(http://tars.tencent.com/web_admin_page.jsp)
本教程将搭建一对Tars的服务端和客户端,并通过tars公共管理平台控制服务端的发布 ,系统拓扑结构如下:
本教程内容编排顺序如下:
l Tars C++开发环境搭建
l Tars运行框架搭建
l Tars公共管理平台创建环境
l 开发环境下编译服务端代码HelloServer
l Tars公共管理平台发布服务HelloServer
l 开发环境下编写客户端代码HelloClient并与服务端联调
三、Tars C++开发环境搭建
1.准备依赖环境
yum install glibc-devel
yum install gcc gcc-c++
yum install cmake
yum install flex
yum install bison
yum install ncurses-devel
yum install zlib-devel
源码方式安装mysql-5.6.26,先下载好mysql-5.6.26.tar.gz
cd /usr/local
tar zxvf mysql-5.6.26.tar.gz
cd /usr/local/mysql-5.6.26
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.26 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make
make install
ln -s /usr/local/mysql-5.6.26 /usr/local/mysql
2.下载tars源码
本教程采用的是tars1.10版本,下载地址:
https://github.com/Tencent/Tars/tree/v1.1.0
3. 安装c++开发环境
首先进入cpp/thirdparty目录,执行thirdparty.sh脚本,下载依赖的rapidjson
cd {$source_folder}/cpp/thirdparty
chmod u+x thirdparty.sh
./thirdparty.sh
注意:git拉取失败的话,可以采用手工下载
然后进入cpp/build源码目录
cd {$source_folder}/cpp/build
chmod u+x build.sh
./build.sh all
创建安装目录
cd /usr/local
mkdir tars
安装
cd {$source_folder}/cpp/build
./build.sh install或者make install
默认的安装路径为/usr/local/tars/cpp。
四、Tars运行框架搭建
1.准备mysql环境
设置mysql软链接,添加mysql用户
cd /usr/local
groupadd mysql
useradd -g mysql mysql
chown mysql:mysql mysql-5.6.26
软链接mysql-data
yum install perl
rm -rf /usr/local/mysql/data
mkdir -p /data/mysql-data
ln -s /data/mysql-data /usr/local/mysql/data
chown -R mysql:mysql /data/mysql-data /usr/local/mysql/data
cd /usr/local/mysql
cp support-files/mysql.server /etc/init.d/mysql
rm /etc/my.cnf
yum install -y perl-Module-Install.noarch
perl scripts/mysql_install_db --user=mysql
设置my.cnf
vim /usr/local/mysql/my.cnf
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
log_bin
# These are commonly set, remove the # and set as required.
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
# port = .....
socket = /tmp/mysql.sock
bind-address={$your machine ip}
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
注意:将bind-address改为部署机器的IP
启动mysql
cd /etc/init.d
chmod u+x mysql
service mysql start
chkconfig mysql on
结束mysql
service mysql stop
添加mysql的bin路径
vim /etc/profile
PATH=$PATH:/usr/local/mysql/bin
export PATH
source /etc/profile
Mysql添加用户root
service mysql start
mysqladmin -u root password 'root@appinside'
mysqladmin -u root -h ${主机名} password 'root@appinside'
注意${主机名}需要修改成自身机器的名称,可以通过查看/etc/hosts
Mysql设置root用户权限
mysql --user=root --password=root@appinside
grant all privileges on *.* to 'root'@'%' identified by 'root@appinside';
flush privileges;
添加mysql库路径
vim /etc/ld.so.conf
/usr/local/mysql/lib/
ldconfig
2.初始化Tars数据库环境
添加用户
mysql -uroot -proot@appinside
grant all on *.* to 'tars'@'%' identified by 'tars2015' with grant option;
grant all on *.* to 'tars'@'localhost' identified by 'tars2015' with grant option;
flush privileges;
sql脚本在cpp/framework/sql目录下,修改部署的ip信息
cd {$source_folder}/cpp/framework/sql
sed -i "s/192.168.2.131/${your machine ip}/g" `grep 192.168.2.131 -rl ./*`
sed -i "s/http://db.tars.com/${your machine ip}/g" `grep http://db.tars.com -rl ./*`
注意:${your machine ip}改成数据库的部署地址
执行.
chmod u+x exec-sql.sh
./exec-sql.sh
脚本执行后,会创建3个数据库,分别是db_tars、tars_stat、tars_property。
其中db_tars是框架运行依赖的核心数据库,里面包括了服务部署信息、服务模版信息、服务配置信息等等;
tars_stat是服务监控数据存储的数据库;
tars_property是服务属性监控数据存储的数据库;
3. 编译打包基础服务
Tars框架的核心基础服务:tarsAdminRegistry, tarsregistry, tarsnode, tarsconfig, tarspatch
cd ${source_folder}/cpp/build
make framework-tar
会在当前目录生成framework.tgz 包 这个包包含了 tarsAdminRegistry, tarsregistry, tarsnode, tarsconfig, tarspatch 部署相关的文件
4. 安装核心基础服务
创建基础服务的部署目录,如下:
mkdir -p /usr/local/app/tars
cd /usr/local/app
chown mysql:mysql ./tars/
将已打好的框架服务包复制到/usr/local/app/tars/,然后解压,如下:
cd ${source_folder}/cpp/build
cp framework.tgz /usr/local/app/tars/
cd /usr/local/app/tars
tar xzfv framework.tgz
修改各个服务对应conf目录下配置文件,注意将配置文件中的ip地址修改为本机ip地址,如下:
cd /usr/local/app/tars
sed -i "s/192.168.2.131/${your_machine_ip}/g" `grep 192.168.2.131 -rl ./*`
sed -i "s/http://db.tars.com/${your_machine_ip}/g" `grep http://db.tars.com -rl ./*`
sed -i "s/http://registry.tars.com/${your_machine_ip}/g" `grep http://registry.tars.com -rl ./*`
sed -i "s/http://web.tars.com/${your_machine_ip}/g" `grep http://web.tars.com -rl ./*`
注意:${your machine ip}改成数据库及主控tarsregistry的部署地址
然后在/usr/local/app/tars/目录下,执行脚本,启动tars框架服务
chmod u+x tars_install.sh
tars_install.sh
crontab -e
* * * * * /usr/local/app/tars/tarsnode/util/monitor.sh
五、Tars公共管理平台创建环境
Tars公共管理平台:http://tars.tencent.com/web_admin_page.jsp
1.新建环境及安装代理
首先新增环境:
注意:
环境名:无限制
代理1:添加Tars框架所在腾讯云主机的内网和外网IP地址
应用:保证全局唯一即可
然后在Tars框架所在主机上安装代理:
请登录IP对应的代理机器上安装代理,安装命令如下:
wget http://119.29.225.157:18862/tarsClientProxy?os=CentOs-6.5-64 。。。
打开菜单机器列表,确认节点机器状态是active
2.添加服务
点击“服务管理”,选择“服务上线“,例如:添加我们需要部署的服务信息,如下图:
“应用”指你的服务程序归在哪一个应用下,例如:“TestApp”。
“服务类型”指你的服务程序用什么语言写的,例如:c++的选择“C++”。
“服务名称”指你的服务程序的标识名字,例如:“HelloServer”。
“模版名称“ 指你的服务程序在启动时,设置的配置文件的名称,默认用”tars.cloud.default“即可。
“管理员QQ号“ 填登录系统的QQ号码即可。
“是否启用set”指服务是否需要按set进行部署,选择“否“即可。
“部署IP“ 指服务部署的机器IP。
“OBJ绑定IP“ 指OBJ要绑定的Ip地址
“OBJ名称“ 指标识服务程序的对外接口(端口)名称,通常是Servant名称(参见服务名称的第三部分)+“Obj”来命名。(注:要以Obj结尾)
“端口“ 指OBJ要绑定的端口,如果不需要绑定特别的端口,可以点击自动生成端口来生成。
“是否tars”指是否使用tars协议。服务程序可以使用自定义的协议。
“线程数”指服务程序开多少个业务处理线程,用于处理客户端传过来的请求。
“最大连接数”指最多支持多少个客户端同时连接。
“队列最大长度”指存放待处理请求的最大数量。
“队列超时时间”指消息在队列中等待处理最长的时间。
点击“提交“,成功后,菜单数下的TestApp应用将出现HelloServer名称。
在管理系统上的部署暂时先到这里,到此为止,只是使你的服务在管理系统上占了个位置,真实程序尚未发布。
六、开发环境下编译服务端代码HelloServer
参考:http://tars.tencent.com/base/help/TARS_quick_start_C++.html
1.运行创建脚本:
cd /usr/local/tars/cpp/script
create_tars_server.sh [App] [Server] [Servant]
本例中执行:
create_tars_server.sh TestApp HelloServer Hello
注意:[Servant]不要叫Obj结尾,脚本会自动加上。
命令执行后,会在当前目录的TestApp/HelloServer/ 目录下,生成下面文件:
HelloServer.h HelloServer.cpp Hello.tars HelloImp.h HelloImp.cpp makefile
这些文件,已经包含了最基本的服务框架和默认测试接口实现。
2.服务编译:
进入代码目录,先不修改任何代码,依次执行:
make cleanall
make
make tar
观察输出,是否有错误. 如一切无误,服务会生成一个打包文件HelloServer.tgz。
七、Tars公共管理平台发布服务HelloServer
在菜单树选择新建的服务HelloServer, 然后点击tab发布管理,点击“手动上传发布包”,如下图:
然后选择发布包后,进行发布,顺利发布后,服务的实时状态变成active,如下图:
八、开发环境下编写客户端代码HelloClient并与服务端联调
1.准备依赖的头文件
在开发环境上,创建/home/tarsproto/[APP]/[Server]目录。
例如:/home/tarsproto/TestApp/HelloServer
在刚才编写服务器的代码目录下,执行 make release
这时会在/home/tarsproto/TestApp/HelloServer目录下生成h、tars和mk文件。这样在有某个服务需要访问HelloServer时,就直接引用HelloServer服务make release的内容,不需要把HelloServer的tars拷贝过来(即代码目录下不需要存放HelloServer的tars文件)。
2.编写客户端代码
建立客户端代码目录,如TestHelloClient/。
编写main.cpp,创建实例并调用刚编写的接口函数进行测试。
参考链接中文档5.4小节:http://tars.tencent.com/base/help/TARS_quick_start_C++.html
3.联调
编译后,运行TestHelloClient,结果如下:
[root@VM_0_13_centos hello_client]# ./TestHelloClient
2018-07-22 00:57:30|CommunicatorEpoll::run id:12527
iRet:0
iRet:0
九、小结
从教程篇幅可以看出,tars demo的搭建步骤挺冗长的,官方github上也有提供文档,散乱还有很多坑没讲清楚。Tars框架本身不错,但开源的氛围还不成熟,除了官方提供的QQ群,网上能搜索到的资料非常有限,任重道远,希望Tars团队持续投入建设。