Skip to content

对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_timeoutproxy_send_timeout 设置为 3600s,即 1 小时,以适应长时间运行的 Websocket 连接。

  1. 演示接口位于sz-service-admin服务的 TestController类中。 ↩︎