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的内容要修改一下。