Golider v0.6.0 工程师笔记:零依赖 WebSocket 实时推送模块
前一个版本 v0.5.0 解决的是可观测性和自我保护:分布式追踪 + 熔断器。v0.6.0 把实时通信补上。
后端项目常会遇到类似需求:用户需要即时收到通知,而不是轮询。常规做法是引入 Gorilla WebSocket 或自己裸写 Upgrade,然后花大量时间处理连接管理、心跳、房间订阅、广播逻辑。v0.6.0 的做法是用一条命令生成完整模块。
一条命令生成
Golider add websocket ./demo
执行后生成一个完整、可直接使用的 WebSocket 服务,并自动在 router.go 注册路由:
mux.HandleFunc("/ws", websocketHandler)
实现要点
- 纯标准库实现,零依赖。基于
net/http的Hijacker处理握手和帧解析,约 300 行。 - Hub-Client 架构。Hub 统一管理连接和房间,Client 负责单连接的读写和心跳。
房间结构示意:
Hub
├── rooms["lobby"]
│ ├── client_a
│ └── client_b
└── rooms["game"]
├── client_c
└── client_d
- 房间订阅:连接时通过
?room=lobby指定房间;运行中可发送 JSON 消息切换房间:
{"room": "game", "event": "join"}
- 心跳保活:每 30 秒发 ping,60 秒无消息断开;死连接自动清理。
- 消息广播:业务代码一行调用:
http.BroadcastToRoom("game", "state_update", data)
Hub 自动把消息推到该房间所有客户端。
设计取舍与边界
为什么不用 Gorilla?
Gorilla 成熟稳定,但依赖较重。Golider 的定位是脚手架生成的代码本身就是范例——用标准库实现协议,用户能看清每一帧怎么读写的,出问题不会面对黑盒。而且整个项目坚持「生成代码尽量零依赖」。
为什么放在 addon?
不是所有服务都需要 WebSocket。CRUD、REST API 用不到,只有消息通知、协作编辑、仪表盘刷新等实时场景才需要。按需添加,不需要的人零负担。
已知边界:单实例,暂无跨实例广播。
当前 WebSocket 模块不跨服务器广播。后续计划结合已有的 Redis addon,用 Pub/Sub 通道在多实例间转发广播消息。
升级与使用
go install github.com/2859044775/Golider@latest
Golider version # Golider 0.6.0
已有项目追加 WebSocket:
Golider add websocket .
后续计划
接下去会做定时任务、GraphQL、多租户支持。代码在 GitHub / Gitee / AtomGit 三端同步。