文章目录

  • 1. 环境搭建
  • 2. 服务命名
  • 3. Tars管理系统
  • 4. 服务部署
  • 5. 服务开发
    • 5.1. 创建服务
      • 5.1.1. 运行tars脚本
      • 5.1.2. tars接口文件
      • 5.1.3. HelloImp是Servant的接口实现类
      • 5.1.4. HelloServer是服务的实现类
    • 5.2. 服务编译
    • 5.3. 扩展功能
    • 5.4. 客户端同步/异步调用服务
  • 6. 服务发布
  • 参考文件

1. 环境搭建

  • C++环境搭建参考tars_install.md

2. 服务命名

  • APP:应用名,标识一组服务的一个集合

    • 须唯一
    • 如:TestApp
  • Server:

    • 提供服务的进程名
    • 命名为:XXServer,例如HelloServer;
  • Servant:

    • 服务者,提供具体服务的接口或实例
    • HelloImp

  • 一个Server可含多个Servant
  • 系统用App + Server + Servant来定义服务在系统中的路由名称,
  • 称路由Obj
  • TestApp.HelloServer.HelloObj

3. Tars管理系统

  • 用户登录后,进入Tars系统

  • 管理系统的菜单树下,有

  • 业务管理:

    • 已部署的服务,
    • 服务管理
    • 发布管理
    • 服务配置
    • 服务监控
    • 特性监控
  • 运维管理:

    • 包括服务部署、扩容、模版管理

4. 服务部署

  • 也可服务开发后,不过建议先做

  • 如下:

  • “TestApp”。

  • “HelloServer”。

  • c++选“tars_cpp”

  • 服务程序启动时,配置文件名称

    • 默认”tars.default
  • “节点“ 指服务部署的机器IP

  • “Set分组“ 指设置服务的Set分组信息,

    • 3部分:Set名、Set地区、Set组名。
  • “OBJ名称“ 指Servant名称。

  • “OBJ绑定IP“ 指服务绑定的机器IP,一般与节点一样。

  • “端口“ 指OBJ要绑定的端口。

  • “端口类型“ TCP还是UDP。

  • “协议“ 指应用层使用的通信协议,

    • Tars框架默认使用tars协议。
  • “线程数“

    • 业务处理线程的数目。
  • “最大连接数“ 指支持的最大连接数。

  • “队列最大长度“ 请求接收队列大小。

  • “队列超时时间“ 指请求接收队列的超时时间。

  • 点击“提交“,成功后,

  • 菜单数下的TestApp应用将出现HelloServer,

  • 右侧看到你新增的服务程序信息,如下图:

  • 到此只是使你的服务在管理系统上占了个位置,真实程序尚未发布。

5. 服务开发

5.1. 创建服务

5.1.1. 运行tars脚本

/usr/local/tars/cpp/script/create_tars_server.sh
[App] [Server] [Servant]
  • /usr/local/tars/cpp/script/create_tars_server.sh TestApp HelloServer Hello

  • 执行后,当前目录的TestApp/HelloServer/,生成:

HelloServer.h
HelloServer.cpp
Hello.tars
HelloImp.h
HelloImp.cpp
makefile
  • 这些文件包含最基本的服务框架和默认测试接口实现。

5.1.2. tars接口文件

  • 定义tars接口文件的语法和使用,见tars_tup.md。

Hello.tars:


module TestApp
{interface Hello
{int test();
};}; 
  • /usr/local/tars/cpp/tools/tars2cpp hello.tars会生成hello.h,含客户端和服务端代码。

5.1.3. HelloImp是Servant的接口实现类

实现服务定义的tars件中的接口

HelloImp.h


#ifndef _HelloImp_H_
#define _HelloImp_H_#include "servant/Application.h"
#include "Hello.h"/*** HelloImp继承hello.h中定义的Hello对象**/
class HelloImp : public TestApp::Hello
{public:/****/virtual ~HelloImp() {}/*** 初始化,Hello的虚拟函数,HelloImp初始化时调用*/virtual void initialize();/*** 析构,Hello的虚拟函数,服务析构HelloImp退出时调用*/virtual void destroy();/*** 实现tars文件中定义的test接口*/virtual int test(tars::TarsCurrentPtr current) { return 0;};};
/
#endif

HelloImp.cpp:


