10行C++代码实现高性能HTTP服务

 更新时间:2021年04月28日 14:52:47   作者:Kevin Wan  
这篇文章主要介绍了10行C++代码如何实现高性能HTTP服务,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下

前言

是不是觉得C++写个服务太累,但又沉迷于C++的真香性能而无法自拔?作为一个老牌C++程序员(可以看我 github 上十几年前的C++项目:https://github.com/kevwan ),这几天听一个好友跟我聊起他写的C++框架,说极简代码即可完成各种C++服务的开发,不禁让我心生好奇!于是我去研究了一下,发现确实有点意思!

实战(干货)

话不多说,我们来一起看看,10行C++代码怎么实现一个高性能的Http服务,轻松QPS几十万。Linus说:talk is cheap,show me the code ↓

int main() {
    WFHttpServer server([](WFHttpTask *task) {
        task->get_resp()->append_output_body("Hello World!");
    });
    if (server.start(8888) == 0) {
        getchar(); // press "Enter" to end.
        server.stop();
    }
    return 0;
}

这个 server 使用了 workflow,安装编译都非常简单,以 Linux 为例,把代码拉下来后,一行命令即搞定编译:

➜ git clone https://github.com/sogou/workflow
➜ cd workflow
➜ make
➜ cd tutorial
➜ make
➜ ./helloworld

代码在 tutorial 目录,编译后的 helloworld 可以直接运行,侦听在 8888 端口,curl 即可访问:

➜ curl -i http://localhost:8888
HTTP/1.1 200 OK
Content-Length: 25
Connection: Keep-Alive

Hello World!

伴随着以上这10行代码,我们详细地解读:

  1. 我们选用 Http 协议,因此构造了一个WFHttpServer
  2. 一次网络交互就是一次任务,因为是 Http 协议,因此我们是WFHttpTask
  3. 对server来说,我的交互任务就是收到请求之后,填好回复,这些通过:task->get_req()task->get_resp()可以获得;
  4. 逻辑在一个函数中(即上面的 lambda),表示收到消息之后要做的事情,这里填了一句 “Hello World!”;
  5. Server启动和退出使用start()和stop()两个简单的api,而中间要用getchar();卡住,是因为 workflow 是个纯异步的框架。

纯异步就是这个 Http 服务器的高性能所在:

  • 第一,多线程提供服务

如果我们收到请求之后在这个函数里做了一些阻塞的事情(比如等锁、io请求或者忙碌的计算等),那么再有用户请求我的时候,我就没有线程去处理新用户了

  • 第二,网络线程和执行线程有优秀的调度策略

再多的线程也可能会有被霸占完的时候。我们需要无论 server 函数想要做任何耗时的操作,都不会影响到网络线程

  • 第三,以 linux 为例,对epoll的封装高效好用

如果服务只打算支持一万的QPS,其实底层怎么实现都很简单,但如果我们希望十万,甚至接近百万,则我们对server底层做收发的I/O模型有非常高的要求

我们来看看 workflow 是怎么来实现以上这些高并发能力:

基于以上的架构,基于 workflow 的 server 轻轻松松就可以达到几十万 QPS,高吞吐、低成本、开发快,完美支撑了搜狗的所有后端在线服务!详细代码实现请参考 workflow 源码。然后我们以数据说话,通过跟名誉全球的高性能 Http 服务器 nginx 和国内开源框架先驱 brpc 一起做比较,看一下固定数据长度下 QPS 与并发度的关系:

以上是在同一台机器上用相同的变量做的 wrk 压测,具体可以到 github 查看机器配置、参数及压测工具代码。当数据长度保持不变,QPS 随着并发度提高而增大,后趋于平稳。此过程中 workflow 一直有明显优势,高于 nginx 和 brpc。 特别是数据长度为64和512的两条曲线, 并发度足够的时候,可以保持50W的QPS。

总结

workflow 能在开源大半年在github上收获4k星星的认可,当然是除了简单和高性能以外,还有其他许多的特点,如果你对其他使用场景还有所好奇,或者希望尝试压测一下感受高QPS带来的心跳加速,那么欢迎点击 workflow 的 github 猎奇更多脑洞大开的功能和用法。

项目地址

https://github.com/sogou/workflow

欢迎使用 workflow 并 star 支持一下!

以上就是10行C++代码实现高性能HTTP服务的详细内容,更多关于c++实现高性能HTTP服务的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现扫雷小游戏(控制台)

    C++实现扫雷小游戏(控制台)

    这篇文章主要为大家详细介绍了C++实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++中用指向数组的指针作函数参数

    C++中用指向数组的指针作函数参数

    多维数组名作为函数参数传递:在二维数组中,数组名a是指向首行a[0]的指针,也就是说a=&a[0]; a[0]是指向首元素a[0][0]的指针,也就是说a[0]=&a[0][0]
    2013-10-10
  • java 出现NullPointerException的原因及解决办法

    java 出现NullPointerException的原因及解决办法

    这篇文章主要介绍了java 出现NullPointerException的原因及解决办法的相关资料,这里说明出现NullPointerException 的原因的总结,并说明该如何解决,需要的朋友可以参考下
    2017-08-08
  • C语言运用函数指针数组实现计算器功能

    C语言运用函数指针数组实现计算器功能

    这篇文章主要为大家详细介绍了C语言运用函数指针数组实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Qt打印信息输出到日志文件中的两种方法

    Qt打印信息输出到日志文件中的两种方法

    最近在研究把 Qt 的打印信息 输出的到日志文件中,文件存储尝试了2种方法,并通过代码示例和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-04-04
  • C语言中实现协程案例

    C语言中实现协程案例

    这篇文章主要介绍了C语言中实现协程案例,本文通过将协程与线程和异步回调进行对比,以及具体实现案例,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++算法系列之日历生成的算法代码

    C++算法系列之日历生成的算法代码

    日历算法首先要知道日历的编排规则,也就是历法。所谓历法,指的就是推算年、月、日的时间长度和它们之间的关系,指定时间序列的法则。
    2018-05-05
  • C++实现判断字符串是否回文实例解析

    C++实现判断字符串是否回文实例解析

    这篇文章主要介绍了C++实现判断字符串是否回文,其中采用了数据结构中栈以及过滤字符等技术,,需要的朋友可以参考下
    2014-07-07
  • C语言求幂计算的高效解法

    C语言求幂计算的高效解法

    这篇文章主要介绍了C语言求幂计算的高效解法,分别演示了求幂运算与整数次方的解法,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C语言中isalnum()函数和isalpha()函数的对比使用

    C语言中isalnum()函数和isalpha()函数的对比使用

    这篇文章主要介绍了C语言中isalnum()函数和isalpha()函数的对比使用,都可以判断是否为字母但isalnum的判断还包括数字,需要的朋友可以参考下
    2015-08-08

最新评论