最近公司開(kāi)發(fā)需要用到 IM 系統(tǒng)绢片,自己開(kāi)發(fā)的話需要耗費(fèi)較多時(shí)間和精力滤馍。于是我們考慮在開(kāi)源項(xiàng)目的基礎(chǔ)上二次開(kāi)發(fā),我們對(duì)比了較多開(kāi)源方案之后底循,選擇了 CIM[1] 巢株。
項(xiàng)目簡(jiǎn)介
CIM(CROSS-IM)項(xiàng)目是面向開(kāi)發(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來(lái)存放客戶端的賬戶/狀態(tài)(是否在線)/路由等信息,同時(shí)使用Zookeeper來(lái)完成服務(wù)間的發(fā)現(xiàn)那槽。
通過(guò) 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 大佬的代碼寫(xiě)的也相當(dāng)漂亮,非常值得學(xué)習(xí)一波软瞎。
先來(lái)簡(jiǎn)單看一下系統(tǒng)整體架構(gòu)逢唤!
系統(tǒng)架構(gòu)
下面我們來(lái)一起看下幾個(gè)關(guān)鍵實(shí)現(xiàn)吧。
代碼簡(jiǎn)單分析
群聊
群聊的使用非常簡(jiǎn)單涤浇,只需要在控制臺(tái)輸入消息回車(chē)即可鳖藕。
這時(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)也很簡(jiǎn)單,也就是查詢之前保存 ”用戶登錄狀態(tài)的那個(gè)去重 set “即可蠕搜。
后記
CIM[3] 的功能包含但不限于此怎茫,其他功能就等你自己去體驗(yàn)嘍~
體貼的crossoverJie 大佬還為該項(xiàng)目寫(xiě)了很多 相關(guān)的文章[4],分享了一些他開(kāi)發(fā)這個(gè)項(xiàng)目的設(shè)計(jì)流程/遇到的問(wèn)題讥脐,包含了很多大佬的思考遭居。小伙伴們可要好好利用起來(lái)哦~
以下是文章列表:
按照 crossoverjie 大佬的設(shè)想,該項(xiàng)目還有很多 todo list旬渠,感興趣的小伙伴在學(xué)習(xí)之余也可以貢獻(xiàn)自己的一份力量俱萍,積極的參與開(kāi)源哈!