image
Github 主页
博客原文
欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦。
简介
gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似于两个开源的网络库:libuv 和 libevent。
这个项目存在的价值是提供一个在网络包处理方面能和 Redis、Haproxy 这两个项目具有相近性能的Go 语言网络服务器框架。
gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix-Socket)网络库,开发者可以使用 gnet 来实现自己的应用层网络协议,从而构建出自己的应用层网络应用:比如在 gnet 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。
gnet 衍生自另一个项目:evio,但是性能更好。
功能
高性能 的基于多线程模型的 Event-Loop 事件驱动
内置 Round-Robin 轮询负载均衡算法
简洁的 APIs
基于 Ring-Buffer 的高效内存利用
支持多种网络协议:TCP、UDP、Unix Sockets
支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
支持异步写操作
允许多个网络监听地址绑定在一个 Event-Loop 上
灵活的事件定时器
SO_REUSEPORT 端口重用
核心设计
多线程/Go程模型
主从多 Reactors 模型
gnet 重新设计开发了一个新内置的多线程/Go程模型:『主从多 Reactors』,这也是 netty 默认的线程模型,下面是这个模型的原理图:
[站外图片上传中...(image-fa8393-1569676539479)]
它的运行流程如下面的时序图:
[站外图片上传中...(image-b373cd-1569676539479)]
主从多 Reactors + 线程/Go程池
你可能会问一个问题:如果我的业务逻辑是阻塞的,那么在 Event.React() 注册方法里的逻辑也会阻塞,从而导致阻塞 event-loop 线程,这时候怎么办?
正如你所知,基于 gnet 编写你的网络服务器有一条最重要的原则:永远不能让你业务逻辑(一般写在 Event.React() 里)阻塞 event-loop 线程,否则的话将