#include "HelloImp.h"
#include "servant/Application.h"using namespace std;//
void HelloImp::initialize()
{//initialize servant here://...
}//
void HelloImp::destroy()
{//destroy servant here://...
}

5.1.4. HelloServer是服务的实现类

HelloServer.h:

#ifndef _HelloServer_H_
#define _HelloServer_H_#include <iostream>
#include "servant/Application.h"using namespace tars;/*** HelloServer继承框架的Application类**/
class HelloServer : public Application
{public:/*****/virtual ~HelloServer() {};/*** 服务的初始化接口**/virtual void initialize();/*** 服务退出时的清理接口**/virtual void destroyApp();
};extern HelloServer g_app;
#endif

HelloServer.cpp

#include "HelloServer.h"
#include "HelloImp.h"using namespace std;HelloServer g_app;/
void
HelloServer::initialize()
{//initialize application here://添加Servant接口实现类HelloImp与路由Obj绑定关系addServant<HelloImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".HelloObj");
}
/
void
HelloServer::destroyApp()
{//destroy application here://...
}
/
int
main(int argc, char* argv[])
{try{g_app.main(argc, argv);g_app.waitForShutdown();}catch (std::exception& e){cerr << "std::exception:" << e.what() << std::endl;}catch (...){cerr << "unknown exception." << std::endl;}return -1;
}
/

5.2. 服务编译

进入代码目录

make cleanall
make
make tar

5.3. 扩展功能

  • 修改由create_tars_server.sh生成的tars文件,
  • 以下3个接口方法中,
  • test是默认生成的,
  • testHello是新增加的

module TestApp
{interface Hello
{int test();int testHello(string sReq, out string sRsp);
};}; 

用/usr/local/tars/cpp/tools/tars2cpp hello.tars,重新生成hello.h。

修改HelloImp.h/HelloImp.cpp,实现新的接口代码。

其中HelloImp.h中继承Hello类的testHello方法:

virtual int testHello(const std::string &sReq, std::string &sRsp, tars::TarsCurrentPtr current);

HelloImp.cpp实现testHello方法:

int HelloImp::testHello(const std::string &sReq, std::string &sRsp, tars::TarsCurrentPtr current)
{TLOGDEBUG("HelloImp::testHellosReq:"<<sReq<<endl);sRsp = sReq;return 0;
}

重新make cleanall;make;make tar,会重新生成HelloServer.tgz发布包。

5.4. 客户端同步/异步调用服务

  • 开发环境上,创建/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文件)。

  • 建立客户端代码目录,TestHelloClient/

  • 编写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);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;
}

异步方式

#include <iostream>
#include "servant/Communicator.h"
#include "Hello.h"using namespace std;
using namespace TestApp;
using namespace tars;class HelloCallBack : public HelloPrxCallback
{public:HelloCallBack(){}virtual ~HelloCallBack(){}virtual void callback_testHello(tars::Int32 ret,  const std::string& sRsp){cout<<"callback_testHello ret:"<< ret << "|sRsp:" << sRsp <<endl; }virtual void callback_testHello_exception(tars::Int32 ret){cout<<"callback_testHello_exception ret:"<< ret <<endl;}
};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);try{string sReq("hello world");HelloPrxCallbackPtr cb = new HelloCallBack();prx->async_testHello(cb, sReq);cout<<" sReq:"<<sReq<<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;}getchar();return 0;
}
  • 编写makefile,
  • 里面包含刚才通过make release生成的/home/tarsproto/APP/Server目录下的mk文件
  • 如下:
#-----------------------------------------------------------------------
APP         :=TestApp
TARGET      :=TestHelloClient
CONFIG      :=
STRIP_FLAG  := NINCLUDE     +=
LIB         +=
#-----------------------------------------------------------------------
include /home/tarsproto/TestApp/HelloServer/HelloServer.mk
include /usr/local/tars/cpp/makefile/makefile.tars
#-----------------------------------------------------------------------
  • make出目标文件,上传到能访问服务器的环境中运行测试即可

6. 服务发布

  • 在管理系统的菜单树下,找到你部署的服务,点击进入服务页面。

  • 选择“发布管理”,选中要发布的节点,点击“发布选中节点”,点击“上传发布包”,选择已经编译好的发布包,如下

  • 上传好发布包后,“选择发布版本”下拉框就会出现你上传的服务程序,选择最上面的一个(最新上传的)。如下:

  • 点击“发布”,服务开始发布,发布成功后,出现下面的界面,如下图:

