[开源] gev (????支持 websocket 啦): Go 实现基于 Reactor 模式的非阻塞网络库

Allenxuxu · · 932 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

https://github.com/Allenxuxu/gev [gev](https://github.com/Allenxuxu/gev) 是一个轻量、快速、高性能的基于 Reactor 模式的非阻塞网络库,底层并不使用 golang net 库,而是使用 epoll 和 kqueue。 现在它支持 WebSocket 啦! 支持定时任务,延时任务! ⬇️⬇️⬇️ ## 特点 - 基于 epoll 和 kqueue 实现的高性能事件循环 - 支持多核多线程 - 动态扩容 Ring Buffer 实现的读写缓冲区 - 异步读写 - SO_REUSEPORT 端口重用支持 - 支持 WebSocket - 支持定时任务,延时任务 ## 性能测试 > 测试环境 Ubuntu18.04 - gev - gnet - eviop - evio - net (标准库) ### 吞吐量测试 ![null](https://raw.githubusercontent.com/Allenxuxu/gev/master/benchmarks/out/gev11.png) ![null](https://raw.githubusercontent.com/Allenxuxu/gev/master/benchmarks/out/gev44.png) ### evio 压测方式: 限制 GOMAXPROCS=1,1 个 work 协程 ![image.png](https://img.hacpai.com/file/2019/09/image-c3303366.png) 限制 GOMAXPROCS=1,4 个 work 协程 ![image.png](https://img.hacpai.com/file/2019/09/image-6eb2e9a9.png) 限制 GOMAXPROCS=4,4 个 work 协程 ![image.png](https://img.hacpai.com/file/2019/09/image-85dbdde8.png) ## 安装 ```bash go get -u github.com/Allenxuxu/gev ``` ## 示例 ### TCP ```go package main import ( "flag" "strconv" "log" "github.com/Allenxuxu/gev" "github.com/Allenxuxu/gev/connection" "github.com/Allenxuxu/ringbuffer" ) type example struct{} func (s *example) OnConnect(c *connection.Connection) { log.Println(" OnConnect : ", c.PeerAddr()) } func (s *example) OnMessage(c *connection.Connection, buffer *ringbuffer.RingBuffer) (out []byte) { //log.Println("OnMessage") first, end := buffer.PeekAll() out = first if len(end) > 0 { out = append(out, end...) } buffer.RetrieveAll() return } func (s *example) OnClose() { log.Println("OnClose") } func main() { handler := new(example) var port int var loops int flag.IntVar(&port, "port", 1833, "server port") flag.IntVar(&loops, "loops", -1, "num loops") flag.Parse() s, err := gev.NewServer(handler, gev.Network("tcp"), gev.Address(":"+strconv.Itoa(port)), gev.NumLoops(loops)) if err != nil { panic(err) } s.Start() } ``` ### WebSocket ```go package main import ( "flag" "github.com/Allenxuxu/gev/ws" "log" "math/rand" "strconv" "github.com/Allenxuxu/gev" "github.com/Allenxuxu/gev/connection" ) type example struct{} func (s *example) OnConnect(c *connection.Connection) { log.Println(" OnConnect : ", c.PeerAddr()) } func (s *example) OnMessage(c *connection.Connection, data []byte) (messageType ws.MessageType, out []byte) { log.Println("OnMessage:", string(data)) messageType = ws.MessageBinary switch rand.Int() % 3 { case 0: out = data case 1: if err := c.SendWebsocketData(ws.MessageText, data); err != nil { if e := c.CloseWebsocket(err.Error()); e != nil { panic(e) } } case 2: if e := c.CloseWebsocket("close"); e != nil { panic(e) } } return } func (s *example) OnClose(c *connection.Connection) { log.Println("OnClose") } func main() { handler := new(example) var port int var loops int flag.IntVar(&port, "port", 1833, "server port") flag.IntVar(&loops, "loops", -1, "num loops") flag.Parse() s, err := gev.NewWebSocketServer(handler, gev.Network("tcp"), gev.Address(":"+strconv.Itoa(port)), gev.NumLoops(loops)) if err != nil { panic(err) } s.Start() } ``` ## 相关文章 - [evio源码解析](https://note.mogutou.xyz/articles/2019/08/06/1565053139105.html) - [Golang 网络库 evio 一些问题/bug和思考](https://note.mogutou.xyz/articles/2019/08/15/1565876205121.html) - [gev: Go 实现基于 Reactor 模式的非阻塞 TCP 网络库](https://note.mogutou.xyz/articles/2019/09/19/1568896693634.html) 仓库地址: https://github.com/Allenxuxu/gev

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

932 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传