最近公司開發須要用到 IM 系統,本身開發的話須要耗費較多時間和精力。因而咱們考慮在開源項目的基礎上二次開發,咱們對比了較多開源方案以後,選擇了 CIM[1] 。算法
項目簡介
CIM(CROSS-IM)項目是面向開發者的 即時通訊 系統,項目基於目前比較流行的 SpringBoot 進行構建(項目依賴的Spring Boot 版本爲 1.5.x ,能夠自行升級到最新穩定版本),基於 Netty 進行網絡通訊。利用Redis來存放客戶端的帳戶/狀態(是否在線)/路由等信息,同時使用Zookeeper來完成服務間的發現。網絡
經過 CIM(CROSS-IM) 你能夠設計一款屬於本身可水平擴展的 IM 。架構
功能列表
- 羣聊
- 私聊
- 聊天記錄查詢
- AI 自動聊天(價值兩億的智能模式哦)
- 延時消息
- 客戶端自動重連
- 服務端自動剔除離線客戶端
- 支持水平擴容/縮容
- 支持Protocol Buffer協議
項目截圖
羣聊:學習
私聊:spa
項目技術棧
- Spring Boot
- Zookeeper
- Netty
- Redis
- ...
能夠看到項目中用到的都是技術都是很經常使用技術,同時也是咱們須要掌握的能力。並且 crossoverJie 大佬的代碼寫的也至關漂亮,很是值得學習一波。設計
先來簡單看一下系統總體架構!教程
系統架構
下面咱們來一塊兒看下幾個關鍵實現吧。接口
代碼簡單分析
羣聊
羣聊的使用很是簡單,只須要在控制檯輸入消息回車便可。路由
這時會去調用 route 的羣聊接口。開發
實現的效果就是其中一個客戶端發消息,其他全部客戶端都能收到!
流程確定是客戶端發送一條消息到服務端,服務端收到後在上文介紹的 SessionSocketHolder 中遍歷全部 Channel(通道)而後下發消息便可。
服務端是單機倒也能夠,但如今是集羣設計。因此全部的客戶端會根據以前的輪詢算法分配到不一樣的 服務端實例中。
接着會挨個調用每一個客戶端所在的服務端的 HTTP 接口用於推送消息。
私聊
私聊也是同理,但前提是須要觸發關鍵字;使用 userId;;消息內容 這樣的格式纔會給某個用戶發送消息,因此通常都須要先使用 :olu 命令獲取因此在線用戶才方便使用。
在線用戶查看
這是一個輔助接口,能夠查詢出當前在線用戶信息。
實現也很簡單,也就是查詢以前保存 」用戶登陸狀態的那個去重 set「便可。
後記
CIM[3] 的功能包含但不限於此,其餘功能就等你本身去體驗嘍~
體貼的crossoverJie 大佬還爲該項目寫了不少 相關的文章[4],分享了一些他開發這個項目的設計流程/遇到的問題,包含了不少大佬的思考。小夥伴們可要好好利用起來哦~
如下是文章列表:
按照 crossoverjie 大佬的設想,該項目還有不少 todo list,感興趣的小夥伴在學習之餘也能夠貢獻本身的一份力量,積極的參與開源哈!
項目地址、源碼地址、教程感興趣的請轉發+評論,掃一掃