<p align="center">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/d284ad15-1df4-4384-a298-435ddec724ff.png" alt="gnet" />
<br />
<a title="构建状态" target="_blank" href="https://github.com/panjf2000/gnet/actions?query=workflow%3ATests"><img src="https://img.shields.io/github/actions/workflow/status/panjf2000/gnet/test.yml?branch=dev&style=flat-square&logo=github-actions" /></a>
<a title="代码覆盖率" target="_blank" href="https://codecov.io/gh/panjf2000/gnet"><img src="https://img.shields.io/codecov/c/github/panjf2000/gnet?style=flat-square&logo=codecov" /></a>
<a title="支持平台" target="_blank" href="https://github.com/panjf2000/gnet"><img src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20*BSD%20%7C%20Windows-549688?style=flat-square&logo=launchpad" /></a>
<a title="要求Go版本" target="_blank" href="https://github.com/panjf2000/gnet"><img src="https://img.shields.io/badge/go-%3E%3D1.17-30dff3?style=flat-square&logo=go" /></a>
<br />
<a title="Go报告卡" target="_blank" href="https://goreportcard.com/report/github.com/panjf2000/gnet"><img src="https://goreportcard.com/badge/github.com/panjf2000/gnet?style=flat-square" /></a>
<a title="gnet文档" target="_blank" href="https://pkg.go.dev/github.com/panjf2000/gnet/v2#section-documentation"><img src="https://img.shields.io/badge/go.dev-doc-007d9c?style=flat-square&logo=read-the-docs" /></a>
<a title="在Awesome Go中提及" target="_blank" href="https://github.com/avelino/awesome-go#networking"><img src="https://yellow-cdn.veclightyear.com/835a84d5/b8288ea9-20e5-4219-939a-01e0c4d809b7.svg" /></a>
<a title="发布" target="_blank" href="https://github.com/panjf2000/gnet/releases"><img src="https://yellow-cdn.veclightyear.com/835a84d5/d61be4a1-6708-436a-879b-32320ce4ae43.svg?color=161823&style=flat-square&logo=smartthings" /></a>
<a title="标签" target="_blank" href="https://github.com/panjf2000/gnet/tags"><img src="https://img.shields.io/github/v/tag/panjf2000/gnet?color=%23ff8936&logo=fitbit&style=flat-square" /></a>
</p>
English | 中文
📖 简介
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,但具有更高的性能和更多功能。
🚀 特性
🦖 里程碑
🕊 路线图
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作为底层网络服务。
<table>
<tbody>
<tr>
<td align="center" valign="middle">
<a href="https://www.tencent.com/">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/ee0b3019-65b4-4fe7-8b90-eee08134592b.png" width="200" />
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.tencentgames.com/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/b7dc7566-bbde-40c0-970c-d851f9105a25.jpeg" width="200" />
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.iqiyi.com/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/5c9e4ee8-9c1e-4f3b-b974-a412dc2bf952.png" width="200" />
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.mi.com/global/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/581b01a5-e77b-4b1b-ad22-222da45b6237.png" width="200" />
</a>
</td>
</tr>
<tr>
<td align="center" valign="middle">
<a href="https://www.360.com/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/e28d0c48-a26f-45e4-a889-2aead8c3501a.png" width="200" />
</a>
</td>
<td align="center" valign="middle">
<a href="https://tieba.baidu.com/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/ea28369d-4832-4f8f-8c6d-8f6b30095d59.png" width="200" />
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.jd.com/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/a78e1328-2455-478a-8657-dc9f11b4e827.png" width="200" />
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.zuoyebang.com/" target="_blank">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/d857856c-fa0a-4678-933b-d6a09416c46d.jpeg" width="200" />
</a>
</td>
</tr>
</tbody>
</table>
如果您也在生产环境中使用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做出贡献的开发者!
<a href="https://github.com/panjf2000/gnet/graphs/contributors">
<img src="https://contrib.rocks/image?repo=panjf2000/gnet" />
</a>
⚓ 相关文章
💰 支持者
通过每月捐赠来支持我们,帮助我们继续我们的活动。
<a href="https://opencollective.com/gnet#backers" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/e91d9b56-e3a1-4ac9-a55d-08776195d346.svg"></a>
💎 赞助商
成为铜牌赞助商,每月捐赠10美元,您的logo将出现在我们GitHub的README上。
<a href="https://opencollective.com/gnet#sponsors" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/237eaa56-28f9-4511-a2ac-177c0b24cd27.svg"></a>
☕️ 请我喝杯咖啡
当您通过以下方式捐赠时,请务必留下您的姓名、GitHub账号或其他社交媒体账号,以便我将其添加到捐赠者名单中,以表示我的感谢。
<img src="https://yellow-cdn.veclightyear.com/835a84d5/b110eee5-3094-4cf6-94e3-9db316deddfb.JPG" width="250" align="middle"/>
<img src="https://yellow-cdn.veclightyear.com/835a84d5/92588542-cd06-4834-a8d1-84b732bbdcd1.JPG" width="250" align="middle"/>
<a href="https://www.paypal.me/R136a1X" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/dc3b0d43-df12-4473-9f94-83def1a95fd3.JPG" width="250" align="middle"/></a>
💴 赞助人
<table>
<tbody>
<tr>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/patrick-othmer">
<img src="https://avatars1.githubusercontent.com/u/8964313" width="100" alt="Patrick Othmer" />
</a>
</td>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/panjf2000/ants">
<img src="https://avatars2.githubusercontent.com/u/50285334" width="100" alt="Jimmy" />
</a>
</td>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/cafra">
<img src="https://avatars0.githubusercontent.com/u/13758306" width="100" alt="ChenZhen" />
</a>
</td>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/yangwenmai">
<img src="https://avatars0.githubusercontent.com/u/1710912" width="100" alt="Mai Yang" />
</a>
</td>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/BeijingWks">
<img src="https://avatars3.githubusercontent.com/u/33656339" width="100" alt="王开帅" />
</a>
</td>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/refs">
<img src="https://avatars3.githubusercontent.com/u/6905948" width="100" alt="Unger Alejandro" />
</a>
</td>
<td align="center" valign="middle">
<a target="_blank" href="https://github.com/Wuvist">
<img src="https://avatars.githubusercontent.com/u/657796" width="100" alt="Weng Wei" />
</a>
</td>
</tr>
</tbody>
</table>
🔑 JetBrains 开源许可证
gnet 一直使用 JetBrains s.r.o. 授予的免费 JetBrains 开源许可证在 GoLand IDE 下开发,因此我想在此表示感谢。
<a href="https://www.jetbrains.com/?from=gnet" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/418a9fd6-57e7-4bef-afca-1af7bad0af26.png" width="250" align="middle"/></a>
🔋 赞助
<p>
<h3>本项目由以下机构支持:</h3>
<a href="https://www.digitalocean.com/"><img src="https://yellow-cdn.veclightyear.com/835a84d5/7b1e108f-b9ef-4cda-bc92-f59de5f4a1e5.svg" width="201px" />
</a>
</p>