7ed203a89d51c5778165c6983e8b2850.png

项目主页

https://github.com/panjf2000/gnet

欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦。

简介

gnet

这个项目存在的价值是提供一个在网络包处理方面能和 Redis[6]、Haproxy[7] 这两个项目具有相近性能的Go 语言网络服务器框架。

gnetgnetgnet
gnetevio

功能

•高性能[8] 的基于多线程模型的 Event-Loop 事件驱动•内置 Round-Robin 轮询负载均衡算法•简洁的 APIs•基于 Ring-Buffer 的高效内存利用•支持多种网络协议:TCP、UDP、Unix Sockets•支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue•支持异步写操作•允许多个网络监听地址绑定在一个 Event-Loop 上•灵活的事件定时器•SO_REUSEPORT 端口重用

核心设计

多线程模型

gnetnetty

7bd80b66b6ef75b708f33ddd6dab9fe5.png

它的运行流程如下面的时序图:

66fdae3a53a3d9cdccad41505f981932.png

gnet

b939709cb603f27125046a2896f805f8.png

它的运行流程如下面的时序图:

740b3245e697b91ff5dd2cd1afcd1477.png

通信机制

gnetgnetgnet

所以我最终选择了 go-disruptor[9]:高性能消息分发队列 LMAX Disruptor 的 Golang 实现。

自动扩容的 Ring-Buffer

gnet

f597f7ab317c1bd00ae6cdb54d85bb56.gif

开始使用

安装

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

使用示例

// ======================== Echo Server implemented with gnet ===========================

I/O 事件

gnet
OnInitCompleteOnOpenedOnClosedOnDetachedReactTickPreWrite

性能测试

Linux (epoll)

系统参数

Go Version: go1.12.9 linux/amd64OS:         Ubuntu 18.04CPU:        8 Virtual CPUsMemory:     16.0 GiB

Echo Server

ca5469e41e91fe48b8efea349c052e14.png

HTTP Server

a2c610083d80f7f3a1f2fc39a9c1f465.png

FreeBSD (kqueue)

系统参数

Go Version: go version go1.12.9 darwin/amd64OS:         macOS Mojave 10.14.6CPU:        4 CPUsMemory:     8.0 GiB

Echo Server

1fe54f92485cd9c5cc3d19158cadcd46.png

HTTP Server

189887df3ff00d3c7ab1c3ce2737155e.png

证书

gnet

待做事项

gnet 还在持续开发的过程中,所以这个仓库的代码和文档会一直持续更新,如果你对 gnet 感兴趣的话,欢迎给这个开源库贡献你的代码~~

References

[1][2][3][4][5][6][7][8][9][10]