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&param2=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;
}

启动运行

说明

  1. 方法client_c::InitInvoker()初始化传入要调用到的服务名列表(字符串内空格分格),成功返回0;
  2. client_c::HttpGet是执行调用的操作,发起http请求,并在超时时间内等待响应,响应以第一个参数输出;
  3. 向服务端反馈结果可以通过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退出。 invk_png