腾讯 tars java_腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑
背景
Tars 簡介
騰訊 Tars 是騰訊內部使用的 TAF(Tencent Application Framework)的對外開源版,去掉了許多冗雜多余的部分。該框架集開發、運維、微服務、RPC 等為一體。對程序員而言,這就是一個能夠快速搭建整個微服務體系的開發框架。這個框架支持基于 C++、Node.js、PHP、Java 等語言開發,最新版本已經支持后臺開發語言新貴——Go。
系列文章
安裝任務
Tars 實際的應用場景是多機器、多節點部署的,不過從實驗驗證的角度,我做的只是在單一一臺機器上,實現 Tars 管理平臺部署,以及任務的發布。由于 Tars 版本一直在迭代,為防止文章過時誤導后來者,本文以 f3ef251013 節點為準,請讀者 follow 最新的 Tars 版本來。官方安裝文檔在這里。
然而,正如很多新的開源項目一樣,代碼很豐滿,文檔很骨感。一步一步跟著官方文檔走的話,是有可能無法一次走通的……本文跟隨文檔的安裝脈絡,進行了重新梳理,為讀者呈現一個盡量不挖坑的搭建過程。
請注意,“Tars” 這個概念,除了其基礎框架之外,還包含開發工具(如 TarsCpp、TarsJava 等等)、協議等等許多內容。不過本文主要講述 Tars 基礎框架,因此下文所提及的 “基礎框架”,如無特別說明,都專指 “Tars 基礎框架”。
本文解決的問題
前文提及,直接 follow 官方文檔,是無法完成服務部署的。因為過程中遇到很多坑,每一個坑都導致基礎框架無法搭建,或者是搭建后無法發布服務。筆者根據文檔搭建過程中遇到的坑有:
部分操作需要 sudo——文檔中有些溫馨地提醒了 sudo,但是另外一些未提醒
數據庫采用 MySQL 5.6 版,但部分說明不適用于 MariaDB
說明文字與配圖不完全一致
不同代碼處的數據庫用戶名和密碼不統一
啟動所需的數據庫表信息有缺失
環境準備
系統準備
部署實驗需要準備至少一臺 Linux 機器。這可以是一臺本地的實體機或虛擬機,也可以是一臺云主機。由于部署過程中,需要編譯 Tars 框架以及 MySQL 代碼(如果系統里沒裝 Oracle 的 MySQL 的話),強烈建議系統至少要求有 4GB 的內存!系統建議采用 CentOS 或 Ubuntu。本文采用 Ubuntu 來安裝,但 CentOS 差別不大,讀者可以參考執行。
此外,筆者不采用 root 賬戶,只有在需要 root 權限的時候才使用 sudo 操作。
像筆者這樣只有 1 核 1GB 云主機的,還需要在本地額外準備一臺 Linux 虛擬機用于編譯,再將編譯出來的目標文件轉移到云主機上。
軟件準備
使用 Ubuntu,基礎框架和 C++ 開發環境需要以下開發組件:
gcc g++(CentOS 則是 gcc-c++) flex bison make cmake perl gcc zlibc gzip git libncurses5-dev
protobuf-c-compiler protobuf-compiler libprotobuf-dev libprotobuf-c-dev libprotoc-dev
libmariadb-client-lgpl-dev mariadb-client mariadb-server
此外,還需要手動安裝的軟件或庫有:
mysql-server node.js(包括 npm)
TarsCloud/TarsFramework TarsCloud/TarsWeb TarsClous/TarsCpp
這些手動安裝的軟件會在后問說明。
MySQL 問題
官方文檔使用的 MySQL 版本是 5.6。但是這有兩個問題:
Oracle 維護的開源 MySQL 已經發展到 5.7 和 8.0 版了,Tars 是否向后兼容?
最新的 CentOS 和 Ubuntu 的軟件包中已移除 MySQL,以 MariaDB 取代,Tars 是否支持?
本人的答案是:
從網上的資料看,基礎框架支持 5.7,但需要修改 cmake 的選項,麻煩點;此外,在交流群中也有反饋 5.7 版有問題,但沒有深入了解。
支持,詳見后文操作。
筆者的方案是:
使用 mariadb 作為數據庫
使用 libmysqlclient.a 作為 TarsCpp 開發環境創建時鏈接的庫(基礎框架編譯時強制鏈接靜態庫)
使用 libmariadb.so 作為實際應用開發時用的庫
備份
安裝之前,強烈建議不熟悉 Tars 基礎框架的讀者先給自己的機器做下備份,比如打個快照或者做個鏡像之類的,這樣如果后面部署失敗了,也便于回滾系統,而不是一個一個抓蟲。
安裝支持軟件
筆者所使用的用戶名是 ubuntu,后文會有一些 shell 命令中采用了這個用戶名,請讀者留意替換成為自己的用戶名。
MySQL
安裝路徑準備
默認下載的 Tars 基礎框架需要鏈接 MySQL 的靜態庫 libmysqlclient.a,此外對庫所在的位置也寫死在了 Makefile 中。因此我們需要為 Tars 基礎框架準備環境。
首先創建供基礎框架鏈接的路徑:
$ sudo mkdir -p /usr/local/mysql
$ sudo chown ubuntu:ubuntu /usr/local/mysql
然后需要尋找一下 mariadb 的動態庫位置和頭文件位置:
$ sudo find / -name 'mariadb_com.h' 2>/dev/null
$ sudo find / -name 'libmariadbclient*' 2>/dev/null
筆者的環境中,兩者分別在 /usr/include/mariadb 和 /usr/lib/x86_64-linux-gnu 下,那么我們就創建兩個軟鏈接:
$ ln -s /usr/include/mariadb /usr/local/mysql/include
$ ln -s /usr/lib/x86_64-linux-gnu /usr/local/mysql/lib
再創建一個目錄給 MySQL 實際安裝用:
$ mkdir /home/ubuntu/mysql-5.6 # /home/ubuntu 是筆者系統的家目錄,讀者請注意替換。以下同理。
編譯安裝
直接從 GitHub 上 clone MySQL 的工程代碼后,選擇合適的版本:
$ mkdir -p ~/github.com/mysql/mysql-server
$ cd ~/github.com/mysql/mysql-server
$ git clone https://github.com/mysql/mysql-server.git ./
$ git checkout -b 5.6 origin/5.6 # 切換到 5.6 版
配置、編譯、安裝:
$ cmake . -DCMAKE_INSTALL_PREFIX=/home/ubuntu/mysql-5.6 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/ubuntu/others/boost
$ make && make install
通過之后,我們還需要將 mysql 的靜態庫復制(或者鏈接)到為 Tars 基礎框架準備的目錄下:
$ ln -s /home/ubuntu/mysql-5.6/libmysqlclient.a /usr/local/mysql/lib/
Node.js
Tars 管理平臺是使用 node.js 開發的,因此需要安裝 nvm。對不熟悉 node 的讀者,這里也簡單列下安裝方式(不建議使用 root 賬戶操作):
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
$ source ~/.bashrc
$ nvm install v8.11.3
$ npm install -g pm2 --registry=https://registry.npm.taobao.org
Tars 基礎框架
首先,要下載 Tars 的基礎框架代碼:
$ mkdir -p /homes/ubuntu/github.com/TarsCloud/TarsFramework
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework
$ git clone https://github.com/TarsCloud/TarsFramework.git ./
編譯之:
$ cd build
$ chmod +x build.sh
$ ./build.sh prepare
$ ./build.sh all
如果編譯失敗(一般是缺某些庫或組件),建議在解決問題后,清掉 TarsFramework 下的所有文件,重新 clone 后再編譯。
安裝的過程復雜一點,安裝路徑是固定的(雖然可以在工程文件中調整,為統一起見,不建議修改):
$ sudo mkdir -p /usr/local/tars
$ sudo chown ubuntu:ubuntu /usr/local/tars
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/build
$ ./build.sh install
準備 Tars 數據庫
Tars 使用用戶名 tars、密碼 tars2015 的組合,操作 MySQL 數據庫。高級玩法自然是修改 Tars 中的用戶名/密碼組合。這里為了簡單起見,干脆就直接采用默認的就好了。不過后文會介紹如何使用自定義的用戶名密碼。
筆者做驗證時的 MySQL 與 Tars 部署在同一臺機器上,IP 地址是 172.19.16.13。實際部署中,讀者請注意換成實際地址。
添加相關賬戶的命令如下:
$ mysql -u root -p
進入 mysql 命令行后:
MariaDB [(none)]> grant all privileges on *.* to tars@localhost identified by 'tars2015';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;
官方文檔說的配置備份什么的,就不用關心了。使用 Tars 的系統基本是部署在云上的,大都會用云服務商提供的自帶主備的數據庫服務(推薦騰訊云 TDSQL 哦,金融級 DB,但是價格和普通 DB 一個等級)。
接下來,我們通過執行 Tars 基礎框架的 sql 腳本來創建相應的數據庫結構:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/sql/
$ sed -i "s/192.168.2.131/172.19.16.13/g" `grep 192.168.2.131 -rl ./*`
$ sed -i "s/db.tars.com/172.19.16.13/g" `grep db.tars.com -rl ./*`
$ sed -i "s/10.120.129.226/172.19.16.13/g" `grep 10.120.129.226 -rl ./*`
$ chmod +x exec-sql.sh
$ ./exec-sql.sh
其中,172.19.16.13 是筆者的 DB 的 IP 地址,讀者實際部署時請注意修改。
這些命令也給我們一個啟發:數據庫地址允許采用域名。
TIPS-1
如果讀者不使用 tars/tars2015 的用戶名/密碼組合來操作數據庫,那么可以自行修改上述的 sql 腳本:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/sql/
$ git status .
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: db_tars.sql
modified: tarsconfig.sql
modified: tarslog.sql
modified: tarsnotify.sql
modified: tarspatch.sql
modified: tarsproperty.sql
modified: tarsqueryproperty.sql
modified: tarsquerystat.sql
modified: tarsstat.sql
可以看到被 sed 語句修改了的文件。讀者可以在這些文件中找到用戶名和密碼配置項進行修改后,再執行。
TIPS-2
MariaDB server 安裝之后默認監聽 127.0.0.1 地址,但官方文檔明確說明 DB 的 IP 地址不能使用 127.0.0.1。讀者需要修改 MariaDB 的配置文件中監聽地址的選項,否則后續 Tars 基礎框架啟動后,會遇到沒有權限訪問數據庫的錯誤。
部署 Tars 基礎框架
Tars 框架核心服務
Tars 核心基礎框架指的是 tarsAdminRegistry, tarsregistry, tarsnode, tarsconfig, tarspatch 五個。前面我們其實已經編譯好了,我們可以先把這些服務打包:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/build
$ make framework-tar
這會在 build 目錄下生成 framework.tgz 文件。接下來我們需要做一些操作:
$ sudo mkdir -p /data/log/tars
$ sudo mkdir -p /home/tarsproto
$ sudo mkdir -p /usr/local/app/tars
$ sudo chown -R ubuntu:ubuntu /usr/local/app /data/log/tars /home/tarsproto
$ mv /homes/ubuntu/github.com/TarsCloud/TarsFramework/build/framework.tgz /usr/local/app/tars
$ cd /usr/local/app/tars
$ tar zxvf framework.tgz
這會在 /usr/local/app/tars/ 下面生成前述幾個核心基礎框架組件對應的文件夾。此外,還有 tars_install.sh 和 tarsnode_install.sh 兩個腳本。不過我們得先配置一下——
五個核心基礎框架組件的目錄下均有 conf 文件夾,可以看到各個組件的配置文件,比如 tars.tarsregistry.config.conf。對操作已經很熟悉了的讀者可以手動修改這些配置。不過也可以簡單點地進行以下修改:
$ cd /usr/local/app/tars
$ sed -i "s/192.168.2.131/172.19.16.13/g" `grep 192.168.2.131 -rl ./*`
$ sed -i "s/db.tars.com/172.19.16.13/g" `grep db.tars.com -rl ./*`
$ sed -i "s/registry.tars.com/172.19.16.13/g" `grep registry.tars.com -rl ./*`
$ sed -i "s/web.tars.com/172.19.16.13/g" `grep web.tars.com -rl ./*`
四個 sed 命令修改的地址,對應的是:
本機地址,不能寫 127.0.0.1;
前述數據庫的地址;
tarsregistry 的 部署地址,可以不是本機;
web.tars.com 是 rsync 服務和 web 管理平臺的部署地址。
修改了 IP 地址之后,還需要檢查 tars 訪問數據庫的用戶名和密碼。這里我們最好是手動 vim 去改,因為幾個文件的書寫格式不完全一致:
$ cd /usr/local/app/tars
$ grep dbpass -rl ./*
檢查搜索出來的 conf 文件中的 dbuser 和 dbpass 字段。
最后就是啟動核心框架服務和 rsync(好艱難):
$ cd /usr/local/app/tars
$ chmod +x tars_install.sh
$ ./tars_install.sh
$ sudo ./tarspatch/util/init.sh
$ chmod +x tarsnode_install.sh
$ ./tarsnode_install.sh
然后我們可以在 croncab 中配置核心基礎框架的監控項:
* * * * * /usr/local/app/tars/tarsnode/util/monitor.sh
這樣一來,五個框架核心服務就啟動起來了。
Tars web 管理平臺
Tars web 管理系統在另一個 Git repo 中:
$ mkdir -p /homes/ubuntu/github.com/TarsCloud/TarsWeb
$ cd /homes/ubuntu/github.com/TarsCloud/TarsWeb
$ git clone https://github.com/TarsCloud/TarsWeb.git ./
$ sed -i 's/db.tars.com/172.19.16.13/g' config/webConf.js
$ sed -i 's/registry.tars.com/172.19.16.13/g' config/tars.conf
其中 172.19.16.13 是筆者機器的 IP,讀者請注意
Tars web 是用 node.js 編寫的,不需要編譯。管理平臺默認監聽在 3000 端口上,可在 config/webConf.js 中修改 port 參數的值。
配置了端口之后,就可以啟動 Tars web 管理平臺了:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsWeb
$ npm install --registry=https://registry.npm.taobao.org
$ npm run prd
可以查看 TarsWeb 目錄下的 package.json 文件可以看到更多的信息——畢竟并不是每個人都懂得 node.js 開發。
Tars 框架基礎服務
檢查核心服務狀態
Tars web 管理平臺啟動后,如果按照默認設置的話,平臺會在 3000 端口建立 http 服務。使用瀏覽器訪問,可以看到如下界面:
這三個組件,就是前文所述的 “tars 框架核心服務” ,如果按照前述邏輯部署后,在 web 頁面就可以看到的。可以依次點開這三個服務,確保服務的狀態都如下圖所示:
如果服務的狀態不對,那么可能是前面哪一步操作不恰當。可以查找 log 來定位(log 文件的路徑參見后文)。
部署其他基礎服務
剩下的幾個基礎框架服務就需要進行手動部署。但部署的方法其實還是蠻簡單的,這里挑一個出來細講,其他的類似。
首先,我們需要把其他的基礎框架打包出來:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/build
$ make tarsstat-tar
$ make tarsnotify-tar
$ make tarsproperty-tar
$ make tarslog-tar
$ make tarsquerystat-tar
$ make tarsqueryproperty-tar
這樣會在 /homes/ubuntu/github.com/TarsCloud/TarsFramework/build 目錄下分別生成上述六個組件的 tgz 文件。
接下來我們以 tarsstat 為例說明部署方法:
創建服務
點擊 web 主頁的 “運維管理” 選項卡,進入服務界面:
各參數按照如下填寫:
應用:填 “tars”
服務名稱:填 “tarsstat”
服務類型:在下拉菜單中選 “tars_cpp”
模板:在下拉菜單中選 “tars.tarsstat”
節點:選擇本機的出口地址,像筆者的情況,就是 172.19.16.13
SET:現階段不用填,這是 tars 的進階功能
OBJ:填 “StatObj”
OBJ 綁定地址 和 端口:可以手動調整,也可以點 “獲取端口” 按鈕自動分配
端口類型:TCP
協議:TARS
其他默認即可。填好后,點 “確定” 即可部署。注意,此時的 “部署”,只是在 tars 內注冊了一個服務(占了個坑),但這個服務還沒有上線提供可用的功能。
發布服務
部署了服務后,需要刷新頁面,這樣就可以看到左邊 tars 的服務列表多了一項:“tarsstat”
現在,我們需要真正地發布這個服務了。
點擊 “tarsstat” 選項卡,可以看到上面有六個功能選項。點擊 “發布管理”,視圖如下:
勾選節點,然后點擊 “發布選中節點”,界面如下:
這個時候點 “發布版本” 的下拉菜單,是沒有內容的。我們需要點 “上傳發布包”,在新打開的窗口,選擇上一步 “創建服務” 時打包的 tarsstat.tgz 文件上傳即可。上傳成功后,我們再在 “發布版本” 下拉菜單中選擇剛剛上傳的包,然后點 “發布”。稍等一會后,我們只要看到 tarsstat 的狀態變成如下,就是發布成功了:
其他各個服務的特殊參數
除了不需要額外配置數據庫之外,接下來的五個服務的配置發布流程基本一致。但也有以下一些不同,讀者在發布剩余服務的時候請注意修改:
各服務的名稱不同,請相應地修改;
各服務的服務類型均為 “tars_cpp”,但是模板不同——每一個服務均有其對應的專用模板,比如 tarsconfig 對應 tars.tarsconfig 模板;
tarsquerystat 和 tarsqueryproperty 的 “協議” 應選 “非TARS”,其他服務為 “TARS”;
各服務對應的 Obj 名稱如下:
tarsnotify: NotifyObj
tarsproperty: PropertyObj
tarslog: LogObj
tarsquerystat: NoTarsObj(非 TARS 協議)
tarsqueryproperty: NoTarsObj(非 TARS 協議)
此外,以下這一步是 tarsstat 特有的步驟:在發布服務之前,需要進入數據庫進行以下操作,防止 tarsstat 啟動失敗:
MariaDB [(none)]> use db_tars;
MariaDB [db_tars]> CREATE TABLE `t_server_notifys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `application` varchar(128) DEFAULT '', `server_name` varchar(128) DEFAULT NULL, `container_name` varchar(128) DEFAULT '' , `node_name` varchar(128) NOT NULL DEFAULT '', `set_name` varchar(16) DEFAULT NULL, `set_area` varchar(16) DEFAULT NULL, `set_group` varchar(16) DEFAULT NULL, `server_id` varchar(100) DEFAULT NULL, `thread_id` varchar(20) DEFAULT NULL, `command` varchar(50) DEFAULT NULL, `result` text, `notifytime` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_name` (`server_name`), KEY `servernoticetime_i_1` (`notifytime`), KEY `indx_1_server_id` (`server_id`), KEY `query_index` (`application`,`server_name`,`node_name`,`set_name`,`set_area`,`set_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MariaDB [db_tars]> exit;
所有服務均發布完成并狀態正確之后,Tars 基礎框架就部署完成啦,恭喜你!
日志查詢
如果部署 Tars 框架服務過程中遇到什么錯誤,可以查閱的 log 在以下路徑:
/usr/local/app/TarsWeb/log
/usr/local/app/tars/app_log/tars
關于自動部署
Tars 其實還提供了一套比較簡易的快速部署腳本。那個腳本我沒有嘗試過,但據說也是有一些坑……這里我推薦 maq128 同學 的文章:tars小白安裝必成手冊,分別講述了快速部署、手工部署、docker 部署的內容。另外,如果有問題,讀者也可以加入 Tars 官方交流群,不保證所有問題都能夠精準回答,但是群里不少大神還是給了我不少啟發。群號參見 Tars 官方文檔。
下一步研究
按照官方的建議,Tars 的所有基礎服務都需要至少進行災備部署,但是部署方式如何實現,并沒有明確的說明或者建議。這是筆者后續準備實驗的。
參考資料
總結
以上是生活随笔為你收集整理的腾讯 tars java_腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java枚举可以int值不_java –
- 下一篇: 电脑不开机怎么启动u盘 如何使用U盘启动