Tars快速入門——Hello World

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


服務端
  1. web端配置

這個可以先做,也可以在開發完服務程序代碼後再做,建議先做。步驟如下:

  • 進入Tars管理界面,點擊運維管理
  • 根據頁面內容,設定應用名、服務名稱、Obj等(這裏設定的名稱要與後續開發代碼時設定的一致,否則部署不成功),如下圖。

在這裏插入圖片描述

  • 創建完成,可在服務部署頁面的右側服務樹看到。
  1. 開發代碼

因爲需要向安裝目錄/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發佈包。
  1. 發佈服務
  • 在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的內容要修改一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章