Tars基礎概念
這裏主要介紹APP/Server/Servant的概念。
-
App:應用名,標識一組服務的一個小集合, 開發者可以根據需要自己定義, 通常表示實現某個業務系統名稱。
- 在Tars系統中,應用名必須唯一, 例如:TestApp
- 通常應用名對應代碼中的某個名字空間
-
Server:服務名,提供服務的進程名稱。
- 一個Server必須屬於某個App, App下的Server名稱都具備唯一性
- 一個Server代表一個獨立的程序, 綁定至少一個ip, 實現一組相關的接口
- 一般命名爲:XXServer,例如LogServer,TimerServer等,它會在TARS web平臺上左邊服務樹上展示
-
Servant:服務提供者, 提供了一個多個具體的接口(interface), 提供給客戶端調用
- Servant對應服務代碼中一個類, 繼承於tars協議文件中的interface(內涵多個具體的函數), 由業務開發者實現
- 一個Servant必須屬於某個Server, Server下的Servant名稱都具備唯一性
- Servant需要一個名稱, 比如: HelloObj, 當提供給客戶端使用的, 全稱是: App.Server.Servant, 比如: Test.HelloServer.HelloObj
- 客戶端調用Server時, 只需要指定Servant的名稱即可完成遠程通信(根據部署方式會有區別)
這三個是基礎概念,在動手之前要先有個認識,更多基礎概念的內容,可以參考文檔:https://tarscloud.github.io/TarsDocs/base/tars-concept.html。
動手實現Hello World
服務端
- web端配置
這個可以先做,也可以在開發完服務程序代碼後再做,建議先做。步驟如下:
- 進入Tars管理界面,點擊運維管理
- 根據頁面內容,設定應用名、服務名稱、Obj等(這裏設定的名稱要與後續開發代碼時設定的一致,否則部署不成功),如下圖。
- 創建完成,可在服務部署頁面的右側服務樹看到。
- 開發代碼
因爲需要向安裝目錄/usr/local/tars/等目錄下寫入,所以需要root權限。步驟如下:
- web配置時已經確定了各組件的名稱:
App: TestApp, Server: HelloServer, Servant: Hello
- 使用腳本生成服務框架代碼:
/usr/local/tars/cpp/script/cmake_tars_server.sh TestApp HelloServer Hello
,生成相關的h和cpp文件,包含了最基本的服務框架和默認測試接口實現。 - 編譯:
cd build; cmake ..; make; make HelloServer-tar
,完成編譯 - 注意,自動生成的代碼中,服務只有test接口,且直接返回0。測試時不直觀。下面修改接口擴展代碼。
- 首先在Hello.tars中增加
int testHello(string sReq, out string sRsp);
,如下:
module TestApp
{
interface Hello
{
int test();
int testHello(string sReq, out string sRsp);
};
};
- 更新h文件:
/usr/local/tars/cpp/tools/tars2cpp Hello.tars
- 修改Servant的接口實現類HelloImp:
// h
virtual int testHello(const std::string &sReq, std::string &sRsp, tars::TarsCurrentPtr current);
//cpp
int HelloImp::testHello(const std::string &sReq, std::string &sRsp, tars::TarsCurrentPtr current)
{
TLOGDEBUG("HelloImp::testHellosReq:"<<sReq<<endl);
sRsp = sReq;
return 0;
}
- 重新編譯即可:
make clean; make; make HelloServer-tar
,生成HelloServer.tgz發佈包。
- 發佈服務
- 在web界面選中服務,點擊發布管理
- 選中節點,點擊發布選中節點
- 上傳剛編譯的tgz包,根據提示操作即可
- 發佈完成,可看到狀態爲Active。
客戶端開發
對剛開發的服務端進行release編譯,在build下執行
make HelloServer-release
,可生成開發客戶端時使用的頭文件。
上述是文檔裏的,筆者實際測試時報錯,缺少依賴的文件,這個還沒研究,讀者朋友如果知曉請指出。
筆者就直接在HelloServer目錄下建立了軟鏈接,鏈接到Hello.tars和Hello.h兩個文件,其實客戶端的編譯就依賴這兩個文件。
- 建立客戶端目錄HelloClient
- 編寫main.cpp,這裏使用同步請求方式,內容如下:
#include <iostream>
#include "servant/Communicator.h"
#include "Hello.h"
using namespace std;
using namespace TestApp;
using namespace tars;
int main(int argc,char ** argv)
{
Communicator comm;// 通信器
try
{
HelloPrx prx;// 代理
comm.stringToProxy("TestApp.HelloServer.HelloObj@tcp -h 10.120.129.226 -p 20001" , prx); // 指定ip:port,不必發佈到Tars框架即可測試
try
{
string sReq("hello world");
string sRsp("");
int iRet = prx->testHello(sReq, sRsp);
cout<<"iRet:"<<iRet<<" sReq:"<<sReq<<" sRsp:"<<sRsp<<endl;
}
catch(exception &ex)
{
cerr << "ex:" << ex.what() << endl;
}
catch(...)
{
cerr << "unknown exception." << endl;
}
}
catch(exception& e)
{
cerr << "exception:" << e.what() << endl;
}
catch (...)
{
cerr << "unknown exception." << endl;
}
return 0;
}
- 編寫makefile,如下:
#-----------------------------------------------------------------------
APP :=TestApp
TARGET :=TestHelloClient
CONFIG :=
STRIP_FLAG := N
INCLUDE += -I/home/yang/TestApp/HelloServer/ # 服務端生成的依賴目錄,根據自己的目錄修改
LIB +=
#-----------------------------------------------------------------------
include /usr/local/tars/cpp/makefile/makefile.tars
#-----------------------------------------------------------------------
- 編譯出可執行文件:
make
- 運行測試即可(不必在部署Tars的服務器上運行)
小結
服務端和客戶端的開發都有一定的步驟可以遵循,還提供了大量的腳本生成文件,這也減少了出錯的機率。
雖然是快速入門,但是一些基礎概念還是要理解清楚。第一遍讀一下,整個demo跑下來了再重讀一下會理解更多一點。
其實,還有許多重要的東西沒有涉及,如tars文件編寫規範、通信器的設計、客戶端代理、異步通信模式等,會在後面的學習中加深理解。
另,整個demo的代碼可以在github的example中找到,但cmake的內容要修改一下。