gnet 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
gnet 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
gnet 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
gnet 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
gnet 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

gnet 是一个基于事件驱动的高性能和轻量级网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv

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

gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix-Socket)网络框架,开发者可以使用 gnet 来实现自己的应用层网络协议(HTTP、RPC、Redis、WebSocket 等等),从而构建出自己的应用层网络应用:比如在 gnet 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。

gnet 衍生自另一个项目:evio,但性能远胜之。

功能

  •  高性能 的基于多线程/Go程网络模型的 event-loop 事件驱动
  •  内置 Round-Robin 轮询负载均衡算法
  •  内置 goroutine 池,由开源库 ants 提供支持
  •  内置 bytes 内存池,由开源库 pool 提供支持
  •  简洁的 APIs
  •  基于 Ring-Buffer 的高效内存利用
  •  支持多种网络协议:TCP、UDP、Unix Sockets
  •  支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
  •  支持异步写操作
  •  灵活的事件定时器
  •  SO_REUSEPORT 端口重用
  •  内置多种编解码器,支持对 TCP 数据流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,参考自 netty codec,而且支持自定制编解码器
  •  支持 Windows 平台,基于 IOCP 事件驱动机制 Go 标准网络库
  •  加入更多的负载均衡算法:随机、最少连接、一致性哈希等等
  •  支持 TLS
  •  实现 gnet 客户端

核心设计

多线程/Go程网络模型

主从多 Reactors

gnet 重新设计开发了一个新内置的多线程/Go程网络模型:『主从多 Reactors』,这也是 netty 默认的多线程网络模型,下面是这个模型的原理图:

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

主从多 Reactors + 线程/Go程池

你可能会问一个问题:如果我的业务逻辑是阻塞的,那么在 EventHandler.React 注册方法里的逻辑也会阻塞,从而导致阻塞 event-loop 线程,这时候怎么办?

正如你所知,基于 gnet 编写你的网络服务器有一条最重要的原则:永远不能让你业务逻辑(一般写在 EventHandler.React 里)阻塞 event-loop 线程,否则的话将会极大地降低服务器的吞吐量,这也是 netty 的一条最重要的原则。

我的回答是,基于gnet 的另一种多线程/Go程网络模型:『带线程/Go程池的主从多 Reactors』可以解决阻塞问题,这个新网络模型通过引入一个 worker pool 来解决业务逻辑阻塞的问题:它会在启动的时候初始化一个 worker pool,然后在把 EventHandler.React里面的阻塞代码放到 worker pool 里执行,从而避免阻塞 event-loop 线程,

模型的架构图如下所示:

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

gnet 通过利用 ants goroutine 池(一个基于 Go 开发的高性能的 goroutine 池 ,实现了对大规模 goroutines 的调度管理、goroutines 复用)来实现『主从多 Reactors + 线程/Go程池』网络模型。关于 ants 的全部功能和使用,可以在 ants 文档 里找到。

gnet 内部集成了 ants 以及提供了 pool.NewWorkerPool 方法来初始化一个 ants goroutine 池,然后你可以把 EventHandler.React 中阻塞的业务逻辑提交到 goroutine 池里执行,最后在 goroutine 池里的代码调用 gnet.Conn.AsyncWrite 方法把处理完阻塞逻辑之后得到的输出数据异步写回客户端,这样就可以避免阻塞 event-loop 线程。

有关在 gnet 里使用 ants goroutine 池的细节可以到这里进一步了解。

自动扩容的 Ring-Buffer

gnet 内置了inbound 和 outbound 两个 buffers,基于 Ring-Buffer 原理实现,分别用来缓冲输入输出的网络数据以及管理内存。

对于 TCP 协议的流数据,使用 gnet 不需要业务方为了解析应用层协议而自己维护和管理 buffers,gnet 会替业务方完成缓冲和管理网络数据的任务,降低业务代码的复杂性以及降低开发者的心智负担,使得开发者能够专注于业务逻辑而非一些底层功能。

性能测试

同类型的网络库性能对比

Linux (epoll)

系统参数

# Machine information
        OS : Ubuntu 18.04/x86_64
       CPU : 8 Virtual CPUs
    Memory : 16.0 GiB

# Go version and configurations
Go Version : go1.12.9 linux/amd64
GOMAXPROCS=8

Echo Server

HTTP Server

FreeBSD (kqueue)

系统参数

# Machine information
        OS : macOS Mojave 10.14.6/x86_64
       CPU : 4 CPUs
    Memory : 8.0 GiB

# Go version and configurations
Go Version : go version go1.12.9 darwin/amd64
GOMAXPROCS=4

Echo Server

HTTP Server

 

相关文章

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (12)

加载中
现在可以正式项目用吗
03/12 13:05
回复
举报
copy java to go go在抢java的饭碗
03/11 09:30
回复
举报

引用来自“sunday12345”的评论

golang 使了好大的劲,把程序员从异步的逻辑链中解放了出来,这帮子人又一头扎进去了!
看了你说的,我都笑了。太逗了
01/01 01:30
回复
举报
得需要生态的支撑。
2019/09/25 09:28
回复
举报
2019/09/19 14:17
回复
举报
相当于一个go版本的netty嘛
2019/09/19 10:39
回复
举报
连接池的方案在高性能的场合还是需要的,这个异步也一样,应用场合不同,一般用golang的标准库就不错了,但是连接真的是以百万计数的时候,异步的优势还是大的
2019/09/19 10:15
回复
举报
纠结如此高的性能,那还何苦用Go呢. 百万计链接通常的做法是用C/C++写个高性能前端汇总成一个连接给后端处理,后端就无所谓用什么语言了,用什么网络接口都差不多了.
2019/09/19 10:29
回复
举报
golang 使了好大的劲,把程序员从异步的逻辑链中解放了出来,这帮子人又一头扎进去了!
2019/09/19 09:09
回复
举报
无解决方案 , 地球上有这么多人
2019/09/19 09:20
回复
举报
2019/09/19 11:20
回复
举报
精辟!!一语中的
03/11 15:10
回复
举报
更多评论
暂无内容
2020/04/07 10:25

