# gnet **Repository Path**: fengg007/gnet ## Basic Information - **Project Name**: gnet - **Description**: gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库 - **Primary Language**: Shell - **License**: Apache-2.0 - **Default Branch**: dev - **Homepage**: https://www.oschina.net/p/gnet - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 22 - **Created**: 2023-07-30 - **Last Updated**: 2023-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
[英文](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` 在功能上的全面性并不如 [net](https://golang.org/pkg/net/),它只提供网络编程中最核心的功能和最精简的 APIs,而且 `gnet` 也并没有打算变成一个全功能、无所不包的网络库,因为我觉得 Go [net](https://golang.org/pkg/net/) 在这方面已经做得足够好了。 `gnet` 的卖点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix Domain Socket)网络框架,开发者可以使用 `gnet` 来实现自己的应用层网络协议(HTTP、RPC、Redis、WebSocket 等等),从而构建出自己的应用层网络应用:比如在 `gnet` 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。 **`gnet` 衍生自另一个项目:`evio`,但拥有更丰富的功能特性,且性能远胜之。** # 🚀 功能 - [x] 基于多线程/协程网络模型的[高性能](#-性能测试)事件驱动循环 - [x] 内置 goroutine 池,由开源库 [ants](https://github.com/panjf2000/ants) 提供支持 - [x] 整个生命周期是无锁的 - [x] 简单易用的 APIs - [x] 高效、可重用而且自动伸缩的内存 buffer:(Elastic-)Ring-Buffer, Linked-List-Buffer and Elastic-Mixed-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] 实现 `gnet` 客户端 - [x] 支持 **Windows** 平台 (仅用于开发环境的兼容性,不要在生产环境中使用) - [ ] 多网络地址绑定 - [ ] 支持 **TLS** - [ ] 支持 [io_uring](https://kernel.dk/io_uring.pdf) # 🎬 开始 `gnet` 是一个 Go module,而且我们也强烈推荐通过 [Go Modules](https://go.dev/blog/using-go-modules) 来使用 `gnet`,在开启 Go Modules 支持(Go 1.11+)之后可以通过简单地在代码中写 `import "github.com/panjf2000/gnet/v2"` 来引入 `gnet`,然后执行 `go mod download/go mod tidy` 或者 `go [build|run|test]` 这些命令来自动下载所依赖的包。 ## 使用 v2 ```bash go get -u github.com/panjf2000/gnet/v2 ``` ## 使用 v1 ```bash go get -u github.com/panjf2000/gnet ``` # 🎡 用户案例 以下公司/组织在生产环境上使用了 `gnet` 作为底层网络服务。
如果你的项目也在使用 `gnet`,欢迎给我提 Pull Request 来更新这份列表。
# 📊 性能测试
## TechEmpower 性能测试
```bash
# 硬件环境
* 28 HT Cores Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz
* 32GB RAM
* Ubuntu 18.04.3 4.15.0-88-generic #88-Ubuntu
* Dedicated Cisco 10-gigabit Ethernet switch
* Go1.19.x linux/amd64
```

这是包含全部编程语言框架的性能排名***前 50*** 的结果,总榜单包含了全世界共计 ***499*** 个框架,其中 `gnet` 排名***第一***。

这是 Go 语言分类下的全部排名,`gnet` 超越了其他所有框架,位列第一,是***最快***的 Go 网络框架。
完整的排行可以通过 [TechEmpower Plaintext Benchmark](https://www.techempower.com/benchmarks/#section=test&runid=a07a7117-f861-49b2-a710-94970c5767d0&test=plaintext) 查看。
## 同类型的网络库性能对比
## On Linux (epoll)
### Test Environment
```bash
# 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
```
#### [Echo benchmark](https://github.com/gnet-io/gnet-benchmarks)


## On MacOS (kqueue)
### Test Environment
```bash
# 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
```
#### [Echo benchmark](https://github.com/gnet-io/gnet-benchmarks)


# ⚠️ 证书
`gnet` 的源码需在遵循 Apache-2.0 开源证书的前提下使用。
# 👏 贡献者
请在提 PR 之前仔细阅读 [Contributing Guidelines](CONTRIBUTING.md),感谢那些为 `gnet` 贡献过代码的开发者!
# 🔋 赞助商