当前位置: 首页 > 软件库 > 程序开发 > 网络工具包 >

gnet

高性能和轻量级网络库
授权协议 MIT
开发语言 Google Go
所属分类 程序开发、 网络工具包
软件类型 开源软件
地区 国产
投 递 者 凌和悦
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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

 

相关文章

 

  • go: downloading github.com/panjf2000/gnet v1.2.3 go get github.com/panjf2000/gnet: github.com/panjf2000/gnet@v1.2.3: verifying module: checksum mismatch         downloaded: h1:maJme8lnr4+S0BpEinvNVCcg

  • 个人简介:李响Superb,CSDN百万访问量博主,普普通通男大学生,目前在读软件工程,计算机视觉、深度学习和医学图像处理专攻,偶尔也搞迁移学习和全栈开发。 博客地址:lixiang.blog.csdn.net 1 前言 本文基于GNet架构完成了视网膜视杯视盘提取任务,基于Keras框架更简单的实现分割,网络、工具类、训练和预测的代码一目了然,环境为Google Colab Pro,代码和数据集

  • .gnet标准 1  预祝 .gnet进军w3c!!!成为html5的标准 2  .gnet在进行压缩的时候。图片信息不会丢失 3 .gnet须要csdn、百度搜索、360、腾讯、新浪微博、各种视频软件的支持。。! 4 尽管我是一个唯物主义者,但还是希望有神。由于有神的话,那么就有成为神的可能! 5 大家都来评论。不要骂人。!! posted on 2017-08-04 11:07 mthouta

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

  • 本人希望csdn可以定义一种新的图片格式,因为csdn一直是互联网中坚力量 本人发现,传统的图片格式已经不适应互联网时代了!!!,故本人发起定义一种新的图片格式,后缀名为 .gnet 互联网上的图片大多有这几种来源,微博上传,视频截图,网络编辑人上传等,以目前的技术,这些图片是不可以被搜索引擎搜索的 大大阻碍了互联网的进一步整合,所以本人定义一种新的图片格式,这种图片格式含有一个储存信息的数据结构

 相关资料
  • 注意:本章属于 Docker 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习 Docker Compose 一节。 本章将介绍 Docker 的一些高级网络配置和选项。 当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。 同时,Docker 随机分配一个本地未

  • 1、快速配置指南 下面是一个跟 Docker 网络相关的命令列表。 其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。 -b BRIDGE or –bridge=BRIDGE –指定容器挂载的网桥 –bip=CIDR –定制 docker0 的掩码 -H SOCKET… or –host=SOCKET… –Docker 服务端接收命令的通道 –icc=true|fal

  • 高级网络配置 当docker启动时,它会在宿主机器上创建一个名为docker0的虚拟网络接口。它会从RFC 1918定义的私有地址中随机选择一个主机不用的地址和子网掩码,并将它分配给docker0。 例如我启动docker几分钟后它选择了172.17.42.1/16-一个16位的子网掩码为主机和它的容器提供了65,534个ip地址。 注意: 本文讨论了Docker的高级网络配置和选项。通常你不会用

  • 本章将就一系列与网络有关的高级话题进行讨论。 读完这章,您将了解: 关于网关和路由的基础知识。 如何配置 IEEE® 802.11 和 Bluetooth® 设备。 如何用 FreeBSD 做网桥。 如何为无盘机上配置网络启动。 如何配置从网络 PXE 启动一个 NFS 根文件系统。 如何配置网络地址转换 (NAT)。 如何使用 PLIP 连接两台计算机。 如何在运行 FreeBSD 的计算机上配

  • 准备 测试环境 在以下几种环境下进行测试: Kubernetes集群node节点上通过Cluster IP方式访问 Kubernetes集群内部通过service访问 Kubernetes集群外部通过traefik ingress暴露的地址访问 测试地址 Cluster IP: 10.254.149.31 Service Port:8000 Ingress Host:traefik.sample-

  • 我正在研究一个基于代理的流行病模型。这个想法是单个代理根据他们在网络中观察到的情况(基于距离)做出决定。我在每个代理中都有几个功能,可以动态更新受感染接触者的数量,接触者表现出特定行为等。 下面的代码用于计算代理网络中受感染的联系人。 至少还有3个这样的函数可以保持表示代理网络中其他功能的其他代理的计数。现在,当我 有没有一种计算效率更高的方法来跟踪更大人口的网络统计数据?