最快的 Go 网络框架 gnet 来啦!

![](https://raw.githubusercontent.com/panjf2000/logos/master/gnet/logo.png) ## gnet 是什么? `gnet` 是一个基于事件驱动的高性能且轻量级的网络框架。它直接使用 [epoll](https://en.wikipedia.org/wiki/Epoll) 和 [kqueue](https://en.wikipedia.org/wiki/Kqueue) 系统调用而非标准 Golang 网络包:[net](https://golang.org/pkg/net/) 来构建网络应用,它的工作原理类似两个开源的网络库:[netty](https://github.com/...

0
0
发表于服务端专区
2020/04/02 19:27

最快的 Go 网络框架 gnet 来啦!

gnet 是什么? gnet是一个基于事件驱动的高性能且轻量级的网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv。 gnet 设计开发的初衷不是为了取代 Go 的标准网络库:net,而是为了创造出一个类似于 Redis、Haproxy 能高效处理网络包的 Go 语言网络服务器框架。 gnet的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(...

0
0
2019/09/16 23:32

gnet: 轻量级且高性能的 Golang 网络库

项目主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦。 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll[1] 和 kqueue[2] 系统调用而非标准 Golang 网络包:net[3] 来构建网络应用,它的工作原理类似两个开源的网络库:libuv[4] 和 libevent[5]。 这个项目存在的价值是提供一个在网络包处理方面能和 Redis[6]、Haproxy...

0
0
发表于服务端专区
2019/10/08 22:21

【开源】开源一个轻量级且高性能的 Go 网络框架 gnet

![](https://raw.githubusercontent.com/panjf2000/gnet/master/logo.png) `gnet` 是一个基于事件驱动的高性能和轻量级网络框架。它直接使用 [epoll](https://en.wikipedia.org/wiki/Epoll) 和 [kqueue](https://en.wikipedia.org/wiki/Kqueue) 系统调用而非标准 Golang 网络包:[net](https://golang.org/pkg/net/) 来构建网络应用,它的工作原理类似两个开源的网络库:[netty](https://github.com/netty/netty) 和 [libuv](ht...

0
0
发表了博客
2019/09/27 17:34

[开源] gnet: 一个轻量级且高性能的 Golang 网络库

<p align="center"> <img src="https://img.hacpai.com/file/2019/09/logo-6b161908.png" alt="gnet"> <br /> <a title="Build Status" target="_blank" href="https://travis-ci.com/panjf2000/gnet"><img src="https://img.shields.io/travis/com/panjf2000/gnet?style=flat-square"></a> <a title="Codecov" target="_blank" href="https://codecov.io/gh/panjf2000/gnet"><img src="https://img.shields.io/codecov/c/githu...

0
0
2019/10/18 08:29

一周 Go world 新鲜事

No.1 Go有GC就不需要掌握内存堆栈知识了吗?Go 堆栈的理解 堆:堆可以被看成是一棵树,如:堆排序[1]。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。 栈:一种先进后出的数据结构。 这里着重讲的是内存分配中的堆和栈: 栈(操作系统):由操作系统自动分配释...

0
0
2019/09/20 08:30

一周 Go world 新鲜事

No.1 Golang 优雅的错误处理 Golang 的错误处理一直深受诟病,项目里面一半的代码在做错误处理。博主在做 Golang 开发一段时间后,也深有同感,觉得很有必要优化一下,一方面让代码更优雅一些,另一方面也为了形成系统的错误处理方式,而不是随心所欲的来个 errors.new(),或者一直 return err。 原文链接 No.2 【译】如何去做code review Google 前几天公开了一篇谷歌的工程实践文档。而且文档的内容都是跟 code review 相关的...

0
0
发表了博客
2019/07/23 18:34

论文笔记SR——GWAInet & GFRnet

Learning Warped Guidance for Blind Face Restoration & Exemplar Guided Face Image Super-Resolution without Facial Landmarks Introduction 面部图像超分辨Face image super-resolution旨在重建低分辨率(LR)面部图像中的细节。给定一个人的LR面部图像,如果仅仅从单图像LR进行图像SR,得到的SR图像很可能过于平滑且缺少细节,那么可以考虑找到在不同条件不同时间拍摄的同一个人的另一个人脸HR图像,使用该图片来用于SR过...

0
0
发表了博客
2020/11/29 13:03

企业实战项目之服务器用户权限集中管理

企业实战项目之服务器用户权限集中管理 企业实战项目之服务器用户权限集中管理 实际生产环境中可能服务器相当多,随之服务器维护、管理人员也逐渐增多(运维+开发+项目经理+DBA等),因每个人员的操作水平不同,所以从业务角度与服务器安全性来看,一定的权限划分是有必要的,也是实际生产环境中必须要做的,为了解决用户的权限问题,今天来聊一聊服务器用户权限集中管理的解决方案。 前面介绍了相关的用户权限提权管理方法,就...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
12 评论
90 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部