libhv是一个跨平台的c/c++网络库,本文写在libhv开源四周年之际,借机回顾了libhv的发展历程。

github地址:https://github.com/ithewei/libhv

文章目录

  • 无心插柳,扬长避短
  • 精心呵护,深耕细作
  • 齐心协力,厚积薄发

无心插柳,扬长避短


时光荏苒,如白驹过隙。
往事回首,恰插柳成荫。

libhv 的 first commit 记录是在2018年8月28日,芳龄25的我在阅面科技搬砖,刚刚从PC客户端转型做linux服务端开发(想扒拉我牛马一生的可以看我的另一篇博客,一个程序猿的自传)。

libhv最初只是我个人积累的一些跨平台基础设施代码片段,连库都算不上,如时间、日志、线程、字符串等,也就是现在的 base模块,她最初也不叫libhv,叫hw(不是碰瓷华为,也不是硬件,仅仅是我个人名字的首字母缩写),后面因为在项目中使用过libevent、libuv(c语言领域大名鼎鼎的网络库),但总觉得有不好用或者不好理解的地方,如libeventbufferevent就非常难以理解,函数命名也不统一,参数里有很多宏定义,造成了极大的认知负担;libuv的命名倒是非常规整,统一以uv_作为前缀,唯一我认为极不好用的一点是uv_write函数,需要扩展uv_write_t结构体构造一个写请求,然后在写完成回调里去释放uv_buf_t和这个写请求结构体,对于非阻塞写的内存管理完全交给用户,没有提供一个便捷的内置实现,这里对新手来说非常难以使用好,每次写请求都需要malloc/free的示例写法绝不是合理的。关于常见c/c++网络库的echo-server写法比较以及ping-pong性能测试见 echo-servers 目录。

于是我发奋图强,凿壁借二大爷家的光,走马观花了libevent、libev、libuv、nginx、redis源码,给hw加上了event 事件循环模块,封装了select、poll、epoll、kqueue等多种IO多路复用模型,( libhv拥有了event模块,就犹如张无忌获得了九阳神功这门高深内功,开发应用层协议那就是小菜一碟),并易名为libhv,寓意高性能的事件循环库 High-performance event loop library(强行寓意,我TM真是个人才啊)。但libhv绝不是闭门造车和简单的重复造轮子,她站在巨人上的肩膀上再创作,扬长避短,去糟取精,精雕细琢,她有着自己的信仰和使命,为国产争光。

当然有人说没必要开发使用网络库,直接使用epoll不行吗?也就socket->bind->listen->accept、epoll_create、epoll_ctl、epoll_wait几个系统API,当然可以,但当你真正工程实践时,且不论跨平台定时心跳、定时推送需要用到定时器write、close的线程安全问题非阻塞写队列的维护读缓冲readbuf的自动扩缩容粘包分包的处理负载均衡策略,哪一项不是有挑战性的难题,久而久之自然就形成了一层封装,形成所谓的网络库,而且网络库需要时间的沉淀和考验。

精心呵护,深耕细作


一颗幼苗想要长成为参天大树,必先深深扎根于大地,然后不断施肥浇水、悉心照料,才能茁壮成长。

在2019年到2020年,2年的时间里,libhv都在不断完善和新增功能阶段,包括:

  • 参考 陈硕的muduo 和 奇虎360的evpp,提供了c++类封装的 evpp 模块;
  • 实现了本世纪最通用的HTTP协议以及WebSocket协议,源代码见 http 模块,客户端接口设计参考了 python 的 requests ,服务端接口设计参考了 golang 的 gin 和 nodejs 的 express(所以libhv真不是闭门造车,反倒是山寨之王);
  • 集成了openssl、mbedtls、gnutlsSSL/TLS库提供加密功能,源代码见 ssl 模块;

起步阶段,libhvstar数量增长是非常缓慢的,我记得在我2020年5月面试字节时(想了解字节面试的可以看我的另外一篇博客 十面字节跳动,欢迎找我内推),libhv才四百多星,下图是我在 star-history 网站下载的一张star走势图:

在2020年11月,有一段直线上升期,那是因为该月内上了几次github trending榜,所以star数量猛增突破了1k星,为此我还高兴了好一阵,特写了一篇博文纪念之,见 纪念libhv上github trending (决不放过任何一个可以吹牛的机会)。

