easy-im:一款基於netty的即時通信系統

介紹

easy-im是面向開發者的一款輕量級、開箱即用的即時通信系統,幫助開發者快速搭建消息推送等功能。 基於easy-im,你能夠快速實現如下功能:java

+ 聊天軟件nginx

+ IoT消息推送redis

基本用法-單機版(v1分支)

項目分爲easy-im-client、easy-im-server、easy-im-common三個模塊。服務器

服務端: 執行mvn package後生成easy-im-server.tar.gz,解壓後至./lib目錄執行命令: java -jar -Dport=8888 easy-im-server-1.0-SNAPSHOT.jar,便可啓動服務端,其中port是服務端口。微信

客戶端: 執行mvn package後生成easy-im-client.tar.gz,解壓後至./lib目錄執行命令: java -jar -Duserid=110 -Dusername=zhangsan -Dhost=127.0.0.1 -Dport=8888 easy-im-client-1.0-SNAPSHOT.jar。 其中userid爲用戶id,username爲用戶名,host爲服務端ip,port爲服務端端口,其中userid要保持惟一性。架構

用法: 客戶端啓動後,在命令行輸入命令,命令格式爲 command::content ,命令以英文雙冒號爲分隔符,現已支持以下命令:併發

+ 單聊 sendToUser::userId::msg高併發

+ 羣聊 sendToGroup::groupId::msgui

+ 發起羣聊 createGroup::userId1,userId2,userId3...命令行

+ 廣播 broadcast::msg

後續計劃加入更多命令,如:

+ 退出羣聊 quitGroup::groupId

+ 加入羣聊 joinGroup::groupId

+ 查詢全部在線用戶 getAllUsers

+ 查詢羣聊中在線用戶 getGroupUsers::groupId


計劃中-集羣版(v2分支)

打算將服務端作成可無限擴展的架構,使之知足高併發的需求。具體分爲如下幾個步驟:

增長路由層: 全部發送的消息由路由層轉發給響應的服務端,服務端再由長鏈接轉發至客戶端,以此解決發送端與接收端不在同一臺服務器上,沒法通信的問題

增長存儲介質: 將全部羣組關係、客戶端與服務器的對應關係、用戶信息等存儲起來,能夠用redis或者MySQL,也可存儲歷史消息

增長服務治理: 服務端若是要無限擴展,必須經過服務註冊、服務發現的機制,能夠經過zookeeper,或者eureka實現

架構圖以下:

交互步驟:

1. 啓動server,將server註冊到註冊中心
2. 啓動路由層(route),到註冊中心獲取可用的server列表
3. 啓動client,到route獲取一個server信息(route層實現選擇策略,默認輪循)
4. client與server創建長鏈接,並將server與client的對應關係存儲至Redis或MySQL

注:

1. route層採用http對外提供無狀態的服務,能夠採用nginx無限擴展
2. server註冊至註冊中心,也能夠無限擴展,用以實現百萬鏈接
3. client之間互聊時,需發送消息至route,route到redis中查找對應的server,再將消息經過server轉發至對方的client,以實現兩個client不在同一臺server時互聊

目前集羣版(v2分支)正在計劃中,歡迎有興趣的同窗共同參與,共同進步。


聯繫做者

  • 微信公衆號

相關文章
相關標籤/搜索