目標
實現一個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 釋出!