若失败的话,可能是命名问题,上传问题,以及其他环境问题。

参考文件

  • https://github.com/gamegrd/taf

tar的c++版本入门教程相关推荐

  1. D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js

    D3.js的v5版本入门教程(第一章) 1.需要的一些工具 这个其实随便!最简单的就是建一个.txt文件就可以敲起代码来!作者本人用的是myeclipse(主要需要安装tomcat),因为写的是前端, ...

  2. D3.js的v5版本入门教程(第六章)——做一个简单的图表

    D3.js的v5版本入门教程(第六章) 从这一章开始,进入正式的d3,js绘图阶段,有了前面几章基本知识的积累,这样看接下来的绘图代码才不会觉得比较辛苦 做一个简单的图表 为了做一个简单的图表,我们还 ...

  3. D3.js的v5版本入门教程(第十四章)—— 力导向图

    D3.js的v5版本入门教程(第十四章) 这一章我们来绘制一个力导向图,什么叫力导向图,通俗一点将就是有节点和线组成,当鼠标拖拽一个节点时,其他节点都会受到影响(力导向图有多种类型,本章绘制的效果就是 ...

  4. D3.js的v5版本入门教程(第十三章)—— 饼状图

    D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素--扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这 ...

  5. D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素

    D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有 ...

  6. MindManager2020版本入门教程详解

    MindManager是一款创造.管理和交流思想的思维导图软件,其直观清晰的可视化界面和强大的功能可以快速捕捉.组织和共享思维.想法.资源和项目进程等等.MindManager新手入门教程专为新手用户 ...

  7. micropython安装ros_ROS2与STM32入门教程-microROS的linux版本

    ROS2与STM32入门教程-micro_ros的linux版本 说明: 介绍如何安装使用micro_ros 步骤: 安装ros2版本foxy,查看教程 加载ros2环境 source ~/ros2_ ...

  8. composer 依赖包版本冲突_composer快速入门教程

    php中文网最新课程 每日17点准时技术干货分享 Composer 是 PHP 的一个依赖管理工具.我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就 ...

  9. 怎么查看电脑有没有python_python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学...

    本文由简码编程原创,保留所有版权,转载请注明出处. 本python人工智能爬虫系列教程基于Python3.0版本, 将python结合windows桌面开发工具aardio一起做可视化的开发, 用py ...

最新文章

  1. css文字向右对齐_web前端入门到实战:css常用样式对文本的处理演练
  2. linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝
  3. Hbase(1)——基础语句(1)
  4. 包头昆区多大面积_包头地铁“胎死腹中”,何时“卷土重来”?
  5. WinForm picturebox控件绑定BitMAP
  6. Jetty的JNDI数据源
  7. QTCreator快捷键
  8. Android Activity launchMode研究
  9. cad快看_浩辰CAD看图王教你免费打开超大CAD图纸!
  10. python 二项分布编程_Python模拟伯努利试验和二项分布代码实例
  11. 计算机读研的收获和遗憾
  12. 剖析Apple Pay 它与支付宝究竟暧昧什么?
  13. win10误删IE浏览器文件如何恢复?
  14. 浅谈农批市场的信息化:发展现状、信息化动因和契入方向
  15. STM32CUBEMX生成KEIL工程后使用AC6(V6)编译加快速度
  16. 在线要饭源码 支付宝个人免签约支付
  17. 只做了delete操作,为啥 ORACLE-01466表定义已更改
  18. 梦幻西游网页版服务器互通吗,梦幻西游网页版:关于合服的那些事儿~最全信息都在这了...
  19. go语言map底层数据结构
  20. PKUSC 模拟赛 day1 下午总结

热门文章

  1. 游戏出海,全球化运营
  2. 聊一聊我知道的第七届高分子与复合材料会议(PCM2020)
  3. 汉王科技持续走下坡路,发展寻求突破
  4. Leetcode典型题解答和分析、归纳和汇总——T160(相交链表)
  5. @Conditional、@ConditionalOnClass 等条件注解的作用
  6. SOA论剑三亚江湖会
  7. 流程定义和部署管理——流程定义列表
  8. 服务器读取账号密码,WIN服务器得明文密码神器 mimikatz、WCE
  9. gif在线如何制作?分享一款手机电脑均可使用的gif制作工具
  10. excel中 时分秒格式相加