English | 中文
🎉🎉🎉 欢迎加入Discord服务器上关于gnet
的频道。
📖 简介
gnet
是一个高性能、轻量级、非阻塞的事件驱动网络框架。它通过利用epoll和kqueue从零开始构建,在许多特定场景下能够实现比Go net更高的性能和更低的内存消耗。
gnet
和net在网络编程方面的理念不同。因此,使用gnet
构建网络应用与使用net构建可能会有显著差异,两者的理念无法调和。社区中还有其他用其他编程语言编写的类似产品,如libevent、libuv、netty、twisted、tornado等,它们在底层的工作模式与gnet
类似。
gnet
的设计目的不是取代Go net,而是在Go生态系统中为构建性能关键型网络服务提供一种替代方案。因此,gnet
不像Go net那样全面,它只提供网络应用所需的核心功能(以简洁的API集合形式),并且不打算成为一个涵盖所有方面的网络框架,因为我认为Go net在这方面已经做得足够好了。
gnet
是一个高性能、轻量级、非阻塞、事件驱动的网络框架,用纯Go编写,在传输层上使用TCP/UDP协议和Unix域套接字。它使开发者能够在gnet
之上实现自己的应用层协议(HTTP、RPC、WebSocket、Redis等),以构建多样化的网络服务。例如,如果您在gnet
上实现HTTP协议,您就得到了一个HTTP服务器;如果在gnet
上实现Redis协议,您就得到了一个Redis服务器,以此类推。
gnet
源自项目evio
,但具有更高的性能和更多功能。
🚀 特性
🦖 里程碑
- 基于多线程/goroutine网络模型的高性能事件驱动循环
- 内置由ants库驱动的goroutine池
- 整个运行时无锁
- 简洁易用的API
- 高效、可重用和弹性的内存缓冲区:(弹性)环形缓冲区、链表缓冲区和弹性混合缓冲区
- 多种协议/IPC机制:
TCP
、UDP
和Unix域套接字
- 多种负载均衡算法:
轮询
、源地址哈希
和最少连接
- 灵活的定时器事件
-
gnet
客户端 - 可在
Linux
、macOS
、Windows
和*BSD系统上运行:Darwin
/DragonFlyBSD
/FreeBSD
/NetBSD
/OpenBSD
- 支持边缘触发I/O
- 多网络地址绑定
🕊 路线图
- TLS支持
- io_uring支持
- KCP支持
Windows版本的gnet
仅应用于开发和测试,不应在生产环境中使用。
🎬 入门指南
gnet
可作为Go模块使用,我们强烈建议通过Go Modules使用gnet
。在启用了Go 1.11 Modules的情况下(Go 1.11+),您只需在代码中添加import "github.com/panjf2000/gnet/v2"
并运行go mod download/go mod tidy
或go [build|run|test]
即可自动下载所需依赖项。
使用v2版本
go get -u github.com/panjf2000/gnet/v2
使用v1版本
go get -u github.com/panjf2000/gnet
🎡 使用案例
以下公司/组织在生产环境中使用gnet
作为底层网络服务。
如果您也在生产环境中使用gnet
,请通过提交pull request帮助我们丰富这个列表。
📊 性能
TechEmpower上的基准测试
# 硬件环境
* 28核超线程Intel(R) Xeon(R) Gold 5120 CPU @ 3.20GHz
* 32GB RAM
* 专用思科10千兆以太网交换机
* Debian 12 "bookworm"
* Go1.19.x linux/amd64
这是全球涵盖各种编程语言的486个框架中前50名的排行榜,其中gnet
排名第一。
这是Go框架的完整排名,gnet
超越了所有其他框架,使其成为Go中最快的网络框架。
要查看完整的排名列表,请访问TechEmpower基准测试第22轮。
请注意,gnet在TechEmpower上的HTTP实现是半成品,仅为基准测试目的进行了微调,远未达到生产就绪状态。
与类似网络库的对比
在Linux上(epoll)
测试环境
# 机器信息
操作系统 : Ubuntu 20.04/x86_64
CPU : 8 CPU核心, AMD EPYC 7K62 48核处理器
内存 : 16.0 GiB
# Go版本和设置
Go 版本 : go1.17.2 linux/amd64
GOMAXPROCS : 8
# 基准测试参数
TCP连接数 : 1000/2000/5000/10000
数据包大小 : 512/1024/2048/4096/8192/16384/32768/65536 字节
测试时长 : 15秒
回显基准测试
在MacOS上(kqueue)
测试环境
# 机器信息
操作系统 : MacOS Big Sur/x86_64
CPU : 6 CPU核心, Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
内存 : 16.0 GiB
# Go版本和设置
Go 版本 : go1.16.5 darwin/amd64
GOMAXPROCS : 12
# 基准测试参数
TCP连接数 : 300/400/500/600/700
数据包大小 : 512/1024/2048/4096/8192 字节
测试时长 : 15秒
回显基准测试
⚠️ 许可证
gnet
的源代码应该在Apache-2.0许可下分发。
👏 贡献者
在开启PR之前请阅读贡献指南,感谢所有已经为gnet
做出贡献的开发者!
⚓ 相关文章
- 百万WebSocket连接和Go
- 无限延伸,Go处理100万WebSocket连接
- Go netpoller 原生网络模型之源码全面揭秘
- gnet: 一个轻量级且高性能的 Golang 网络库
- 最快的 Go 网络框架 gnet 来啦!
💰 支持者
通过每月捐赠来支持我们,帮助我们继续我们的活动。
💎 赞助商
成为铜牌赞助商,每月捐赠10美元,您的logo将出现在我们GitHub的README上。
☕️ 请我喝杯咖啡
当您通过以下方式捐赠时,请务必留下您的姓名、GitHub账号或其他社交媒体账号,以便我将其添加到捐赠者名单中,以表示我的感谢。
💴 赞助人
🔑 JetBrains 开源许可证
gnet
一直使用 JetBrains s.r.o. 授予的免费 JetBrains 开源许可证在 GoLand
IDE 下开发,因此我想在此表示感谢。
🔋 赞助