最近公司開發需要用到 IM 系統,自己開發的話需要耗費較多時間和精力,于是我們考慮在開源專案的基礎上二次開發,我們對比了較多開源方案之后,選擇了 CIM[1] ,
專案簡介
CIM(CROSS-IM)專案是面向開發者的 即時通信 系統,專案基于目前比較流行的 SpringBoot 進行構建(專案依賴的Spring Boot 版本為 1.5.x ,可以自行升級到最新穩定版本),基于 Netty 進行網路通信,利用Redis來存放客戶端的賬戶/狀態(是否在線)/路由等資訊,同時使用Zookeeper來完成服務間的發現,
通過 CIM(CROSS-IM) 你可以設計一款屬于自己可水平擴展的 IM ,
轉發+關注,然后私信回復關鍵字 “專案” 即可獲得專案地址的獲取方式!
功能串列
-
群聊
-
私聊
-
聊天記錄查詢
-
AI 自動聊天(價值兩億的智能模式哦)
-
延時訊息
-
客戶端自動重連
-
服務端自動剔除離線客戶端
-
支持水平擴容/縮容
-
支持Protocol Buffer協議
專案截圖
群聊:


私聊:

專案技術堆疊
-
Spring Boot
-
Zookeeper
-
Netty
-
Redis
-
...
可以看到專案中用到的都是技術都是很常用技術,同時也是我們需要掌握的能力,而且crossoverJie 大佬的代碼寫的也相當漂亮,非常值得學習一波,
先來簡單看一下系統整體架構!
系統架構

下面我們來一起看下幾個關鍵實作吧,
代碼簡單分析
群聊
群聊的使用非常簡單,只需要在控制臺輸入訊息回車即可,
這時會去呼叫 route 的群聊介面,

實作的效果就是其中一個客戶端發訊息,其余所有客戶端都能收到!
流程肯定是客戶端發送一條訊息到服務端,服務端收到后在上文介紹的 SessionSocketHolder 中遍歷所有 Channel(通道)然后下發訊息即可,
服務端是單機倒也可以,但現在是集群設計,所以所有的客戶端會根據之前的輪詢演算法分配到不同的 服務端實體中,


接著會挨個呼叫每個客戶端所在的服務端的 HTTP 介面用于推送訊息,


私聊
私聊也是同理,但前提是需要觸發關鍵字;使用 userId;;訊息內容 這樣的格式才會給某個用戶發送訊息,所以一般都需要先使用 :olu 命令獲取所以在線用戶才方便使用,

在線用戶查看
這是一個輔助介面,可以查詢出當前在線用戶資訊,


實作也很簡單,也就是查詢之前保存 ”用戶登錄狀態的那個去重 set “即可,
后記
CIM[3] 的功能包含但不限于此,其他功能就等你自己去體驗嘍~
體貼的crossoverJie 大佬還為該專案寫了很多 相關的文章[4],分享了一些他開發這個專案的設計流程/遇到的問題,包含了很多大佬的思考,小伙伴們可要好好利用起來哦~
以下是文章串列:

按照 crossoverjie 大佬的設想,該專案還有很多 todo list,感興趣的小伙伴在學習之余也可以貢獻自己的一份力量,積極的參與開源哈!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/2673.html
標籤:其他
