Skip to content

workflow简介

理论上来说,只要遵循HTTP的协议标准,那么不管是什么类型的程序都是可以发送请求和回复响应的。实际上,绝大多数用户都是采用浏览器来发送HTTP请求(有一些应用程序,比如curl、postman之类的也可以发送HTTP请求)。而服务端的选择就多种多样了:用户可以自行在操作系统的Berkeley socket库之上构建服务端程序,接收请求并根据实际业务回复响应(比如课程最开始的例子);用户也可以选择市场上成熟的HTTP服务端产品,比如Nginx、Apache等,这样的话业务就需要通过书写配置文件来使用产品提供的功能。无论是从零开始构建还是选择成熟产品都有着各自的缺陷,前者太过繁琐,而后者则不够灵活。一种折中的方案就是使用提供动态库的产品,这样只需要在业务中引入对应的接口,就可以进行后续开发。

Workflow是搜狗公司开源的C++网络服务框架。当然Workflow的能力远不止一个普通的HTTP服务端,按照workflow官方的README所述,Workflow是搜狗公司C++服务器引擎,支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理超百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数C++后端开发需求。

在workflow中,框架把所有要执行的工作抽象成了任务,有一些任务的行为是相对固定,比如发起HTTP请求、连接到MySQL执行SQL语句、连接到Redis进行读写等等,框架已经提前把这些任务的创建过程实现好了,用户只需要使用一些工厂函数就可以创建这些任务。

一旦创建好任务之后,这些任务稍后可以被用户启动。任务执行时会根据不同的任务类型来完成不同的基本工作,比如:HTTP任务就会确定服务端的IP地址,和服务端建立TCP连接,发送HTTP请求报文;MySQL任务会连接到mysqld,并且登录,再执行数据库指令。其他类型的任务也会有一些不同的基本工作。

当基本工作完成了之后,就会执行用户设计好的回调函数,之后任务就会结束或者是继续执行序列当中的下一个任务。

异步框架

Workflow将实际的业务逻辑按照流程图的形式分解成一个一个的任务,每个任务执行时会分为两个阶段:首先是根据任务的类型完成基本工作,待基本工作完成之后,就会执行一个回调函数。任务之间可以同步地串行执行,多个任务也可以同时异步地并行执行。用户在使用框架时,可以将业务逻辑分解成串并联流程图,然后按照流程图分配任务,最终实现业务需求。

Workflow是一种异步框架,用户首先需要根据业务需求,选择使用不同的工厂函数创建不同类型的任务,随后设置任务的属性,再启动任务。在启动任务之后,任务会和原来的执行流并行执行。在任务的执行过程中,会调用到用户传入的回调函数,而原来的执行流可以等待任务的终止,也做其他工作,比如开启其他的任务。

如果启动多个任务,那么这些任务之间是并行运行的(无论是在主线程中启动的任务还是某个任务的回调函数中启动函数)。

倘若由于业务的需求,需要在任务之间设置明确的先后依赖关系,此时可以采用系列将这些任务串联起来,系列可以认为是任务构成的队列,队列内部的任务按照先进先出的方式执行。系列内部可以设置context属性,用于在系列内部的任务之间传递数据;系列还可以传入一个callback,这个callback会在系列中所有的任务完成之后调用。不同的系列之间是可以并行执行,每个任务单独启动的时候会创建一个系列,所以任务之间的并行执行其本质就是系列之间的并行执行。

安装workflow

  1. 先下载workflow的源码,可以选择下载release版本或者直接在github当中克隆最新的版本。Github地址
  2. 安装所有依赖的库文件
    bash
    sudo apt install -y cmake libssl-dev
  3. 使用cmake生成Makefile文件,然后使用make编译链接生成动态库
    bash
    # cd 到源代码目录当中 
    mkdir build 
    cd build 
    cmake ..
    make
  4. 使用 make install 将库文件和头文件移动到操作系统的合适位置,并且更新链接器的配置
    bash
    sudo make install
    sudo ldconfig

workflow框架把所有代码都以库(*.a 或者 *.so)的形式发布,用户在使用的时候,将从相关的头文件(一般位于 /usr/local/include/workflow)当中获取各个类的声明,使用 #include 指令引入,在链接的时候加上 -lworkflow 选项即可。

测试是否安装成功可以进入源码目录下的 tutorial 目录中编译一个示例代码测试效果

bash
cd tutorial
g++ tutorial-00-helloworld.cc -o hello -g -lworkflow
./hello

如果是本机编译运行的可以打开浏览器访问 http://127.0.0.1:8888/ 进行查看,如果是在远程机器上编译运行的可以使用对应的 IP+端口 进行访问,不出意外可以看到浏览器窗口中显示了 Hello World! 字样。如果有意外就按照提示解决遇到的问题。

测试完成可以 Ctrl+C 结束运行。

参考文档