gnet 是什么?

gnet 是一个基于事件驱动的高性能且轻量级的网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv。

gnet 设计开发的初衷不是为了取代 Go 的标准网络库:net,而是为了创造出一个类似于 Redis、Haproxy 能高效处理网络包的 Go 语言网络服务器框架。

gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix Domain Socket)网络框架,开发者可以使用 gnet 来实现自己的应用层网络协议(HTTP、RPC、Redis、WebSocket 等等),从而构建出自己的应用层网络应用:比如在 gnet 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。

开源地址:https://github.com/panjf2000/gnet

v1.0.0 正式版本

从 2019 年 9 月份开放源码到 GitHub,经过半年多的新功能开发、bug 修复、架构设计重构以及性能优化,Go 语言网络框架 gnet 现在终于发布了第一个正式的 v1 稳定版本!具体的 release 列表可以到 https://github.com/panjf2000/gnet/releases 查看。往后还会持续不断地进行开发、修复、优化甚至重构,如果 gnet 的用户在使用的过程中发现 bug,随时到 gnet 的 Github Issue 页 给我提 issue。

目前,gnet 具备了如下的功能特性:

  • 高性能 的基于多线程/Go 程网络模型的 event-loop 事件驱动
  • 内置 goroutine 池,由开源库 ants 提供支持
  • 内置 bytes 内存池,由开源库 bytebufferpool 提供支持
  • 简洁的 APIs
  • 基于 Ring-Buffer 的高效内存利用
  • 支持多种网络协议/IPC 机制:TCP、UDP 和 Unix Domain Socket
  • 支持多种负载均衡算法:Round-Robin(轮询)、Source Addr Hash(源地址哈希)和 Least-Connections(最少连接数)
  • 支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
  • 支持异步写操作
  • 灵活的事件定时器
  • SO_REUSEPORT 端口重用
  • 内置多种编解码器,支持对 TCP 数据流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,参考自 netty codec,而且支持自定制编解码器
  • 支持 Windows 平台,基于 IOCP 事件驱动机制 Go 标准网络库
  • 实现 gnet 客户端

上面列表中除了一些最基本的功能特性,后来的新功能都是由 gnet 的用户提出、我开发实现的,在此感谢这些同学的贡献!列表中还有几个计划中的新功能特性在考察和开发阶段,我会对用户提出的新功能需求进行合理性和必要性的评估,然后进行适当的取舍,因此计划中的功能特性列表可能会随时发生变化。另外,也欢迎对 gnet 源码感兴趣且想为 gnet 增添新功能或者修复 bug 的同学给我提 PR 贡献代码,谢谢!

gnet 的自我定位是高性能且轻量级的 Go 语言网络框架,暴露极简的接口的同时又能提供丰富的功能,性能远超 Go 语言原生网络库,如果你的追求极致的性能,那 gnet 绝对是你的绝佳选择。

性能测试

上面提到 gnet 作为一个 Go 语言网络框架主打的是高性能,当然,不能只凭我一张嘴说说就证明了 gnet 的高性能,毕竟空口无凭嘛!所以,在这里让我引用改编一下程序员撕逼界著名的一句话:Talk is cheap, show me your benchmark!

提到框架性能测试,熟悉这方面的同学不会没听过 TechEmpower,这是全球 Web 框架权威性能测试:

This is a performance comparison of many Web application frameworks executing fundamental tasks such as JSON serialization, database access, and server-side template composition. Each framework is operating in a realistic production configuration. Results are captured on cloud instances and on physical hardware. The test implementations are largely community-contributed and all source is available at the GitHub repository.

TechEmpower 测试有源代码,硬件配置全部公开,而且很多框架是作者自己或资深爱好者提交的,他们各自肯定知道该如何极致地优化基于这些框架的 Server,而且这些结果都是可重现的,谁觉得不服可以自己跑跑看,源代码和需求页面提供了每种测试的执行细节以及其它相关信息,各种 Web 框架性能对比页面提供了更多有关如何进行测试的细节与测试基准的概况。TechEmpower 测试的主要目的是将目前流行的 Web 开发框架从多个维度来进行测试,这些测试的场景主要是针对这些 Web 框架执行的基本任务,比如数据库访问、JSON 序列化和服务端模板的组合等等场景,整体得分非常具有借鉴价值。

