背景
以前写http server服务器一般用nodejs 或者 java,最近想研究c++ 后端写http server感觉,顺便了解一下c++ linux开发代码看看感觉怎么样,于是着了好久发现代码sogou开源的workflow,我看了一下文档和介绍感觉代码非常清晰,而且代码写起来非常精炼。
介绍
- 高并发,跨平台,linux 用epoll ,其他都用对应平台高性能模式(c++ 一些网络库,直接用select 模式+多线程模式,但这种写服务器代码性能不够,只能当客户端使用)
- 异步框架,比喻文件操作,数据库操作,redis操作,如果框架不支持异步,如果框架不支持异步,那么用户要么就用阻塞,那么直接自己写多线程进行回调才可以,如果阻塞那么导致并发并不高,因为变成串行,如果多线程会导致代码复杂度增加同时引入线程竞争的危险
- 任务模式,一个任务请求注册对应的回调,然后服务器收到响应处理对应的响应,这样子网络框架很容易实现类似http协议逻辑
- 系列任务(忘记了具体怎么叫了),比喻http task 可以在这个任务添加其他任务,比喻文件操作任务,数据库操作任务,redis操作任务,你可以注册这系列任务完成回调,也可以在其他任务完成做响应,具体看自己习惯(这个后续写介绍文档的时候写一下demo代码),这样子写服务器代码就非常爽了,有点类似node js开发模式,纯异步,java 后端异步都不怎么好用,文件操作都是阻塞,但java貌似有异步函数,但感觉最爽还是nodejs 和 c# 写,c# 直接把多线程封装很好,结合await 基本很少考虑线程的问题。
文档和代码
sogou/workflow: C++ Parallel Computing and Asynchronous Networking Framework (github.com)
#include <stdio.h>
#include "workflow/WFHttpServer.h"
int main()
{
WFHttpServer server([](WFHttpTask *task) {
task->get_resp()->append_output_body("<html>Hello World!</html>");
});
if (server.start(8888) == 0) { // start server on port 8888
getchar(); // press "Enter" to end.
server.stop();
}
return 0;
}
这个是官方httpserver 最简单代码
网络库逻辑
目前c++ 服务器 网络库可以用workflow ,客户端可以用微信的mars,这些都是经过商用考研,基本他们2个库都是类似task 逻辑,我不知道这个是不是叫rpc 思路,workflow业务场景用于服务器,mars 主要考虑客户端网络环境,所以mars用http短连接和长连接2个种,自动切换,方便网络差的情况,workflow考虑并发,待续补充一些自己以前想法和认知。
过程
我用workflow开发一个http server 提高一个小功能,用于自己使用,这个过程我研究g++ 研究编译命令,同时研究怎么写静态库和动态库,然后去学习一下makefile,自己写和自己以前只看文档不一样,一下子就学会写makefile,感觉很多东西必须边学边用,这样子效率最高。
用vscode远程开发linux确实感觉很爽,我期间用vim和sublime开发感觉也不错,只是还是没有vscode方便,根本不用管那么多,安装几个插件即可
补充
因为workflow研究一段时间,本来很早想写,但期间又研究其他的技术,这样子导致时间线拉太长了,所以临时写一个很简单文档,为了以后自己还能继续写