直到2021年2月28日,我才正式release了第一个版本,见 github releases 记录 。

2021、2022两年的时间里,主要是完善了教程和技术支持,包括:

  • 建立了 QQ技术交流群 739352073,目前已有群成员1k+,欢迎入群交流;
  • 提供了很多的示例代码,见 examples 目录;
  • 编写了 libhv入门教程(写教程可一点不比写代码轻松);

当然也有技术上的重大更新,包括:

  • 内置拆包模式,支持固定包长、分隔符、头部长度字段三种常见的拆包方式(这个在c/c++领域绝对是首屈一指,目前我只在javanetty里见过),详见 TCP如何处理粘包与分包;
  • http添加了HttpService::Static设置静态资源目录,以及HttpService::Proxy设置代理转发,可以很方便实现和nginx的配置文件里location、root、proxy_pass类似功能;
  • 添加了 mqtt 模块(利用了上面提到的拆包功能,整个mqtt协议实现只花了不到 600 行,非常适合学习开发自定义协议)
  • 可靠UDP支持,集成了KCP(私下实现了c语言版本的kcptun,这部分尚未开源)

齐心协力,厚积薄发


世上绝没有随随便便的成功,一切偶然其实也是必然

令我欣慰的是,自建群以来,我收到不少说libhv简单易用已用于生产环境通过libhv学到了很多等正向反馈;当然也有出现bug的反馈,也都会及时跟进修复;群管理员也非常给力,非常耐心地答疑解惑,再次感谢他们的付出(当然也呼吁大家提问前能先翻阅下 FAQ文档,80%的问题可以在这里面找到答案,关于网络编程里常见的坑请参考 网络编程十宗罪 排查下);另外 contributors 也多了十几位,可惜我没有薪资报酬你们,都是用爱发电。

libhv的口号是让世上没有难写的网络程序,虽然目前已取得一些成效,但还有很长的路要走。
关于libhv的一些后续计划,见 https://github.com/ithewei/libhv/blob/master/docs/PLAN.md

