基於SpringBoot+Netty實現一個自己的推送服務系統

Koko君發表於2019-12-09

目標

實現一個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表結構

image-20191209160801307

  • 核心邏輯
    • 一旦認證請求通過,將token儲存到Redis中,並設定Key的過期時間
    • 校驗的時候,通過查詢Redis實現,只要還有這個token作為Key的鍵值對存在,就說麼token合法
  • 待完善
    • 許可權認證不夠嚴謹,僅做到了身份識別,還沒有進行精細化的許可權控制
    • 關於接入方的賬號分配,目前需要手工進行
    • 認證資訊的密碼是明文進行的儲存

Http介面請求需要認證

  • 編寫一個過濾器,對於需要認證的介面,獲取請求頭中的token,進行合法性校驗

MQ非同步傳送

  • 作為消費者,消費非同步請求
  • 作為生產者,將呼叫結果廣播出去
    • fanout模式進行廣播
    • 同時自己也監聽此廣播,保證至少有一個消費者

使用JMeter進行WebSocket壓力測試

  • 安裝外掛管理器
  • 安裝WebSocket外掛

核心程式碼

獲取認證token

image-20191209210053902

檢查token是否有效

image-20191209210156135

SpringBoot與Netty的整合

image-20191209210242588

  • WebSocket能夠接收的引數型別

image-20191209210341387

  • WebSocket客戶端註冊時帶的引數型別

image-20191209210406070

  • 推送返回給WebSocket客戶端的統一引數型別

image-20191209210446737

推送介面

image-20191209210541866

MQ非同步推送

image-20191209210609700

原始碼

原始碼

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章