对WebSocket的支持
作为一款现代化应用,我们的框架同样提供了对WebSocket的支持。
服务间通信
NOTE
秉承轻量化理念,我们在设计框架时采用了基于Redis的发布订阅机制,来处理Socket服务端与Admin业务端之间的多节点通信问题。
鉴权
我们通过JWT对WebSocket连接进行验证,以确保用户的有效性。
API支持
框架提供了开箱即用的全体推送和定向推送功能[1]。
java
...
@PostMapping("push/all")
@Operation(summary = "全体推送-升级公告(socket)")
public ApiResult sendUpgradeMsg() {
SocketBean bean = new SocketBean<>();
bean.setData("【全体推送】 系统即将进行升级,预计需要几分钟时间。请您稍等片刻,感谢您的耐心等待");
bean.setChannel(SocketChannelEnum.UPGRADE_CHANNEL);
bean.setScope(MessageTransferScopeEnum.SOCKET_CLIENT);
TransferMessage msg = new TransferMessage();
msg.setMessage(bean);
msg.setFromUser("system");
msg.setToPushAll(true);
websocketRedisService.sendServiceToWs(msg);
return ApiResult.success();
}
@PostMapping("push/user")
@Operation(summary = "定向推送-升级公告(socket)")
public ApiResult sendMsg() {
SocketBean bean = new SocketBean<>();
bean.setData("【定向推送】 系统即将进行升级,预计需要几分钟时间。请您稍等片刻,感谢您的耐心等待");
bean.setChannel(SocketChannelEnum.UPGRADE_CHANNEL);
bean.setScope(MessageTransferScopeEnum.SOCKET_CLIENT);
TransferMessage msg = new TransferMessage();
msg.setMessage(bean);
msg.setFromUser("system");
msg.setToPushAll(false);
List<String> toUsers = new ArrayList<>();
toUsers.add("1"); // 向 loginId = 1 的用户推送消息。既 admin 账号
msg.setToUsers(toUsers);
websocketRedisService.sendServiceToWs(msg);
return ApiResult.success();
}
...
优雅停机
当 WebSocket 服务停止时,会进行优雅的停机操作。首先,清理 Redis 中的缓存,然后断开所有 WebSocket 连接。只有在这些任务完成后,服务才会完全退出。服务启动时,Web 客户端会根据策略自动重连。
Nginx 配置建议
为了确保 Websocket 连接的稳定性,我们建议对 Nginx 配置进行以下优化:
Websocket 超时时间延长
在 Nginx 配置文件中,找到或添加以下 server
块:
nginx
server {
...
# Websocket 支持配置
location /socket {
proxy_pass http://sz-service-websocket:9993; # 后端 WebSocket 服务器地址
proxy_http_version 1.1; # 启用 HTTP/1.1 以支持 WebSocket
proxy_set_header Upgrade $http_upgrade; # 通知 Nginx 转发 Upgrade 头
proxy_set_header Connection "upgrade"; # 通知 Nginx 转发 Connection 头
proxy_set_header Host $host; # 转发 Host 头
# 绕过缓存,因为 Websocket 连接不需要缓存
proxy_cache_bypass $http_upgrade;
# 设置 Websocket 连接的读取和发送超时时间
proxy_read_timeout 3600s; # 1小时
proxy_send_timeout 3600s; # 1小时
}
...
}
说明:
- 请将
http://sz-service-websocket:9993
替换为您实际的后端 WebSocket 服务器地址。 proxy_read_timeout
和proxy_send_timeout
设置为3600s
,即 1 小时,以适应长时间运行的 Websocket 连接。
演示接口位于sz-service-admin服务的 TestController类中。 ↩︎