愛了愛了!SpringBoot+Netty分佈式即時通信系統,附源碼!

最近公司開發須要用到 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,感興趣的小夥伴在學習之餘也能夠貢獻本身的一份力量,積極的參與開源哈!

項目地址、源碼地址、教程感興趣的請轉發+評論,掃一掃

相關文章
相關標籤/搜索