目前已提交 TechEmpower 测试的框架有将近 700 个,其中包括 Netty、Vert.x、Spring、Actix、FastHTTP、Swoole、Nginx 等业界知名的框架/平台,囊括了 C/C++、Java、C#、Rust、Go、PHP、Ruby、Python 等一众主流编程语言,是目前业界最权威的 Web 框架性能测试。

目前,TechEmpower 提供了 2 种硬件环境:云主机 Microsoft Azure D3v2 instances; switched gigabit Ethernet 和物理机 Dell R440 servers each equipped with an Intel Xeon Gold 5120 CPU, 32 GB of memory, and an enterprise SSD. Dedicated Cisco 10-gigabit Ethernet switch。

测试内容包括 Plaintext、Single Database Query、Multiple Database Queries、Fortunes、JSON Serialization 等等(全部的测试 cases 可以查看 Project Information Framework Tests Overview),得出了一系列的 Web 框架的性能基准,对于程序员来说,这是一份极具参考价值的 Web 框架评估选型的 benchmark 数据。

gnet 的性能数据将借助于 TechEmpower 展现,由于 TechEmpower 的测试是基于 HTTP 协议的,因此需要基于 gnet 实现一个简单的 HTTP Server 并提交 TechEmpower 测试,目前 gnet 参与测试的只有 Plaintext 这一项,这也是最能直接体现出框架网络处理性能的一项测试。

下面是最新一轮的 TechEmpower Benchmark 性能测试结果:

# Hardware
CPU: 28 HT Cores Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz
Mem: 32GB RAM
OS : Ubuntu 18.04.3 4.15.0-88-generic #88-Ubuntu
Net: Switched 10-gigabit ethernet
Go : go1.14.x linux/amd64

这是包含全部编程语言框架的性能排名 top 50 的结果,总榜单包含了全世界共计 382 个框架(Plaintext 测试), gnet 位列第 5, gnet 也是唯一进入前十的 Go 语言框架。其中,一些业界比较知名的框架/平台的排名:Netty 排名 36、Nginx 排名 66、Vert.x 排名 40、Spring 排名 238,等等。

这是 Go 语言分类下的性能排名, gnet 位列第 1。

完整的排行可以通过 view all benchmark results 查看。

基于上面的 TechEmpower 性能测试结果, gnet 在全世界的框架/平台的竞争中名列第 5,中二点说法就是天下第五,它的高性能定位应该可以说是毋庸置疑了。

P.S. 需要说明的是,因为 gnet 并不是一个 Web/HTTP 框架而是一个更加底层的网络框架,所以我给 gnet 裸写了一个简单的 HTTP Parser,其对于 HTTP 协议的解析是不完备的,跳过了一些(对于这个测试不需要的)繁杂解析步骤,可以说是针对性的优化。相较于其他真正的 Web/HTTP 框架, gnet 在这方面占了一点便宜,不过,Plaintext Benchmarks 主要测试的是框架最基础/核心request-routing 性能,所以最终的测试结果对于评估一个框架的网络处理性能还是极具参考价值和现实意义的。

总结

gnet 作为一个高性能且轻量级的网络框架,适用于追求极致性能的网络场景,性能表现远超 Go 语言原生网络库,就算是在全球权威性能测试 TechEmpower 排行榜上的表现也很耀眼:全部编程语言总排行第 5,Go 语言分类排行第 1。如果你正在用 Go 开发网络应用且追求极致的性能, gnet 将会是你的绝佳选择,欢迎试用!

开源地址:https://github.com/panjf2000/gnet

