英文 | 中文
gnet
是一个基于事件驱动的高性能和轻量级网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Go 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv,这也使得 gnet
达到了一个远超 Go net 的性能表现。
gnet
设计开发的初衷不是为了取代 Go 的标准网络库:net,而是为了创造出一个类似于 Redis、Haproxy 能高效处理网络包的 Go 语言网络客户端/服务器框架。因此,gnet
在功能上的全面性并不如 net,它只提供网络编程中最核心的功能和最精简的 APIs,而且 gnet
也并没有打算变成一个全功能、无所不包的网络库,因为我觉得 Go net 在这方面已经做得足够好了。
gnet
的卖点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix Domain Socket)网络框架,开发者可以使用 gnet
来实现自己的应用层网络协议(HTTP、RPC、Redis、WebSocket 等等),从而构建出自己的应用层网络应用:比如在 gnet
上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。
gnet
衍生自另一个项目:evio
,但拥有更丰富的功能特性,且性能远胜之。
- 高性能 的基于多线程/Go程网络模型的 event-loop 事件驱动
- 内置 goroutine 池,由开源库 ants 提供支持
- 整个生命周期是无锁的
- 简单易用的 APIs
- 高效、可重用而且自动伸缩的内存 buffer:(Elastic-)Ring-Buffer, Linked-List-Buffer and Elastic-Mixed-Buffer
- 支持多种网络协议/IPC 机制:
TCP
、UDP
和Unix Domain Socket
- 支持多种负载均衡算法:
Round-Robin(轮询)
、Source-Addr-Hash(源地址哈希)
和Least-Connections(最少连接数)
- 支持两种事件驱动机制:Linux 里的
epoll
以及 FreeBSD/DragonFly/Darwin 里的kqueue
- 灵活的事件定时器
- 实现
gnet
客户端
gnet
是一个 Go module,而且我们也强烈推荐通过 Go Modules 来使用 gnet
,在开启 Go Modules 支持(Go 1.11+)之后可以通过简单地在代码中写 import "github.com/panjf2000/gnet"
来引入 gnet
,然后执行 go mod download/go mod tidy
或者 go [build|run|test]
这些命令来自动下载所依赖的包。
go get -u github.com/panjf2000/gnet/v2
go get -u github.com/panjf2000/gnet
以下公司/组织在生产环境上使用了 gnet
作为底层网络服务。
如果你的项目也在使用 gnet
,欢迎给我提 Pull Request 来更新这份列表。
# 硬件环境
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
这是包含全部编程语言框架的性能排名前 50 的结果,总榜单包含了全世界共计 422 个框架,其中 gnet
排名第二。
这是 Go 语言分类下的全部排名,gnet
超越了其他所有框架,位列第一,是最快的 Go 网络框架。
完整的排行可以通过 TechEmpower Plaintext Benchmark 查看。
# Machine information
OS : Ubuntu 20.04/x86_64
CPU : 8 CPU cores, AMD EPYC 7K62 48-Core Processor
Memory : 16.0 GiB
# Go version and settings
Go Version : go1.17.2 linux/amd64
GOMAXPROCS : 8
# Benchmark parameters
TCP connections : 1000/2000/5000/10000
Packet size : 512/1024/2048/4096/8192/16384/32768/65536 bytes
Test duration : 15s
# Machine information
OS : MacOS Big Sur/x86_64
CPU : 6 CPU cores, Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Memory : 16.0 GiB
# Go version and settings
Go Version : go1.16.5 darwin/amd64
GOMAXPROCS : 12
# Benchmark parameters
TCP connections : 300/400/500/600/700
Packet size : 512/1024/2048/4096/8192 bytes
Test duration : 15s
gnet
的源码需在遵循 Apache-2.0 开源证书的前提下使用。
请在提 PR 之前仔细阅读 Contributing Guidelines,感谢那些为 gnet
贡献过代码的开发者!
- A Million WebSockets and Go
- Going Infinite, handling 1M websockets connections in Go
- Go netpoller 原生网络模型之源码全面揭秘
- gnet: 一个轻量级且高性能的 Golang 网络库
- 最快的 Go 网络框架 gnet 来啦!
如果有意向,可以通过每个月定量的少许捐赠来支持这个项目。
每月定量捐赠 10 刀即可成为本项目的赞助者,届时您的 logo 或者 link 可以展示在本项目的 README 上。
当您通过以下方式进行捐赠时,请务必留下姓名、Github账号或其他社交媒体账号,以便我将其添加到捐赠者名单中,以表谢意。
gnet
项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 free JetBrains Open Source license(s) 正版免费授权,在此表达我的谢意。