关注我的公众号:【编程朝花夕拾】,可获取首发内容。
01 引言
这两天有空,就持续优化stream-nexus / nexus-sse项目,并增加了websocket的集成。这一期聊聊都改了什么?
02 客户端ID参数
2.1 旧的设计
老的建连方式长这样:
GET /sse/subscribe?clientId=6f1d2a3c-...&modules=lot,order
clientId 由浏览器 crypto.randomUUID() 生成,写进 URL,整条链路都靠它:
- 心跳应答:POST /sse/pong?clientId=xxx`,服务端靠它定位该给哪条连接续命
- 定向推送:
{"clientIds":["xxx"]},推送给指定连接 - 运维台账:连接列表展示、
DELETE /sse/admin/connections/{clientId}踢下线
2.2 可能出现的问题
最大的问题就是客户端的伪造。客户端自带 ID,等于「客户端可以声明自己是谁」。如果一个客户端使用了其他人的客户端,那么明明是两个客户端,统计数据只会显示一条。
既然刷新页面就会生成新的客户端,为什么不交给服务端维护呢,参数减少使用起来门槛就会降低。
2.3 新的设计
服务端分配,建连回执下发。
客户端 服务端
│ GET /sse/subscribe?modules=lot,order │
│ ──────────────────────────────────────► │
│ │ ① newClientId() → UUID
│ │ ② 登记连接(撞号概率可忽略)
│ event: MESSAGE │
│ {bizModule:"sse", action:"connected", │
│ data:{clientId:"...", modules:[...]}} │
│ ◄────────────────────────────────────── │
│ ③ 保存 clientId │
│ │
│ event: PING │
│ ◄────────────────────────────────────── │
│ POST /sse/pong?clientId=xxx │ ④ 靠 ID 定位连接续命
│ ──────────────────────────────────────► │
03 连接台账优化
连接台账增加了项目运行的时间以及客户端连接的IP
04 界面的优化
之前的管理界面过于单调,增加动态效果以及科技感。
旧的界面:
新的界面:
05 WebSocket集成
nexus-sse项目没有去解决同源浏览器6个限制,nexus-websocket可以弥补。
nexus-websocket打算通过两个方式实现推送:
rest接口:类似sse,使用http请求推送tcp协议:通过tcp协议的客户端实现推送
目前项目还是半成品,后续会进一步完善。
06 小结
无论SSE还是Websocket其实都属于模板代码,一次搭建之后,后续直接使用,时间长了可能都记得里面都有什么东西。此项目整理了自己之前业务中碰到的问题,并在项目中得到了解决。