最快的 Go 网络框架 gnet 来啦!相关推荐

  1. ym—— Android网络框架Volley(终极篇)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103).谢谢支持! 没看使用过Volley的同学能够,先看看 Android网络框架Volley(体验篇) ...

  2. Go 开源说第十八期预告:基于 Reactor 模式开发网络服务——gnet

    点击蓝字 关注我们 写在前面 GoCN开源说是GoCN推出的一档分享Go开源好项目的直播栏目,通过开源说希望能够帮助到开源作者们实现以下目标: 第一是去推广他们的开源项目 第二说说背后的设计原理和理念 ...

  3. 鸿蒙开发之网络框架搭建,MVP+Retrofit2+okhttp3+Rxjava2+RxHarmony

    抓住人生中的一分一秒,胜过虚度中的一月一年! 小做个动图开篇引题 鸿蒙背景 2020年9月10号,鸿蒙2.0(HarmonyOS 2.0)系统正式发布,鸿蒙2.0面向应用开发者发布Beta版本,在20 ...

  4. Volley网络框架分享

    简 介 1 Volley是在2013年谷歌发布的一款快捷高效.轻量级的网络通信框架,里面封装了HttpURLConnection和HttpClient的通信细节. 2 优点: 自动调度网络请求: 非常 ...

  5. Android 网络框架

    来源于:http://blog.csdn.net/t12x3456/article/details/9221611 Volley主页 https://android.googlesource.com/ ...

  6. 跨平台微信网络开源Mars与网络框架Okhttp、Volley、Retrofit,Cookie持久化

    > 1. Mars 移动端IM网络层跨平台组件库Mars- https://github.com/Tencent/mars Android.iOS.OS X 平台的 demo(微信开源Mars的 ...

  7. Android网络框架Volley的快速使用

    一.基本使用 之前做Android开发都是使用学长自己封装好的网络请求框架,第三方网络框架也很多,网上搜索了一下,大多数人推荐使用 android-async-http okhttp Volley 其 ...

  8. 网络框架 - 收藏集 - 掘金

    浅谈 Retrofit 封装 - 让框架更加简洁易用 - Android - 掘金 尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiqu..., 本文出自:[ ...

  9. Android网络框架-OkHttp3.0总结

    一.概述 OkHttp是Square公司开发的一款服务于android的一个网络框架,主要包含: 一般的get请求 一般的post请求 基于Http的文件上传 文件下载 加载图片 支持请求回调,直接返 ...

最新文章

  1. Exchange 2007 的邮件监控器
  2. 中國批准英特爾在東北投建晶片廠
  3. 数据库相关概念以及简单SQL语句
  4. Java 应用性能调优,可视化工具
  5. php 5.2 mysqli_PHP5安装好后添加mysqli扩展支持 | 学步园
  6. adg类似于mysql半同步机制_MySQL基准测试异步复制和半同步复制延迟对比
  7. MyBatis 哪些地方用到了代理模式?
  8. C - Swaps 2(树状数组,思维)
  9. 存储类、作用域、生命周期、链接属性
  10. Linux修改hostname的几种方式,及遇到的问题
  11. 特斯拉加州工厂无视禁令强行复工,马斯克:要抓就只抓我
  12. 转载 电子商务关键数字优化(线上部分,中)
  13. 关于node的聊天室错误
  14. java抽象类的字段_java打印出继承体系的类(包括抽象类)、接口、域字段
  15. 网站后端_Python+Flask.0003.FLASK快速入门之Hello Word?
  16. php 怎么更新浏览器缓存文件在哪里,PHP 设置动态网页在浏览器的缓存
  17. JSP+MySQL基于ssm的物理竞赛管理系统
  18. 使用PhotoShop制作蓝底证件照
  19. 为什么说继承是把双刃剑
  20. 1001 hzy 和zsl 的生存挑战

热门文章

  1. 财智金和普通信贷产品相比有什么区别,申请条件高吗?
  2. 安徽省职称英语和计算机改革,安徽职称评定取消职称英语门槛 合格可折算继续教育学时...
  3. 安装VS2022版Visual Assist出现的问题
  4. 建行聚合支付及支付宝二维码开发经验(C语言2)
  5. 第15章、布局Layouts之TableLayout表格布局(从零开始学Android)
  6. 【nginx】反向代理
  7. h5适配pc和移动,meta标签的配置
  8. 【高精度定位】RTK定位与RTD定位知识科普
  9. 数据分析实战应用案例精讲-【概念篇】用户画像(补充篇)(附实战案例)
  10. 用D触发器实现时钟分频