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

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

gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的网络库。

gnet 是衍生自另一个项目:evio,但是性能更好。

Features

高性能 的基于多线程模型的 Event-Loop 事件驱动

内置 Round-Robin 轮询负载均衡算法

简洁的 APIs

基于 Ring-Buffer 的高效内存利用

支持多种网络协议:TCP、UDP、Unix Sockets

支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue

支持异步写操作

允许多个网络监听地址绑定在一个 Event-Loop上

灵活的事件定时器

SO_REUSEPORT 端口重用

核心设计

多线程模型

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

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

现在我正在 gnet 里开发一个新的多线程模型:『带线程/go程的主从 Reactors 多线程』,很快就能完成它,这个模型的架构图如下所示:

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

通信机制

gnet 的『主从 Reactors 多线程』模型是基于 Golang 里的 goroutines的,所以 gnet 里必须要有一个能在 goroutines 之间进行高效率的通信的机制,我没有选择 Golang 里的主流方案:基于 channel 的 CSP 方案而是选择了性能更好的、基于 ring-buffer 的 disruptor 方案。

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

自动扩容的 Ring-Buffer

gnet 利用 ring-buffer 来缓存 TCP 流数据以及管理内存使用。

开始使用

安装

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

使用示例

package main

import (

"flag"

"fmt"

"log"

"strings"

"github.com/panjf2000/gnet"

"github.com/panjf2000/gnet/ringbuffer"

)

func main() {

var port int

var loops int

var udp bool

var trace bool

var reuseport bool

flag.IntVar(&port, "port", 5000, "server port")

flag.BoolVar(&udp, "udp", false, "listen on udp")

flag.BoolVar(&reuseport, "reuseport", false, "reuseport (SO_REUSEPORT)")

flag.BoolVar(&trace, "trace", false, "print packets to console")

flag.IntVar(&loops, "loops", 0, "num loops")

flag.Parse()

var events gnet.Events

events.NumLoops = loops

events.OnInitComplete = func(srv gnet.Server) (action gnet.Action) {

log.Printf("echo server started on port %d (loops: %d)", port, srv.NumLoops)

if reuseport {

log.Printf("reuseport")

}

return

}

events.React = func(c gnet.Conn, inBuf *ringbuffer.RingBuffer) (out []byte, action gnet.Action) {

top, tail := inBuf.PreReadAll()

out = append(top, tail...)

inBuf.Reset()

if trace {

log.Printf("%s", strings.TrimSpace(string(top)+string(tail)))

}

return

}

scheme := "tcp"

if udp {

scheme = "udp"

}

log.Fatal(gnet.Serve(events, fmt.Sprintf("%s://:%d", scheme, port)))

}

I/O 事件

gnet 目前支持的 I/O 事件如下:

OnInitComplete 当 server 初始化完成之后调用。

OnOpened 当连接被打开的时候调用。

OnClosed 当连接被关闭的时候调用。

OnDetached 当主动摘除连接的时候的调用。

React 当 server 端接收到从 client 端发送来的数据的时候调用。(你的核心业务代码一般是写在这个方法里)

Tick 服务器启动的时候会调用一次,之后就以给定的时间间隔定时调用一次,是一个定时器方法。

PreWrite 预先写数据方法,在 server 端写数据回 client 端之前调用。

性能测试

Linux (epoll)

系统参数

Go Version: go1.12.9 linux/amd64

OS: Ubuntu 18.04

CPU: 8 Virtual CPUs

Memory: 16.0 GiB

Echo Server

HTTP Server

FreeBSD (kqueue)

系统参数

Go Version: go version go1.12.9 darwin/amd64

OS: macOS Mojave 10.14.6

CPU: 4 CPUs

Memory: 8.0 GiB

Echo Server

HTTP Server

证书

gnet 的源码允许用户在遵循 MIT 开源证书 规则的前提下使用。

待做事项

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

linux 高性能网络库,推荐一个轻量级且高性能的 Go 网络库:gnet相关推荐

  1. 服务器系统goha,推荐一个轻量级且高性能的 Golang 网络库:gnet-Go语言中文社区...

    image Github 主页 博客原文 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络 ...

  2. libgo高性能网络服务器,【开源】gnet: 一个轻量级且高性能的 Golang 网络库

    ![](https://ask.qcloudimg.com/http-save/1303222/sipe2g9n9h.png) # Github 主页 [https://github.com/panj ...

  3. 【开源推荐】gnet: 一个轻量级且高性能的 Go 网络库

    Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于事件驱 ...

  4. gnet: 一个轻量级且高性能的 Golang 网络库 置顶!

    https://taohuawu.club/go-event-loop-networking-library-gnet

  5. libgo高性能网络服务器,gnet: 轻量级且高性能的 Golang 网络库

    项目主页 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库.这个库直接使用 epoll ...

  6. gnet: 一个轻量级且高性能的 Go 网络框架

    GitHub 主页 https://github.com/panjf2000/gnet 欢迎大家围观 ~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦.

  7. 极力推荐一个简单好用的C++JSON库

      极力推荐一个简单好用的C++JSON库CJsonObject,让使用json如使用C++原生的结构体那般方便,随心所欲.CJsonObject是个优秀的C++JSON库,也许会是你见过的最为简单易 ...

  8. 发布一个基于 Reactor 模式的 C++ 网络库

    发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...

  9. linux 开源网卡驱动,【开源】gnet: 一个轻量级且高性能、基于事件驱动的 Go 网络库...

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

最新文章

  1. Python MyQR
  2. 浅谈电量传感器在数据中心不间断电源中的应用
  3. 设置隐藏文件的显示与隐藏方法
  4. ASP.NET MVC 实现二级域名(泛域名)
  5. 宝藏新品牌成长白皮书:新品牌心智与营销增长方法论
  6. python qt gui与数据可视化编程 pdf_《Python Qt GUI与数据可视化编程》第13章
  7. Makefile:GCC CFLAGS变量和LDFLAGS变量
  8. 登录验证和EasyUI的初识
  9. PhantomJS+Selenium+Scrapy抓取巨潮资讯网企业信息
  10. 云原生 Kubernetes 分布式存储平台 Longhorn 中文入门教程
  11. mysql时间函数之hour,minute,second用法_前进的火车_新浪博客
  12. 淘宝能承受几百上亿的访问点击,而铁道部的网站为啥分分钟崩溃?
  13. 【934. 最短的桥】
  14. sendToTarget与sendMessage
  15. docker 命令详解(二十四):push
  16. mysql入库出库触发器_入库出库后库存自动更新的SQL触发器语句是什么?
  17. Linux系列文章 —— vim的基本操作(误入vim退出请先按「ESC」再按:q不保存退出,相关操作请阅读本文)
  18. 【自学Python】Python特点
  19. 联想zuk z2刷recovery教程(Fastboot一键线刷)
  20. 摘录与评论·《致我们终将逝去的青春》

热门文章

  1. 千呼万唤始出来 Azure Stack终落地
  2. 三相电机如何判断好坏
  3. Docker的物理隔离方式及网络桥接模式
  4. VMware vSphere 5.1 学习系列之七:虚拟机管理
  5. 2018/03/27
  6. Busybox 命令大全~~
  7. 机器学习岗面试题目汇总「持续更新」
  8. Google Chrome动了我的奶酪?
  9. 闭包为什么会造成内存泄漏?
  10. 80老翁谈人生(213):互联网内容搜搜发展简史