包括:

  • 开发libhv官网
  • redis clientredis同步/异步客户端
  • mysql clientmysql同步/异步客户端(虽然我不太赞成使用c/c++开发数据库CURD业务)
  • async DNS:异步DNS(自实现或者接入cares
  • 绑定到其它语言,如lua、js、python,可以使用脚本开发业务逻辑
  • hrpc :基于libhv实现RPC框架,兼容grpcthrift协议(注:简单的rpc实现可以参考 examples目录 下的 jsonrpc,protorpc,当然一个完善的RPC框架涉及IDL自动生成各种语言的脚手架、服务注册与发现、负载均衡、重试、熔断、限流等,推荐看 brpc的文档,能学到很多,目前能满足多语言版本的成熟RPC框架也就grpcthrift
  • rudp: 可靠UDP(目前接入了KCP,后续可能接入FEC、QUIC
  • io_uring:接入io_uring尝鲜
  • coroutine:协程,我的想法是等c++20成熟后,直接基于c++20的协程实现
  • cppsocket.io:基于libhv实现c++版本的 socket.io
  • IM-libhv:基于libhv实现IM即时通信,例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等
  • MediaServer-libhv:基于libhv实现流媒体服务,类似 srs、ZLMediaKit
  • GameServer-libhv:基于libhv实现游戏服务,类似 skynet、kbengine

以上列举的这些计划和应用场景仅供参考,抛砖引玉,给大家提供一个思路;

一个人的时间精力毕竟有限,只有依靠社区的力量才能做大做强,建立起生态,希望有越来越多的人能加入到libhv的贡献中来。

最后,想说的是:

即使c++推出标准网络库,我希望ta也有用武之地;
即使终将凋零,至少ta曾经绽放过;
为开源精神点赞!
为国产争光!

国产网络库libhv开源四周年回顾相关推荐

  1. 基于c++11新标准开发一个支持多线程高并发的网络库

    背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...

  2. 网络库libevent、libev、libuv、libhv对比

    网络库libevent.libev.libuv对比_小麒麟的成长之路-CSDN博客_libevent libuv Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asyn ...

  3. 谷歌开源张量网络库TensorNetwork,GPU处理提升100倍!

    编译 |  琥珀 出品 | AI科技大本营(ID:rgznai100) 世界上许多最严峻的科学挑战,如开发高温超导体和理解时空的本质,都涉及处理量子系统的复杂性.然而,这些系统中量子态的数量程指数级增 ...

  4. 开源免费的C/C++网络库(c/c++ sockets library)

    (1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html (2)Asio Asio基于Boo ...

  5. linux tcp server开源,GitHub - 06linux/cellnet: 高性能,简单,方便的开源服务器网络库...

    cellnet cellnet是一个高性能,简单,方便的开源服务器网络库 自由混合编码,业务代码无需调整. TCP和html5的应用都可以直接使用cellnet迅速搭建服务器框架. 与Java的Net ...

  6. 直接拿来用!谷歌开源网络库 TensorNetwork,GPU 处理提升 100 倍

    编译 |  琥珀 出品 | AI科技大本营(ID:rgznai100) 世界上许多最严峻的科学挑战,如开发高温超导体和理解时空的本质,都涉及处理量子系统的复杂性.然而,这些系统中量子态的数量程指数级增 ...

  7. C++-网络库:Poco概述【开源的C++类库的集合】【提供简单的、快速的网络和可移植应用程序的C++开发】【和C++标准库可以很好的集成并填补C++标准库的功能空缺】【适合嵌入式开发】

    学习一个框架前,要先明白它的是什么,为什么,怎么用.下面这些文字,是从中文poco官网上转过来的,正如poco c++库的特点,非常清晰,代码风格更是一目了然: poco开发库的特点,非常适合写后台处 ...

  8. libgo高性能网络服务器,【开源】gnet: 一个轻量级且高性能的 Golang 网络库

    ![](https://ask.qcloudimg.com/http-save/1303222/sipe2g9n9h.png) # Github 主页 [https://github.com/panj ...

  9. 【开源推荐】gnet: 一个轻量级且高性能的 Go 网络库

    Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于事件驱 ...

最新文章

  1. Java12和Jdk12安装以及OpenJdk12源码
  2. 利用Unity自带的合图切割功能将合图切割成子图
  3. Google Brain大牛Jeff dean视频
  4. ajax搜索思路,jquery创建一个ajax关键词数据搜索实现思路
  5. docker -v 覆盖了容器中的文件_Docker容器之安装Mysql
  6. Leetcode每日一题:767.reorganize-string(重构字符串)
  7. 添加spark.yarn.jars 解决 WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set,
  8. 深入理解JVM-java内存区域与内存溢出异常
  9. Linux多线程编程之pthread
  10. 2016年读书总结(一)
  11. matlab 双音多频 接收端检测到的号码,实验一数字信号处理在双音多频拨号系统中的应用.doc...
  12. 计算机组成原理常见英文缩写
  13. 【Linux 内核】Linux 内核源码根目录下的文件 ( .clang-format | COPYING | CREDITS | Kbuild | Kconfig | MAINTAINERS )
  14. 英语基础知识:句子类型
  15. linux计划任务如何关闭程序,Linux进程控制和计划任务管理
  16. 如何管理和使用哪些命令操作MySQL数据库?(基本操作,SQL语言,DDL,DML,DQL,DCL,Windows字符和图形界面MySQL安装)
  17. java工作空间报错,java更改工作空间后报错
  18. OpenCV打开相机,调整窗口大小位置
  19. 腾讯云基础认证是什么?多少分通过?
  20. 华为一系统命名为鸿蒙的意图,华为操作系统命名曝光,国内与海外不一样,背后是华为人的斗志...

热门文章

  1. What?外星人电脑大放价?双十一来杭州外星人大悦城旗舰店薅羊毛吧
  2. 发模板消息( 自己项目 )
  3. POI 给段落设置字体
  4. 如何批量提取图片的名称?亲测好用
  5. Chrome 浏览器上最值得使用的8款插件
  6. 【手撕AHB-APB Bridge】~ AMBA总线 之 APB
  7. VSCODE 插件推荐
  8. JS中的pop()元素
  9. php微信公众号支付接口案例,Thinkphp微信公众号支付接口
  10. 小程序入门开发(一)注册激活小程序、发布小程序