Golang Go语言中基于go-netty编写的websocket库nettyws
nettyws是一款基于go-netty编写的高性能 websocket 库,底层协议编解码基于gobwas/ws
但是针对性进行了额外的性能优化,相比较直接使用gobwas/ws
库,nettyws
的接口更加易于使用,性能也明显优于它
仓库地址: https://github.com/go-netty/go-netty-ws
API 预览
type Websocket
func NewWebsocket(options ...Option) *Websocket
func (ws *Websocket) Close() error
func (ws *Websocket) Listen(addr string) error
func (ws *Websocket) Open(addr string) error
func (ws *Websocket) UpgradeHTTP(w http.ResponseWriter, r *http.Request) (Conn, error)
type Option
func WithAsyncWrite(writeQueueSize int, writeForever bool) Option
func WithBinary() Option
func WithBufferSize(readBufferSize, writeBufferSize int) Option
func WithCompress(compressLevel int, compressThreshold int64) Option
func WithMaxFrameSize(maxFrameSize int64) Option
func WithNoDelay(noDelay bool) Option
func WithServeMux(serveMux *http.ServeMux) Option
func WithServeTLS(tls *tls.Config) Option
func WithValidUTF8() Option
性能报告
Framework | TPS | Conns | Concurrency | Payload | CPU Avg | CPU Max | MEM Min | MEM Avg | MEM Max |
---|---|---|---|---|---|---|---|---|---|
gobwas | 510595 | 10000 | 10000 | 1024 | 762.87 | 785.80 | 361.89M | 364.79M | 366.24M |
nettyws | 637288 | 10000 | 10000 | 1024 | 636.00 | 643.86 | 173.52M | 178.02M | 182.52M |
详细性能压测数据来源: go-websocket-benchmark
如何使用
服务器
// create websocket instance
var ws = nettyws.NewWebsocket()
// setup OnOpen handler
ws.OnOpen = func(conn nettyws.Conn) {
fmt.Println("OnOpen: ", conn.RemoteAddr())
}
// setup OnData handler
ws.OnData = func(conn nettyws.Conn, data []byte) {
fmt.Println("OnData: ", conn.RemoteAddr(), ", message: ", string(data))
conn.Write(data)
}
// setup OnClose handler
ws.OnClose = func(conn nettyws.Conn, err error) {
fmt.Println("OnClose: ", conn.RemoteAddr(), ", error: ", err)
}
fmt.Println(“listening websocket connections …”)
// listen websocket server
if err := ws.Listen(“ws://127.0.0.1:9527/ws”); nil != err {
panic(err)
}
客户端
// create websocket instance
var ws = nettyws.NewWebsocket()
// setup OnOpen handler
ws.OnOpen = func(conn nettyws.Conn) {
fmt.Println("OnOpen: ", conn.RemoteAddr())
conn.Write([]byte(“hello world”))
}
// setup OnData handler
ws.OnData = func(conn nettyws.Conn, data []byte) {
fmt.Println("OnData: ", conn.RemoteAddr(), ", message: ", string(data))
}
// setup OnClose handler
ws.OnClose = func(conn nettyws.Conn, err error) {
fmt.Println("OnClose: ", conn.RemoteAddr(), ", error: ", err)
}
fmt.Println(“open websocket connection …”)
// connect to websocket server
if err := ws.Open(“ws://127.0.0.1:9527/ws”); nil != err {
panic(err)
}
从标准 http 服务器升级
// create websocket instance
var ws = nettyws.NewWebsocket()
// setup OnOpen handler
ws.OnOpen = func(conn nettyws.Conn) {
fmt.Println("OnOpen: ", conn.RemoteAddr())
}
// setup OnData handler
ws.OnData = func(conn nettyws.Conn, data []byte) {
fmt.Println("OnData: ", conn.RemoteAddr(), ", message: ", string(data))
conn.Write(data)
}
// setup OnClose handler
ws.OnClose = func(conn nettyws.Conn, err error) {
fmt.Println("OnClose: ", conn.RemoteAddr(), ", error: ", err)
}
fmt.Println(“upgrade websocket connections …”)
// upgrade websocket connection from http server
serveMux := http.NewServeMux()
serveMux.HandleFunc("/ws", func(writer http.ResponseWriter, request *http.Request) {
ws.UpgradeHTTP(writer, request)
})
// listen http server
if err := http.ListenAndServe(":9527", serveMux); nil != err {
panic(err)
}
特别说明,nettyws
不支持混合数据数据模式,也就是说服务器启动时必须指定数据包格式(文本/二进制,默认文本格式)如果收到了非指定数据包格式则将会被丢弃,这样做的原因之一是nettyws
使用的底层传输层抽象成 io.ReadWriter 之后无法携带除数据之外的格式信息,同时真实业务场景上同时混用数据格式的情况比比较少见,因此直接放弃了混合数据格式的支持。
Golang Go语言中基于go-netty编写的websocket库nettyws
更多关于Golang Go语言中基于go-netty编写的websocket库nettyws的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
不错已星
更多关于Golang Go语言中基于go-netty编写的websocket库nettyws的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
看着好像很不错。我刚刚接触 go 不久,想问问,我举个例子。
如果说我想和 goframe 框架结合使用,这个路由该如何定义呢
抱歉 我对 goframe 不是太熟悉,一般基于标准库 server 的路由都可以参考 从标准 http 服务器升级 这个例子进行适配
#4 试了下,可以的。都是标准 http 接口
https://img.cdn.xiubbs.com/file/23d18395dbb4d7d24c7cc.png
👍
starred
感谢 ❤
前端 js 发送文本消息,服务端接受时提示
OnClose: 127.0.0.1:52295 , error: flate: corrupt input before offset 6
但是用 apipost 模拟又没有问题
是和浏览器压缩协商出了点问题,可以更新一下版本到 v1.0.2
#10 确实好了,这一些让我不敢用在项目里面了😅
在Go语言中,关于使用基于go-netty
的WebSocket库nettyws
,这里有一些专业的见解和说明。
首先,go-netty
并非Go语言社区广泛认知或标准库中的一部分,它可能是某个特定项目或第三方库中的名称。而nettyws
听起来像是尝试将Netty(一个在Java中广泛使用的网络应用框架)的概念和特性移植到Go语言中的WebSocket库。但需要注意的是,Netty本身是Java的产物,Go语言有其独特的并发模型和网络编程库,如net/http
包中的WebSocket支持。
在Go语言中处理WebSocket,通常推荐使用标准库中的golang.org/x/net/websocket
或更现代的github.com/gorilla/websocket
。这些库已经过广泛测试和社区支持,能够很好地满足大多数WebSocket需求。
如果你确实找到了一个名为nettyws
的库,并希望使用它,建议首先查看其文档和源代码,了解它是否真正符合你的需求,以及它是否稳定可靠。同时,也需要注意该库的维护情况和社区活跃度,以确保在遇到问题时能够获得及时的帮助。
总之,在选择Go语言中的WebSocket库时,建议优先考虑广泛使用、社区支持良好的库。如果你对nettyws
有特别的兴趣或需求,也请确保对其进行充分的了解和测试。