http服务消费者(c++)
概述
此示例演示如何使用cpp_sdk编写http服务消费(invoker)程序,cpp_sdk提供简单易用的接口给客户调用,与服务端通信/响应通告等细节sdk内部都完现了,用户无需花时间在这些细节上,而是专注于自身业务逻辑。
示例源文件: cpp_sdk/sample_http_invk.cpp
编译命令:g++ -Wall -g -std=c++11 sample_http_invk.cpp -o sample_http_invk ../common/libhocomm.so libsdk_cppcloud.so 或者
make sample_tcp_invk
示例准备:先运行服务端cppcloud_serv,记下ip地址和端口。
示例代码
如下给出的是关键语句伪代码。
#include "client_c.hpp"
#include <csignal>
#include <iostream>
static const string appName = "TestHttpInvk"; // 本应用名
static const string invkName = "httpApp1"; // 调用的目标服务名
int main( int argc, char* argv[] )
{
string serv=argv[1];//命令行参数:serv_ip:serv_port
// sdk初始化
int ret = client_c::Init(appName, serv);
// 服务消费者实始化:去后端'服务发现'
if ( (ret = client_c::InitInvoker(invkName)) )
{
printf("InitInvoker fail %d\n", ret);
return -3;
}
client_c::SetRefreshTimeOut(10); // 刷新提供端的时间间隔
ret = client_c::Run(true); // sdk在后台线程运行
printf("Run return %d\n", ret);
// 调用服务提供者的接口
string resp;
string req = "param1=value1¶m2=v2";
// 调用(消费)一次服务,结果用resp返回
ret = client_c::HttpGet(resp, "", req, invkName);
printf("Call [%s] response: %s\n", invkName.c_str(), resp.c_str());
string line;
while (getline(std::cin, line)) // 测试运行时改变配置,app能实时得知变化
{
if (line == "q")
{
kill(0, SIGTERM);
break;
}
req = string("param1=") + line;
ret = client_c::HttpGet(resp, "", req, invkName);
printf("http Resp-%d: %s\n", ret, resp.c_str());
}
client_c::Destroy();
return 0;
}
启动运行
说明
- 方法
client_c::InitInvoker()
初始化传入要调用到的服务名列表(字符串内空格分格),成功返回0;client_c::HttpGet
是执行调用的操作,发起http请求,并在超时时间内等待响应,响应以第一个参数输出;- 向服务端反馈结果可以通过client_c::AddInvokerStat(),比较简单,本例不给出了。
启动运行
-
docker方式:
docker exec -it <container> sample_http_invk [servip:port]
必须已启动了CppCloudo容器,是容器id或name,最后的[servip:port]不写默认连接localhost:4800; -
手动方式:
前提是c++ sdk库(libsdk_cppcloud.so libhocomm.so)已正常编译过了
cd cpp_sdk;
make sample_http_invk
;
./sample_http_invk localhost:4800
演示结果
程序执行, 并输入了hello_world
, 请求用的是GET方式, 返q退出。