# gnet **Repository Path**: unsafe-rust/gnet ## Basic Information - **Project Name**: gnet - **Description**: 超过 net 的 第三方库(镜像版) - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-07 - **Last Updated**: 2021-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

gnet

[英文](README.md) | 🇨🇳中文 # 📖 简介 `gnet` 是一个基于事件驱动的高性能和轻量级网络框架。它直接使用 [epoll](https://en.wikipedia.org/wiki/Epoll) 和 [kqueue](https://en.wikipedia.org/wiki/Kqueue) 系统调用而非标准 Go 网络包:[net](https://golang.org/pkg/net/) 来构建网络应用,它的工作原理类似两个开源的网络库:[netty](https://github.com/netty/netty) 和 [libuv](https://github.com/libuv/libuv),这也使得 `gnet` 达到了一个远超 Go [net](https://golang.org/pkg/net/) 的性能表现。 `gnet` 设计开发的初衷不是为了取代 Go 的标准网络库:[net](https://golang.org/pkg/net/),而是为了创造出一个类似于 [Redis](http://redis.io)、[Haproxy](http://www.haproxy.org) 能高效处理网络包的 Go 语言网络服务器框架。 `gnet` 的卖点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix Domain Socket)网络框架,开发者可以使用 `gnet` 来实现自己的应用层网络协议(HTTP、RPC、Redis、WebSocket 等等),从而构建出自己的应用层网络应用:比如在 `gnet` 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。 **`gnet` 衍生自另一个项目:`evio`,但拥有更丰富的功能特性,且性能远胜之。** # 🚀 功能 - [x] [高性能](#-性能测试) 的基于多线程/Go程网络模型的 event-loop 事件驱动 - [x] 内置 goroutine 池,由开源库 [ants](https://github.com/panjf2000/ants) 提供支持 - [x] 内置 bytes 内存池,由开源库 [bytebufferpool](https://github.com/valyala/bytebufferpool) 提供支持 - [x] 整个生命周期是无锁的 - [x] 简单易用的 APIs - [x] 高效、可重用而且自动伸缩的环形内存 buffer - [x] 支持多种网络协议/IPC 机制:`TCP`、`UDP` 和 `Unix Domain Socket` - [x] 支持多种负载均衡算法:`Round-Robin(轮询)`、`Source-Addr-Hash(源地址哈希)` 和 `Least-Connections(最少连接数)` - [x] 支持两种事件驱动机制:**Linux** 里的 `epoll` 以及 **FreeBSD/DragonFly/Darwin** 里的 `kqueue` - [x] 支持异步写操作 - [x] 灵活的事件定时器 - [x] SO_REUSEPORT 端口重用 - [x] 内置多种编解码器,支持对 TCP 数据流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,参考自 [netty codec](https://netty.io/4.1/api/io/netty/handler/codec/package-summary.html),而且支持自定制编解码器 - [x] 支持 Windows 平台,基于 ~~IOCP 事件驱动机制~~ Go 标准网络库 - [ ] 实现 `gnet` 客户端 # 📊 性能测试 ## TechEmpower 性能测试 ```powershell # 硬件环境 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 ``` ![All language](https://raw.githubusercontent.com/panjf2000/illustrations/master/benchmark/techempower-all.jpg) 这是包含全部编程语言框架的性能排名***前 50*** 的结果,总榜单包含了全世界共计 ***422 个框架***,其中 `gnet` 排名***第二***。 ![Golang](https://raw.githubusercontent.com/panjf2000/illustrations/master/benchmark/techempower-go.png) 这是 Go 语言分类下的全部排名,`gnet` 超越了其他所有框架,位列第一,是***最快***的 Go 网络框架。 完整的排行可以通过 [TechEmpower Plaintext Benchmark](https://www.techempower.com/benchmarks/#section=test&runid=53c6220a-e110-466c-a333-2e879fea21ad&hw=ph&test=plaintext) 查看。 ## 同类型的网络库性能对比 ## Linux (epoll) ### 系统参数 ```powershell # Machine information OS : Ubuntu 20.04/x86_64 CPU : 8 processors, AMD EPYC 7K62 48-Core Processor Memory : 16.0 GiB # Go version and settings Go Version : go1.15.7 linux/amd64 GOMAXPROCS : 8 # Netwokr settings TCP connections : 300 Test duration : 30s ``` #### Echo Server ![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/echo_linux.png) #### HTTP Server ![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/http_linux.png) ## FreeBSD (kqueue) ### 系统参数 ```powershell # Machine information OS : macOS Catalina 10.15.7/x86_64 CPU : 6-Core Intel Core i7 Memory : 16.0 GiB # Go version and configurations Go Version : go1.15.7 darwin/amd64 GOMAXPROCS : 12 # Netwokr settings TCP connections : 100 Test duration : 20s ``` #### Echo Server ![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/echo_mac.png) #### HTTP Server ![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/http_mac.png) # 🏛 官网 关于 `gnet` 的架构设计、使用方法以及其他更多的信息和细节,请访问[官网](https://gnet.host/blog/presenting-gnet-cn/)。 # ⚠️ 证书 `gnet` 的源码允许用户在遵循 [MIT 开源证书](/LICENSE) 规则的前提下使用。 # 👏 贡献者 请在提 PR 之前仔细阅读 [Contributing Guidelines](CONTRIBUTING.md),感谢那些为 `gnet` 贡献过代码的开发者! [![](https://opencollective.com/gnet/contributors.svg?width=890&button=false)](https://github.com/panjf2000/gnet/graphs/contributors) # ⚓ 相关文章 - [A Million WebSockets and Go](https://www.freecodecamp.org/news/million-websockets-and-go-cc58418460bb/) - [Going Infinite, handling 1M websockets connections in Go](https://speakerdeck.com/eranyanay/going-infinite-handling-1m-websockets-connections-in-go) - [Go netpoller 原生网络模型之源码全面揭秘](https://strikefreedom.top/go-netpoll-io-multiplexing-reactor) - [gnet: 一个轻量级且高性能的 Golang 网络库](https://strikefreedom.top/go-event-loop-networking-library-gnet) - [最快的 Go 网络框架 gnet 来啦!](https://strikefreedom.top/releasing-gnet-v1-with-techempower) - [字节跳动在 Go 网络库上的实践](https://strikefreedom.top/bytedance-network-library-practices) # 🎡 用户案例 以下公司/组织在生产环境上使用了 `gnet` 作为底层网络服务。          如果你的项目也在使用 `gnet`,欢迎给我提 Pull Request 来更新这份用户案例列表。 # 💰 支持 如果有意向,可以通过每个月定量的少许捐赠来支持这个项目。 # 💎 赞助 每月定量捐赠 10 刀即可成为本项目的赞助者,届时您的 logo 或者 link 可以展示在本项目的 README 上。 # ☕️ 打赏 > 当您通过以下方式进行捐赠时,请务必留下姓名、Github账号或其他社交媒体账号,以便我将其添加到捐赠者名单中,以表谢意。          # 💴 捐赠者名单 Patrick Othmer Jimmy ChenZhen Mai Yang 王开帅 Unger Alejandro # 💵 付费支持

如果你需要一个深度定制的 `gnet` 版本且想要作者协助开发、或者是需要花费时间精力的 bug 修复/快速方案/咨询等,可以到[这里](https://xscode.com/panjf2000/gnet)申请付费支持。 # 🔑 JetBrains 开源证书支持 `gnet` 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 **free JetBrains Open Source license(s)** 正版免费授权,在此表达我的谢意。 # 🔋 赞助商

本项目由以下机构赞助: