关于golang:10行C代码实现高性能HTTP服务

54次阅读

共计 1903 个字符,预计需要花费 5 分钟才能阅读完成。

前言

是不是感觉 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 始终有显著劣势,高于 nginxbrpc。特地是数据长度为 64 和 512 的两条曲线,并发度足够的时候,能够放弃 50W 的 QPS。

总结

workflow 能在开源大半年在 github 上播种 4k 星星的认可,当然是除了 简略 高性能 以外,还有其余许多的特点,如果你对其余应用场景还有所好奇,或者心愿尝试压测一下感触高 QPS 带来的心跳减速,那么欢送点击 workflow 的 github 好奇更多脑洞大开的性能和用法。

我的项目地址

https://github.com/sogou/workflow

欢送应用 workflowstar 反对一下!

微信交换

关注『微服务实际』公众号并回复 进群 获取微服务社区群二维码。

go-zero 系列文章见『微服务实际』公众号

正文完
 0