搜狗workflow异步调度框架例程分析——00

文章目录

  • workflow例程:00
  • 一、创建http服务
    • 1、WFHttpServer类
    • 2、WFHttpTask类
  • 二、开启/关闭服务
  • 三、测试
  • 四、总结

关于搜狗的workflow不在赘述,可以查看知乎介绍 https://zhuanlan.zhihu.com/p/165638263
B站也有视频。
从本篇开始根据workflow提供的源码例程为切入点开始分析如何使用workflow搭建异步调度的C++后端代码

workflow例程:00

搜狗workflow异步调度框架例程分析——00_第1张图片

这个代码很简单,简单到官方都没有给出关于他的任何文档,连编号都是00。但是对于首次接触sougou_workflow框架来说也需要花费时间看一下。
那么我们来一起看一下这个代码:

一、创建http服务

WFHttpServer server([](WFHttpTask *task) {
    task->get_resp()->append_output_body("Hello World!");
    });

我们可以看到这里建立了一个WFHttpServer的对象

1、WFHttpServer类

//WFHttpServer.h
using WFHttpServer = WFServer<protocol::HttpRequest,
							  protocol::HttpResponse>;

//WFServer.h
template<class REQ, class RESP>
class WFServer : public WFServerBase
{
public:
	WFServer(const struct WFServerParams *params,
			 std::function<void (WFNetworkTask<REQ, RESP> *)> proc) :
		WFServerBase(params),
		process(std::move(proc))
	{
	}

	WFServer(std::function<void (WFNetworkTask<REQ, RESP> *)> proc) :
		WFServerBase(&SERVER_PARAMS_DEFAULT),
		process(std::move(proc))
	{
	}

protected:
	virtual CommSession *new_session(long long seq, CommConnection *conn);

protected:
	std::function<void (WFNetworkTask<REQ, RESP> *)> process;
};

而WFHttpServer其实是关于WFServer的一个模板。
根据类的构造函数可以看到,WFSever的参数初始化有两种方法:

  1. 带入param,proc两个参数
  2. 带入proc两个参数(默认模式 SERVER_PARAMS_DEFAULT)

随后通过WFServerBase初始化第一个参数,通过WFNetworkTask初始化第二个参数。
下面是第一个参数的struct

struct WFServerParams
{
	size_t max_connections;		//最大连接数
	int peer_response_timeout;	/* timeout of each read or write operation */
	int receive_timeout;	/* timeout of receiving the whole message */
	int keep_alive_timeout;		//保持连接的超时时间
	size_t request_size_limit;	//请求最大字节限制
	int ssl_accept_timeout;	/* if not ssl, this will be ignored */
};

//而SERVER_PARAM_DEFAULT如下,是WFSeverParams的默认值
static constexpr struct WFServerParams SERVER_PARAMS_DEFAULT =
{
	.max_connections		=	2000,
	.peer_response_timeout	=	10 * 1000,
	.receive_timeout		=	-1,
	.keep_alive_timeout		=	60 * 1000,
	.request_size_limit		=	(size_t)-1,
	.ssl_accept_timeout		=	10 * 1000,
};

从代码中可以看到例程使用的是默认参数模式。

2、WFHttpTask类

//WFTaskFactory.h
using WFHttpTask = WFNetworkTask<protocol::HttpRequest,
								 protocol::HttpResponse>;

//WFTask.h
template<class REQ, class RESP>
class WFNetworkTask : public CommRequest
{
	//这个类过长,只选择需要用到的分析
	RESP *get_resp() { return &this->resp; }
}

//HttpMessage.h
bool append_output_body(const std::string& buf)
	{
		return this->append_output_body(buf.c_str(), buf.size());
	}

在函数中调用了该类中的get_resp()->append_output_body()函数,这个函数的是为了添加要执行的HTML语句,例程中使用了一个HellowWorld简单代替。

经过上述操作,我们已经成功建立了一个完整的Http服务。
接下来我们需要在服务器端启动服务。

二、开启/关闭服务

if (server.start(8888) == 0) { // start server on port 8888
        getchar(); // press "Enter" to end.
        server.stop();
    }

sougou_workflow很吸引人的地方就是一句程序就可以启动服务,像上述代码一样,只需要server.start(post)即可开启;而server.stop()即可关闭服务。

三、测试

搜狗workflow异步调度框架例程分析——00_第2张图片
运行服务后使用curl命令访问本地8888端口,获取response,成功。

四、总结

使用sougou_workflow建立http服务,只需要三步

  1. 初始化服务
  2. 编写html文件
  3. server.start

你可能感兴趣的:(Sougou_WorkFlow,C/C++)