6k+點(diǎn)贊的SpringBoot+Netty分布式即時(shí)通訊系統(tǒng)!愛了愛了!
最近公司開發(fā)需要用到 IM 系統(tǒng),自己開發(fā)的話需要耗費(fèi)較多時(shí)間和精力。于是我們考慮在開源項(xiàng)目的基礎(chǔ)上二次開發(fā),我們對(duì)比了較多開源方案之后,選擇了 CIM[1] ? ? 。
項(xiàng)目簡介
CIM(CROSS-IM)項(xiàng)目是面向開發(fā)者的 即時(shí)通信 系統(tǒng),項(xiàng)目基于目前比較流行的 SpringBoot 進(jìn)行構(gòu)建(項(xiàng)目依賴的Spring Boot 版本為 1.5.x ,可以自行升級(jí)到最新穩(wěn)定版本),基于 Netty 進(jìn)行網(wǎng)絡(luò)通信。利用Redis來存放客戶端的賬戶/狀態(tài)(是否在線)/路由等信息,同時(shí)使用Zookeeper來完成服務(wù)間的發(fā)現(xiàn)。
通過 CIM(CROSS-IM) 你可以設(shè)計(jì)一款屬于自己可水平擴(kuò)展的 IM 。
項(xiàng)目地址: https://github.com/crossoverJie/cim[2]
功能列表
群聊 私聊 聊天記錄查詢 AI 自動(dòng)聊天(價(jià)值兩億的智能模式哦) 延時(shí)消息 客戶端自動(dòng)重連 服務(wù)端自動(dòng)剔除離線客戶端 支持水平擴(kuò)容/縮容 支持Protocol Buffer協(xié)議
項(xiàng)目截圖
群聊:


私聊:

項(xiàng)目技術(shù)棧
Spring Boot Zookeeper Netty Redis ...
可以看到項(xiàng)目中用到的都是技術(shù)都是很常用技術(shù),同時(shí)也是我們需要掌握的能力。而且 crossoverJie ?大佬的代碼寫的也相當(dāng)漂亮,非常值得學(xué)習(xí)一波。
先來簡單看一下系統(tǒng)整體架構(gòu)!
系統(tǒng)架構(gòu)

下面我們來一起看下幾個(gè)關(guān)鍵實(shí)現(xiàn)吧。
代碼簡單分析
群聊
群聊的使用非常簡單,只需要在控制臺(tái)輸入消息回車即可。
這時(shí)會(huì)去調(diào)用 route 的群聊接口。

實(shí)現(xiàn)的效果就是其中一個(gè)客戶端發(fā)消息,其余所有客戶端都能收到!
流程肯定是客戶端發(fā)送一條消息到服務(wù)端,服務(wù)端收到后在上文介紹的 SessionSocketHolder 中遍歷所有 Channel(通道)然后下發(fā)消息即可。
服務(wù)端是單機(jī)倒也可以,但現(xiàn)在是集群設(shè)計(jì)。所以所有的客戶端會(huì)根據(jù)之前的輪詢算法分配到不同的 服務(wù)端實(shí)例中。


接著會(huì)挨個(gè)調(diào)用每個(gè)客戶端所在的服務(wù)端的 HTTP 接口用于推送消息。


私聊
私聊也是同理,但前提是需要觸發(fā)關(guān)鍵字;使用 userId;;消息內(nèi)容 這樣的格式才會(huì)給某個(gè)用戶發(fā)送消息,所以一般都需要先使用 :olu 命令獲取所以在線用戶才方便使用。

在線用戶查看
這是一個(gè)輔助接口,可以查詢出當(dāng)前在線用戶信息。


實(shí)現(xiàn)也很簡單,也就是查詢之前保存 ”用戶登錄狀態(tài)的那個(gè)去重 set “即可。
后記
CIM[3] 的功能包含但不限于此,其他功能就等你自己去體驗(yàn)嘍~
體貼的crossoverJie 大佬還為該項(xiàng)目寫了很多 相關(guān)的文章[4],分享了一些他開發(fā)這個(gè)項(xiàng)目的設(shè)計(jì)流程/遇到的問題,包含了很多大佬的思考。小伙伴們可要好好利用起來哦~
以下是文章列表:

按照 crossoverjie 大佬的設(shè)想,該項(xiàng)目還有很多 todo list,感興趣的小伙伴在學(xué)習(xí)之余也可以貢獻(xiàn)自己的一份力量,積極的參與開源哈!
參考資料
CIM: https://github.com/crossoverJie/cim
[2]https://github.com/crossoverJie/cim: https://github.com/crossoverJie/cim
[3]CIM: https://github.com/crossoverJie/cim
[4]相關(guān)的文章: https://crossoverjie.top/categories/Netty/
后記
文章有幫助可以點(diǎn)個(gè)「在看」或「分享」,都是支持,我都喜歡!
我是Guide哥,Java后端開發(fā),會(huì)一點(diǎn)前端知識(shí),喜歡烹飪,自由的少年。一個(gè)三觀比主角還正的技術(shù)人。我們下期再見!
