Sogou C++ Workflow 安装与使用例子

时间:2024-04-15 17:17:10

简介:

搜狗公司C++服务器引擎,支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理超百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数C++后端开发需求。

 

使用:

 

第一步:

确保机器上有c++环境,安装的有gcc,cmake,CLion(非必须,但是有了会很舒服)。

 

第二步:

下载源码安装,安装位置是 /usr/local/include/workflow 目录下

git clone https://github.com/sogou/workflow.git

cd workflow

mkdir  build

cd build

cmake ..

make && make install

 

然后一个简单使用redis的例子,使用CLion创建一个c++14的工程

 

怎么安装 redis

sudo apt install  redis-server

 

创建这样的目录

 

 

cmake 这么写

cmake_minimum_required(VERSION 3.17)
project(study)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_COMPILER g++)
set(
        SOURCES
        src/redis_cli.cpp
        src/main.cpp
)

add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME}
        PUBLIC  ${PROJECT_SOURCE_DIR}/include)
#target_link_libraries(${PROJECT_NAME} pthread )
target_link_libraries(study workflow) #关键,如果不加会报错,编译的时候找不到函数

下面可以愉快的写代码了

redis_cli.h

//
// Created by ct on 2020/11/10.
//

#ifndef STUDY_REDIS_CLI_H
#define STUDY_REDIS_CLI_H

#include <netdb.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>

#include "workflow/RedisMessage.h"
#include <workflow/WFTaskFactory.h>
#include <workflow/WFFacilities.h>

namespace redis_cli {

    const static int RETRY_MAX=2;

    // 配合例子数据结构体
    struct tutorial_task_data {
        std::string url;
        std::string key;
    };
    // 处理请求结果
    void redis_callback(WFRedisTask *task);

    static WFFacilities::WaitGroup wait_group(1);

    void sig_handler(int signo);

    int run();
}


#endif //STUDY_REDIS_CLI_H

 

redis_cli.cpp

 

//
// Created by ct on 2020/11/10.
//

#include <iostream>
#include "redis_cli.h"

void redis_cli::redis_callback(WFRedisTask *task) {
    protocol::RedisRequest *req = task->get_req();
    protocol::RedisResponse *resp = task->get_resp();
    int state = task->get_state();
    int error = task->get_error();
    protocol::RedisValue val;
    switch (state) {
        case WFT_STATE_SYS_ERROR:
            fprintf(stderr, "system error: %s\n", strerror(error));
            break;
        case WFT_STATE_DNS_ERROR:
            fprintf(stderr, "DNS error: %s\n", gai_strerror(error));
            break;
        case WFT_STATE_SSL_ERROR:
            fprintf(stderr, "SSL error: %d\n", error);
            break;
        case WFT_STATE_TASK_ERROR:
            fprintf(stderr, "Task error: %d\n", error);
            break;
        case WFT_STATE_SUCCESS:
            resp->get_result(val);
            if (val.is_error()) {
                fprintf(stderr, "Error reply. Need a password?\n");
                state = WFT_STATE_TASK_ERROR;
            }
            break;
        default:
            break;
    }

    if (state != WFT_STATE_SUCCESS) {
        fprintf(stderr, "Failed. Press Ctrl-C to exit.\n");
        return;
    }

    std::string cmd;
    req->get_command(cmd);
    std::cout << " cmd --- :" << cmd << std::endl;
    if (cmd == "SET") {
        auto *data = (tutorial_task_data *) task->user_data;
        WFRedisTask *next = WFTaskFactory::create_redis_task(data->url,
                                                             RETRY_MAX,
                                                             redis_cli::redis_callback);
        next->get_req()->set_request("GET", {data->key});
        // 将下一个任务(GET task)推送到当前序列。
        series_of(task)->push_back(next);
        fprintf(stderr, "Redis SET request success. Trying to GET...\n");
    } else {
        if (val.is_string()) {
            fprintf(stderr, "Redis GET success. value = %s\n",
                    val.string_value().c_str());
        } else {
            fprintf(stderr, "Error: Not a string value. \n");
        }

        fprintf(stderr, "Finished. Press Ctrl-C to exit.\n");
    }

}

void redis_cli::sig_handler(int signo) {
    redis_cli::wait_group.done();
}

int redis_cli::run() {
    //  WFRedisTask *task;
    auto url = "redis://127.0.0.1";
    std::cout << url << std::endl;
    WFRedisTask *task = WFTaskFactory::create_redis_task(url, RETRY_MAX, [](WFRedisTask *task) { // 可以在这callblack里获取和执行一些代码
        std::string cmd;   
        task->get_req()->get_command(cmd);
        std::cout << cmd << std::endl;
        std::vector<std::string> v;
        task->get_req()->get_params(v);
        for( auto str : v ){
            std::cout<< str << std::endl;
        }
    });
    task->get_req()->set_request("SET", {"c++", "Hello World!"}); // 这里就是对Redis的简单使用,类似于对task这个对象执行set方法
    //task->user_data = &data;
    task->start();// 执行这个任务

    WFRedisTask *task2 = WFTaskFactory::create_redis_task(url, RETRY_MAX, [](WFRedisTask *task) {
        std::string cmd;
        task->get_req()->get_command(cmd);
        std::cout << cmd << std::endl;
        protocol::RedisValue val;
        task->get_resp()->get_result(val);
        std::cout<<"Value: "<< val.string_value() << std::endl;
    });
    task2->get_req()->set_request("GET",{"c++"});
    task2->start();
    wait_group.wait();
    return 0;
}

 

 

main.cpp 是不是很喜欢这个主题啊,插件名字叫 Xcode-Dark Theme,粉色的关键字,很符合c++的气质,毕竟github上就是粉色的。