我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

前言

是不是觉得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服务的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

10行Python代码能实现什么高端操作

10行Python代码能实现什么高端操作,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python凭借其简洁的代码,赢得了许多开发者的喜爱。因此也就促使了更多开发者用Pyt
2023-06-16

Go中怎么用Routines实现高性能HTTP服务器

在Go中使用Routines实现高性能HTTP服务器的步骤如下:1、创建一个HTTP服务器实例并监听指定的端口号:package mainimport ("net/http")func main() {http.HandleFunc(
Go中怎么用Routines实现高性能HTTP服务器
2024-04-18

Qt实现http服务的示例代码

这篇文章将为大家详细讲解有关Qt如何实现http服务,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获
2023-05-15

Linux shell实现HTTP服务示例代码

一、前言 使用代理服务器 HAProxy 对 Mysql 做负载均衡是常用方案,为提高可用性,当某个 Mysql 出现问题时,例如服务器故障了,或者数据复制中断了,最好可以让 HAProxy 马上知道,然后停止向其转发请求 HAProxy
2022-06-04

C++ 性能优化指南:探索提高代码执行效率的秘诀

c++++ 性能优化涉及多种技术,包括:1. 避免动态分配;2. 使用编译器优化标志;3. 选择优化数据结构;4. 应用缓存;5. 并行编程。优化实战案例展示了如何在整数数组中查找最长上升子序列时应用这些技术,将算法效率从 o(n^2) 提
C++ 性能优化指南:探索提高代码执行效率的秘诀
2024-05-23

如何通过Java代码实现Jetty的Http服务器

这篇文章主要讲解了“如何通过Java代码实现Jetty的Http服务器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何通过Java代码实现Jetty的Http服务器”吧!Jetty是一个轻
2023-07-02

Python一行代码实现一个文件服务器

简述Python有很多简单的工具库可用,其中有一个非常实用的工具库:SimpleHTTPServer一行代码建立一个简单的python HTTP文件服务器使用方法$python -m SimpleHTTPServerServing HTTP
2023-01-31

C#实现SMTP服务发送邮件的示例代码

这篇文章主要为大家详细介绍了如何利用C#实现SMTP服务发送邮件的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-27

使用 C++ 构建高性能服务器架构的最佳实践

遵循 c++++ 中构建高性能服务器架构的最佳实践可以创建可扩展、可靠且可维护的系统:使用线程池以重用线程,提高性能。利用协程减少上下文切换和内存开销,提升性能。通过智能指针和引用计数优化内存管理,避免内存泄漏和性能瓶颈。选择哈希表、数组和
使用 C++ 构建高性能服务器架构的最佳实践
2024-05-14

阿里云数据库代理服务——实现高可用性和高性能的数据库连接解决方案

阿里云数据库代理服务是一种用于实现数据库高可用性和高性能的解决方案。它通过在客户端和数据库之间建立一个代理服务器,将客户端请求转发到后端数据库,并处理请求并返回结果给客户端。本文将详细介绍阿里云数据库代理服务的功能、优势以及应用场景。详细说明:功能介绍阿里云数据库代理服务(DatabaseProxyService
阿里云数据库代理服务——实现高可用性和高性能的数据库连接解决方案
2024-01-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录