Skip to content

Latest commit

 

History

History
209 lines (140 loc) · 13.1 KB

README_ZH.md

File metadata and controls

209 lines (140 loc) · 13.1 KB

gnet

英文 | 中文

🎉🎉🎉 欢迎加入 gnetDiscord 服务器上的频道.

📖 简介

gnet 是一个基于事件驱动的高性能和轻量级网络框架。这个框架是基于 epollkqueue 从零开发的,而且相比 Go net,它能以更低的内存占用实现更高的性能。

gnetnet 有着不一样的网络编程模式。因此,用 gnet 开发网络应用和用 net 开发区别很大,而且两者之间不可调和。社区里有其他同类的产品像是 libevent, libuv, netty, twisted, tornadognet 的底层工作原理和这些框架非常类似。

gnet 不是为了取代 net 而生的,而是在 Go 生态中为开发者提供一个开发性能敏感的网络服务的替代品。也正因如此,gnet 在功能全面性上比不了 Go 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,但拥有更丰富的功能特性,且性能远胜之。

🚀 功能

  • 基于多线程/协程网络模型的高性能事件驱动循环
  • 内置 goroutine 池,由开源库 ants 提供支持
  • 整个生命周期是无锁的
  • 简单易用的 APIs
  • 高效、可重用而且自动伸缩的内存 buffer:(Elastic-)Ring-Buffer, Linked-List-Buffer and Elastic-Mixed-Buffer
  • 多种网络协议/IPC 机制:TCPUDPUnix Domain Socket
  • 多种负载均衡算法:Round-Robin(轮询)Source-Addr-Hash(源地址哈希)Least-Connections(最少连接数)
  • 两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD/DragonFly/Darwin 里的 kqueue
  • 灵活的事件定时器
  • 实现 gnet 客户端
  • 支持 Windows 平台 (仅用于开发环境的兼容性,不要在生产环境中使用)
  • Edge-triggered I/O 支持
  • 多网络地址绑定
  • TLS 支持
  • io_uring 支持

🎬 开始

gnet 是一个 Go module,而且我们也强烈推荐通过 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

go get -u github.com/panjf2000/gnet/v2

使用 v1

go get -u github.com/panjf2000/gnet

🎡 用户案例

以下公司/组织在生产环境上使用了 gnet 作为底层网络服务。

          

如果你的项目也在使用 gnet,欢迎给我提 Pull Request 来更新这份列表。

📊 性能测试

TechEmpower 性能测试

# 硬件环境
* 28 HT Cores Intel(R) Xeon(R) Gold 5120 CPU @ 3.20GHz
* 32GB RAM
* Dedicated Cisco 10-gigabit Ethernet switch
* Debian 12 "bookworm"
* Go1.19.x linux/amd64

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

这是 Go 语言分类下的全部排名,gnet 超越了其他所有框架,位列第一,是最快的 Go 网络框架。

完整的排行可以通过 TechEmpower Benchmark Round 22 查看。

请注意,TechEmpower 上的 gnet 的 HTTP 实现是不完备且针对性调优的,仅仅是用于压测目的,不是生产可用的

同类型的网络库性能对比

On Linux (epoll)

Test Environment

# 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

On MacOS (kqueue)

Test Environment

# 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 贡献过代码的开发者!

⚓ 相关文章

💰 支持

如果有意向,可以通过每个月定量的少许捐赠来支持这个项目。

💎 赞助

每月定量捐赠 10 刀即可成为本项目的赞助者,届时您的 logo 或者 link 可以展示在本项目的 README 上。

☕️ 打赏

当您通过以下方式进行捐赠时,请务必留下姓名、GitHub 账号或其他社交媒体账号,以便我将其添加到捐赠者名单中,以表谢意。

        

💴 资助者

Patrick Othmer Jimmy ChenZhen Mai Yang 王开帅 Unger Alejandro Swaggadan Weng Wei

🔑 JetBrains 开源证书支持

gnet 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 free JetBrains Open Source license(s) 正版免费授权,在此表达我的谢意。

🔋 赞助商

本项目由以下机构赞助: