目標
實現一個WebSocket服務中心,支持水平擴展
技術棧
SpringBoot、Netty、JDK8、MySQL、Redis、RabbitMQ、MyBatis-Plus
環境搭建
主要功能點說明
WebSocket連接需要認證
服務端提供token獲取接口,WS連接前先獲取token
認證信息由服務端提供
Http接口請求需要認證
這里的接口一般就是推送接口
后續可以把推送記錄也做成接口進行查詢
支持單筆推送
根據注冊信息,查詢到用戶,進行推送
支持批量推送
根據注冊信息,查詢到用戶,進行推送
支持MQ異步推送
支持定時推送
記錄推送日志
記錄連接日志
支持集群部署
代碼設計
WebSocket連接需要認證
開發一個http接口用於獲取認證頭,WebSocket在注冊上來的時候,只有帶有正確的認證頭,服務端才允許其注冊
- 相關設計
- 一張保存了認證信息的表:reg_user
- 一個獲取token的http接口
- 一個判斷token是否合法的Service層方法
- reg_user表結構
- 核心邏輯
- 一旦認證請求通過,將token存儲到Redis中,並設置Key的過期時間
- 校驗的時候,通過查詢Redis實現,只要還有這個token作為Key的鍵值對存在,就說么token合法
- 待完善
- 權限認證不夠嚴謹,僅做到了身份識別,還沒有進行精細化的權限控制
- 關於接入方的賬號分配,目前需要手工進行
- 認證信息的密碼是明文進行的存儲
Http接口請求需要認證
- 編寫一個過濾器,對於需要認證的接口,獲取請求頭中的token,進行合法性校驗
MQ異步發送
- 作為消費者,消費異步請求
- 作為生產者,將調用結果廣播出去
- fanout模式進行廣播
- 同時自己也監聽此廣播,保證至少有一個消費者
使用JMeter進行WebSocket壓力測試
- 安裝插件管理器
- 安裝WebSocket插件
核心代碼
獲取認證token
檢查token是否有效
SpringBoot與Netty的整合
- WebSocket能夠接收的參數類型
- WebSocket客戶端注冊時帶的參數類型
- 推送返回給WebSocket客戶端的統一參數類型
推送接口
MQ異步推送
源碼
本文由博客一文多發平台 OpenWrite 發布!