一、关于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.sockbind-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 = 2Msql_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团队持续投入建设。

动手实践Tars服务的搭建相关推荐

  1. 中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名

    2019.11.9 的中国.NET开发者峰会将在上海举办,到目前为止,大会的主题基本确定,这两天就会和大家会面,很多社区的同学基于对社区的信任在我们议题没有确定的情况下已经购票超过了300张,而且分享 ...

  2. 重磅干货!AI智能服务体系搭建与实践培训班11月24-25日上海开课

    如今,单一的智能化产品已经无法满足的市场需求,多元化.全景式的智能服务才是AI未来发展的趋势. 但企业在引入智能服务时 该如何选择适合企业自身需求的智能产品? 企业的AI智能服务体系该如何搭建? 搭建 ...

  3. 微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.2 实现XA 模式

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 分布式事务 文章目录 微服务 ...

  4. guice google_与Google Guice的动手实践

    guice google by Sankalp Bhatia 通过Sankalp Bhatia 与Google Guice的动手实践 (A hands-on session with Google G ...

  5. 产品经理也能动手实践的AI(一)- FastAI介绍

    https://www.toutiao.com/a6671600787744883213/ 如果你还不了解AI的准确含义,请查看我之前的文章: 人人都能搞懂的AI(一) 人人都能搞懂的AI(二)- A ...

  6. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

    原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...

  7. 【原创 HadoopSpark 动手实践 6】Spark 编程实例与案例演示

     [原创 Hadoop&Spark 动手实践 6]Spark 编程实例与案例演示 Spark 编程实例和简易电影分析系统的编写 目标: 1. 掌握理论:了解Spark编程的理论基础 2. 搭建 ...

  8. 《JavaScript高级程序设计》红宝书第二遍阅读(动手实践)

    <JavaScript高级程序设计>红宝书第二遍阅读(动手实践) 第1章--什么是JavaScript 第2章--HTML中的JavaScript 第3章--语言基础 第4章--变量.作用 ...

  9. 【LeArm】动手实践机械臂(一)

    导语:由于工业机器人不开源,无法二次开发,不能让它按照我们想要的轨迹运动,于是索性直接买个小的开源机械臂,这样既能够对底层代码进行了解,也能动手实践一下,在此记录LeArm的学习历程. LeArm智能 ...

最新文章

  1. 2020,让我更持久了...
  2. linux c 信号量简介
  3. 人生苦短,我用Python
  4. GridSearchCV.grid_scores_和mean_validation_score报错
  5. iis php mysql wiki_Windows下安装MediaWiki (iis+php+mysql+mediawiki)
  6. 又一国产开源微内核操作系统上线!源代码已开放下载
  7. 【渝粤题库】陕西师范大学209041 金融工程学 作业(专升本)
  8. Nitrozme Animation Studio Packages Mac(AE插件拓展包)
  9. jquery extend中
  10. six.move 的作用
  11. 计算机高等数学试题及答案,北大计算机系考研_历年高等数学真题附答案
  12. ddr3ddr4 lpddr4速率_LPDDR3一定弱?实测对比单双通道DDR4
  13. 单例模式的七种写法,你都知道吗?
  14. 强化学习第7章——基于策略的强化学习
  15. root后怎么删除授权管理,Root授权管理
  16. Taro,小程序scroll-view 填满剩下的高度空间,关闭页面回跳(部分ios机型 滚动不到底部)
  17. TortoiseSVN教程级别指南
  18. SEO外链建设的操作方法
  19. B站 MySQL学习随手记 全是满满的干货!
  20. 知网普刊CNKI计算机类期刊,录用98%以上,最快1个月可录用

热门文章

  1. 英文情书是这样写成的[爆笑]
  2. java 循环读取map_java中map的循环遍历和map的获取值的办法
  3. 基于JAVA大学生第二课堂计算机毕业设计源码+系统+lw文档+部署
  4. python简单版斗兽棋
  5. 【其他】多维分析预汇总应该怎样做才管用?
  6. Parameter 'userid' not found. Available parameters are [arg1, arg0, param1, param2]的解决办法
  7. 新手写python脚本提取最长转录本ID以及最长转录本序列(此代码已过时,最新代码见主页)
  8. C#如何简单实现上升沿功能
  9. 起卦帮同学看工作,应了。
  10. Laradock 的安装与使用