精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

自己動手擼一個分布式IM(即時通訊) 系統

網絡 通信技術 開發工具 分布式
之前分享過一篇《設計一個百萬級的消息推送系統》,雖然在文中貼了一些偽代碼,但是有朋友希望能直接分享一些可以運行的源碼,這么久了是時候把坑填上了。

 之前分享過一篇《設計一個***的消息推送系統》,雖然在文中貼了一些偽代碼,但是有朋友希望能直接分享一些可以運行的源碼,這么久了是時候把坑填上了。

于是我在之前的基礎上完善了一些內容,先來看看這個項目的介紹吧:CIM(CROSS-IM) 一款面向開發者的 IM(即時通訊)系統,同時提供了一些組件幫助開發者構建一款屬于自己可水平擴展的 IM 。

借助 CIM 你可以實現以下需求:

  • IM 即時通訊系統。
  • 適用于 App 的消息推送中間件。
  • IOT 海量連接場景中的消息透傳中間件。

完整源碼托管在 GitHub :

  1. https://github.com/crossoverJie/cim 

本次主要涉及到 IM 即時通訊,所以特地錄了兩段視頻演示(群聊、私聊)。

群聊

私聊

架構設計

 

下面來看看具體的架構設計:

  • CIM 中的各個組件均采用 Spring Boot 構建。
  • 采用 Netty + Google Protocol Buffer 構建底層通信。
  • Redis 存放各個客戶端的路由信息、賬號信息、在線狀態等。
  • Zookeeper 用于 IM-server 服務的注冊與發現。

整體主要由以下模塊組成:

  • cim-server,IM 服務端:用于接收 Client 連接、消息透傳、消息推送等功能。支持集群部署。
  • cim-forward-route,消息路由服務器:用于處理消息路由、消息轉發、用戶登錄、用戶下線以及一些運營工具(獲取在線用戶數等)。
  • cim-client,IM 客戶端:給用戶使用的消息終端,一個命令即可啟動并向其他人發起通訊(群聊、私聊);同時內置了一些常用命令方便使用。

流程圖

 

整體的流程也比較簡單,流程圖如下:

  • 客戶端向 Route 發起登錄。
  • 登錄成功從 Zookeeper 中選擇可用 im-server 返回給客戶端,并保存登錄、路由信息到 Redis。
  • 客戶端向 im-server 發起長連接,成功后保持心跳。
  • 客戶端下線時通過 Route 清除狀態信息。

所以當我們自己部署時需要以下步驟:

  • 搭建基礎中間件 Redis、Zookeeper。
  • 部署 cim-server,這是真正的 IM 服務器,為了滿足性能需求所以支持水平擴展,只需要注冊到同一個 Zookeeper 即可。
  • 部署 cim-forward-route,這是路由服務器,所有的消息都需要經過它。由于它是無狀態的,所以也可以利用 Nginx 代理提高可用性。
  • cim-client 真正面向用戶的客戶端;啟動之后會自動連接 IM 服務器便可以在控制臺收發消息了。

更多使用介紹可以參考快速啟動。

詳細設計

接下來重點看看具體的實現,比如群聊、私聊消息如何流轉;IM 服務端負載均衡;服務如何注冊發現等等。

IM 服務端

先來看看服務端;主要是實現客戶端上下線、消息下發等功能。

首先是服務啟動:

 

由于是在 Spring Boot 中搭建的,所以在應用啟動時需要啟動 Netty 服務。

從 Pipline 中可以看出使用了 Protobuf 的編解碼(具體報文在客戶端中分析)。

注冊發現

需要滿足 IM 服務端的水平擴展需求,所以 cim-server 是需要將自身數據發布到注冊中心的。

所以在應用啟動成功后需要將自身數據注冊到 Zookeeper 中。

 

最主要的目的就是將當前應用的 ip + cim-server-port+ http-port 注冊上去。

 

上圖是我在演示環境中注冊的兩個 cim-server 實例(由于在一臺服務器,所以只是端口不同)。

這樣在客戶端(監聽這個 Zookeeper 節點)就能實時的知道目前可用的服務信息。

登錄

當客戶端請求 cim-forward-route 中的登錄接口(詳見下文)做完業務驗證(就相當于日常登錄其他網站一樣)之后,客戶端會向服務端發起一個長連接,如之前的流程所示:

 

這時客戶端會發送一個特殊報文,表明當前是登錄信息。服務端收到后就需要將該客戶端的 userID 和當前 Channel 通道關系保存起來。

 

同時也緩存了用戶的信息,也就是 userID 和用戶名。

離線

當客戶端斷線后也需要將剛才緩存的信息清除掉。

 

同時也需要調用 Route 接口清除相關信息(具體接口看下文)。

IM 路由

 

從架構圖中可以看出,路由層是非常重要的一環;它提供了一系列的 HTTP 服務承接了客戶端和服務端。目前主要是以下幾個接口:

①注冊接口

由于每一個客戶端都是需要登錄才能使用的,所以***步自然是注冊。

這里就設計的比較簡單,直接利用 Redis 來存儲用戶信息;用戶信息也只有 ID 和 userName 而已。

只是為了方便查詢在 Redis 中的 KV 又反過來存儲了一份 VK,這樣 ID 和 userName 都必須唯一。

②登錄接口

 

這里的登錄和 cim-server 中的登錄不一樣,具有業務性質:

  • 登錄成功之后需要判斷是否是重復登錄(一個用戶只能運行一個客戶端)。
  • 登錄成功后需要從 Zookeeper 中獲取服務列表(cim-server)并根據某種算法選擇一臺服務返回給客戶端。
  • 登錄成功之后還需要保存路由信息,也就是當前用戶分配的服務實例保存到 Redis 中。

為了實現只能一個用戶登錄,使用了 Redis 中的 Set 來保存登錄信息;利用 userID 作為 Key ,重復的登錄就會寫入失敗。

 

類似于 Java 中的 HashSet,只能去重保存。

 

獲取一臺可用的路由實例也比較簡單:

  • 先從 Zookeeper 獲取所有的服務實例做一個內部緩存。
  • 輪詢選擇一臺服務器(目前只有這一種算法,后續會新增)。

當然要獲取 Zookeeper 中的服務實例前,自然是需要監聽 cim-server 之前注冊上去的那個節點。

具體代碼如下:

 

也是在應用啟動之后監聽 Zookeeper 中的路由節點,一旦發生變化就會更新內部緩存。

這里使用的是 Guava 的 Cache,它基于 Concurrent HashMap,所以可以保證清除、新增緩存的原子性。

③群聊接口

這是一個真正發消息的接口,實現的效果就是其中一個客戶端發消息,其余所有客戶端都能收到!

流程肯定是客戶端發送一條消息到服務端,服務端收到后在上文介紹的 SessionSocketHolder 中遍歷所有 Channel(通道)然后下發消息即可。

服務端是單機倒也可以,但現在是集群設計。所以所有的客戶端會根據之前的輪詢算法分配到不同的 cim-server 實例中。

因此就需要路由層來發揮作用了:

 

路由接口收到消息后首先遍歷出所有的客戶端和服務實例的關系。路由關系在 Redis 中的存放如下:

 

由于 Redis 單線程的特質,當數據量大時;一旦使用 Keys 匹配所有 cim-route:* 數據,會導致 Redis 不能處理其他請求。

所以這里改為使用 Scan 命令來遍歷所有的 cim-route:*。接著會挨個調用每個客戶端所在的服務端的 HTTP 接口用于推送消息。

在 cim-server 中的實現如下:

 

cim-server 收到消息后會在內部緩存中查詢該 userID 的通道,接著只需要發消息即可。

④在線用戶接口

這是一個輔助接口,可以查詢出當前在線用戶信息。

 

實現也很簡單,也就是查詢之前保存 ”用戶登錄狀態的那個去重 set “即可。

⑤私聊接口

之所以說獲取在線用戶是一個輔助接口,其實就是用于輔助私聊使用的。

一般我們使用私聊的前提肯定得知道當前哪些用戶在線,接著你才會知道你要和誰進行私聊。

類似于這樣:

 

在我們這個場景中,私聊的前提就是需要獲得在線用戶的 userID。

 

所以私聊接口在收到消息后需要查詢到接收者所在的 cim-server 實例信息,后續的步驟就和群聊一致了。調用接收者所在實例的 HTTP 接口下發信息。

只是群聊是遍歷所有的在線用戶,私聊只發送一個的區別。

⑥下線接口

一旦客戶端下線,我們就需要將之前存放在 Redis 中的一些信息刪除掉(路由信息、登錄狀態)。

 

IM 客戶端

客戶端中的一些邏輯其實在上文已經談到一些了。

登錄

***步也就是登錄,需要在啟動時調用 Route 的登錄接口,獲得 cim-server 信息再創建連接。

 

登錄過程中 Route 接口會判斷是否為重復登錄,重復登錄則會直接退出程序。

 

接下來是利用 Route 接口返回的 cim-server 實例信息(ip+port)創建連接。

***一步就是發送一個登錄標志的信息到服務端,讓它保持客戶端和 Channel 的關系。

 

自定義協議

上文提到的一些登錄報文、真正的消息報文這些都是在我們自定義協議中可以區別出來的。

由于是使用 Google Protocol Buffer 編解碼,所以先看看原始格式。

 

其實這個協議中目前一共就三個字段:

  • requestId 可以理解為 userId。
  • reqMsg 就是真正的消息。
  • type 也就是上文提到的消息類別。

目前主要是三種類型,分別對應不同的業務:

 

心跳

為了保持客戶端和服務端的連接,每隔一段時間沒有發送消息都需要自動的發送心跳。

目前的策略是每隔一分鐘就發送一個心跳包到服務端:

 

這樣服務端每隔一分鐘沒有收到業務消息時就會收到 Ping 的心跳包:

 

內置命令

 

客戶端也內置了一些基本命令來方便使用。

 

比如輸入 :q 就會退出客戶端,同時會關閉一些系統資源。

 

當輸入 :olu(onlineUser 的簡寫)就會去調用 Route 的獲取所有在線用戶接口。

 

群聊

群聊的使用非常簡單,只需要在控制臺輸入消息回車即可。這時會去調用 Route 的群聊接口。

 

私聊

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

 

消息回調

為了滿足一些定制需求,比如消息需要保存之類的。所以在客戶端收到消息之后會回調一個接口,在這個接口中可以自定義實現。

 

因此先創建了一個 Caller 的 Bean,這個 Bean 中包含了一個 CustomMsgHandleListener 接口,需要自行處理只需要實現此接口即可。

自定義界面

由于我自己不怎么會寫界面,但保不準有其他大牛會寫。所以客戶端中的群聊、私聊、獲取在線用戶、消息回調等業務(以及之后的業務)都是以接口形式提供。

也方便后面做頁面集成,只需要調這些接口就行了;具體實現不用怎么關心。

總結

Cim 目前只是***版,Bug 多,功能少(只拉了幾個群友做了測試);不過后續還會接著完善,至少這一版會給那些沒有相關經驗的朋友帶來一些思路。

后續計劃:

 

責任編輯:武曉燕 來源: crossoverJie
相關推薦

2021-08-14 09:23:03

即時通訊IM互聯網

2025-07-09 08:38:27

2025-04-23 09:21:10

2023-12-08 08:01:29

分布式IM即時通訊系統架構設計

2021-10-20 05:55:22

即時通訊IM網絡

2020-09-30 18:00:48

JavaSpring BootIM

2024-01-22 08:01:17

IM即時通訊系統

2023-12-21 09:10:13

2025-01-06 08:00:54

2011-10-20 22:25:49

網易即時通

2021-05-13 20:20:40

Java架構代碼

2015-07-30 15:54:20

容聯云通訊IM

2024-02-19 00:00:00

Redis分布式

2012-06-11 09:27:17

imo即時通訊

2011-06-30 10:50:24

即時通訊

2012-03-23 21:18:34

imo即時通訊

2011-08-04 14:50:07

263EM

2012-03-05 11:06:28

imo即時通訊

2013-10-16 11:32:55

imoRTX即時通訊

2012-03-30 10:47:05

imo
點贊
收藏

51CTO技術棧公眾號

国产主播中文字幕| 日韩av电影免费播放| 国产精品第九页| 亚洲欧洲色图| 欧美丰满美乳xxx高潮www| 久草精品电影| 欧美成人aaaaⅴ片在线看| 啪啪国产精品| 欧美一区二区视频网站| 黄色动漫网站入口| 国产一二区在线| 国产mv日韩mv欧美| 欧美精品免费看| 醉酒壮男gay强迫野外xx| 蜜桃成人精品| 亚洲午夜私人影院| 亚洲人成网站在线观看播放| 蜜臀av午夜精品| 久久99精品一区二区三区| 91精品国产91久久久| 国产天堂av在线| 精品中文字幕一区二区三区av| 色综合中文综合网| 精品一区二区三区无码视频| 日本高清中文字幕在线| 久久影院电视剧免费观看| 不卡视频一区| 国产精品久久久久久久久久久久久久久久久久| 国产精品毛片一区二区三区| 久久99久久亚洲国产| 精品无码av一区二区三区| 日韩av懂色| 91福利国产精品| 超碰在线免费观看97| 精品毛片一区二区三区| 久久国产精品一区二区| 日韩美女在线播放| 男女视频免费看| 国内精品美女在线观看| 国产午夜精品久久久| 国产一级特黄a大片免费| 99久久精品免费看国产小宝寻花 | 97色在线播放视频| 免费国产羞羞网站美图| 日韩精品免费一区二区三区竹菊| 欧洲一区在线观看| 激情综合在线观看| 亚洲女同志freevdieo| 精品高清美女精品国产区| 日韩成人三级视频| 久久五月精品中文字幕| 亚洲影视资源网| 成人免费在线网| 国产亚av手机在线观看| 亚洲国产综合视频在线观看| 久久香蕉视频网站| 色呦呦在线看| 亚洲成av人片在www色猫咪| 久久艹国产精品| av在线中出| 色综合天天做天天爱| 国产女女做受ⅹxx高潮| 高清电影一区| 亚洲成av人片在线观看无码| 国产精品美女在线播放| a级毛片免费观看在线| 2023国产一二三区日本精品2022| 成人在线精品视频| 中文字幕精品无码一区二区| 亚欧美中日韩视频| 国产精品扒开腿做| 国产精品毛片一区二区在线看舒淇| 亚洲国产欧美国产综合一区| 久久久精品一区| 久久久久成人片免费观看蜜芽| 99久久.com| 国产亚洲精品久久| 免费国产羞羞网站美图| 久久神马影院| 欧美极品少妇xxxxⅹ免费视频| 天海翼在线视频| 欧美体内she精视频在线观看| 日韩在线视频免费观看高清中文 | 国产精品全国免费观看高清 | 色片在线免费观看| 国产精品99久久免费| 日韩精品一区二区在线| 国产精品一级黄片| 欧美黄色录像片| 97国产在线观看| 在线观看视频二区| www.亚洲国产| 中文字幕中文字幕一区三区| 大地资源中文在线观看免费版| 91天堂素人约啪| 一区二区三区偷拍| 国产乱码精品一区二三赶尸艳谈| 亚洲国产精品麻豆| 亚洲欧美国产中文| 极品尤物一区| 久久精品成人动漫| 97久久久久久久| 韩国毛片一区二区三区| 九色综合日本| 神马午夜伦理不卡 | 久久免费看少妇高潮v片特黄| 久久视频精品| 欧美在线视频在线播放完整版免费观看| 在线观看免费国产视频| 狠狠色丁香婷综合久久| 老牛影视免费一区二区| 黄色软件在线| 亚洲午夜激情av| 奇米精品一区二区三区| 91精品亚洲一区在线观看| 精品亚洲一区二区三区在线观看| 中文字幕第20页| 99精品视频在线| 欧美一区二区三区图| 亚洲精品一区二区三区四区 | 精品人体无码一区二区三区| **女人18毛片一区二区| 国产精品劲爆视频| 青青青草网站免费视频在线观看| 国产女人18毛片水真多成人如厕| 亚洲人一区二区| 欧洲精品二区| 制服丝袜在线91| 欧美巨胸大乳hitomi| 久久亚洲不卡| 蜜桃久久精品乱码一区二区| wwww在线观看免费视频| 欧美成人一区二区三区在线观看| 亚洲欧美日本一区| 国产一区二区中文| 亚洲一区二区三区四区在线播放| 俄罗斯嫩小性bbwbbw| 亚洲男人天堂av网| 中文字幕第22页| 先锋资源久久| 欧洲日本亚洲国产区| 日本黄色不卡视频| 中文字幕一区二区三区视频| 18禁裸男晨勃露j毛免费观看| 免费亚洲电影| 欧美不卡视频一区| 久草网站在线观看| 国产成人高清视频| 日韩极品视频在线观看 | 日韩男女性生活视频| 视频三区在线观看| 色综合天天性综合| 在线观看免费视频黄| 日韩激情在线| 国产专区欧美专区| 99福利在线| 欧美在线一区二区三区| 青青青视频在线免费观看| 麻豆中文一区二区| 国产欧美自拍视频| 日韩激情综合| 久久免费在线观看| 飘雪影院手机免费高清版在线观看| 夜夜精品浪潮av一区二区三区| 午夜精品在线免费观看| 日本一区二区三区视频| 91欧美视频网站| 欧美精品videossex少妇| 亚洲精品在线电影| 无码人妻一区二区三区免费| 国产精品入口麻豆九色| 九色porny91| 999视频精品| 成人动漫在线视频| wwwav在线| 亚洲精品999| 一区二区视频免费| 亚洲国产视频一区二区| 短视频在线观看| 久久狠狠亚洲综合| r级无码视频在线观看| 精品九九在线| 91原创国产| 奇米777日韩| 另类视频在线观看| 日韩a在线观看| 7777精品伊人久久久大香线蕉最新版| 超碰97av在线| 成人一区在线观看| 亚洲老女人av| 精品999网站| 亚洲午夜精品一区二区| 红杏一区二区三区| 成人福利视频在线观看| 天堂资源在线| 欧美成人精品在线播放| 久草福利在线| 亚洲电影免费观看高清| 日韩欧美a级片| 国产精品久久久久四虎| 日本免费色视频| 欧美亚洲三级| 日韩精品综合在线| 国产精品成人a在线观看| 久久99欧美| 伊人久久噜噜噜躁狠狠躁| 国产精品久久久久久久一区探花| 成人在线播放视频| 亚洲精品av在线| 国产成人精品毛片| 亚洲成av人片在线| xxxx日本少妇| 国产精品久久久久久亚洲伦| 手机在线免费毛片| 日韩av电影天堂| 欧美二区在线视频| 狠久久av成人天堂| 在线观看成人免费| 凹凸成人精品亚洲精品密奴| 国产精品对白一区二区三区| 欧洲亚洲精品久久久久| 国产精品激情自拍| 另类图片综合电影| 91精品国产高清自在线看超| 国产精品69xx| 久久久亚洲欧洲日产国码aⅴ| 日本aaa在线观看| 亚洲国产精品国自产拍av秋霞| 波多野结衣爱爱| 日韩欧美国产成人| 国产成人精品片| 精品久久久久久电影| youjizz亚洲女人| 久久午夜色播影院免费高清| 国产精品伦子伦| 九九精品视频在线看| 91看片在线免费观看| 久久九九99| 那种视频在线观看| 麻豆亚洲精品| 日韩精品免费播放| 老牛嫩草一区二区三区日本 | 欧美视频免费在线| 亚洲熟女少妇一区二区| 欧美国产精品v| 亚洲美女精品视频| 久久精品亚洲一区二区| 波多野结衣家庭教师视频| 亚洲免费网址| 无颜之月在线看| 亚洲免费二区| 成人午夜免费剧场| 国内在线观看一区二区三区| 亚洲精品电影在线一区| 日韩欧美二区| 91香蕉视频网址| 红桃视频欧美| 免费看黄在线看| 欧美亚洲一区| 麻豆一区二区三区视频| 九一九一国产精品| 色综合av综合无码综合网站| 日韩高清不卡在线| 一本一道久久a久久综合蜜桃| 久久先锋资源| 超碰在线公开97| 国产成人精品网址| 国产 中文 字幕 日韩 在线| 国产白丝网站精品污在线入口| 亚洲不卡视频在线| 久久综合九色| 一二三级黄色片| 高清不卡一二三区| 熟女人妻一区二区三区免费看| 久草这里只有精品视频| 熟妇人妻无乱码中文字幕真矢织江| 亚洲精品日本| www.av毛片| 好看的亚洲午夜视频在线| 欧美在线观看成人| 美女视频一区在线观看| 色婷婷狠狠18禁久久| 国产精品综合网| 特大黑人巨人吊xxxx| 91一区二区三区在线观看| 国产伦理片在线观看| 1区2区3区精品视频| 天海翼一区二区| 欧美日韩国产中文| 在线免费观看一级片| 欧美色综合网站| 免费观看a视频| 日韩中文字幕免费| 97蜜桃久久| 国产精品丝袜一区二区三区| 国产精品久久久久av蜜臀 | 一区二区亚洲视频| 日本在线视频不卡| 国产精品多人| 久久国产精品国产精品| av不卡在线播放| 91嫩草|国产丨精品入口| 色综合天天综合狠狠| 国产精品国产精品国产| 精品日韩一区二区三区免费视频| 涩涩视频免费看| 精品国产美女在线| 亚洲www.| 久久精品人人做人人爽电影| 欧美国产高潮xxxx1819| 天天爽夜夜爽一区二区三区| kk眼镜猥琐国模调教系列一区二区| 蜜桃传媒一区二区亚洲av| 一区二区成人在线视频| 久久久午夜影院| 精品处破学生在线二十三| 免费黄色在线看| 国产精品久久久久久久av电影| 91精品亚洲一区在线观看| 天堂资源在线亚洲资源| 久久久久久久久久久9不雅视频| 日韩中文在线字幕| 美国毛片一区二区| 久久久久久久久福利| 色综合天天综合网国产成人综合天| 一级黄色大片免费| 精品国产1区二区| 国产二区三区在线| 成人精品一区二区三区电影免费 | 国产一级免费av| 91精品国产欧美一区二区18| 1769在线观看| 国产精品高潮呻吟久久av野狼| 国产精品亚洲综合在线观看| 一本一道久久久a久久久精品91| 精品动漫3d一区二区三区免费版 | 久久久久香蕉视频| 91官网在线免费观看| 日本又骚又刺激的视频在线观看| 久久精品人人爽| 麻豆网站免费在线观看| 国产中文一区二区| 精品电影一区| 北岛玲一区二区| 精品久久久久久久久久ntr影视| 91激情在线观看| 亚洲新声在线观看| 国产私拍福利精品视频二区| 亚洲精品一区二区三区樱花| 奇米亚洲午夜久久精品| av免费播放网站| 欧美肥胖老妇做爰| 日本在线视频www鲁啊鲁| 成人欧美一区二区| 国产日韩亚洲| 色综合99久久久无码国产精品| 亚洲成人在线观看视频| 色香蕉在线视频| 欧美久久精品一级黑人c片| 欧美日本三级| 欧美成人免费在线观看视频| 久久女同互慰一区二区三区| 在线观看免费中文字幕| 欧美成人h版在线观看| 精品久久99| 日韩人妻一区二区三区蜜桃视频| 久久精品国产秦先生| 亚洲永久精品ww.7491进入| 91福利国产精品| 国产三区在线观看| 国产精品一区二| 老司机午夜精品视频在线观看| 亚洲视频在线播放免费| 91电影在线观看| 操你啦视频在线| 久久精品magnetxturnbtih| 亚洲免费观看| 国产激情av在线| 精品三级av在线| 日韩不卡在线| 亚洲av综合色区| 91蝌蚪porny| 久久久精品免费看| 最新中文字幕亚洲| 久久狠狠久久| 狠狠干狠狠操视频| 亚洲高清不卡在线观看| 亚洲国产福利视频| 日韩av片免费在线观看| 91精品国产麻豆国产在线观看| 欧美精品久久久久久久久25p| 亚洲国产精品激情在线观看| 东京干手机福利视频| 国产精品视频中文字幕91| 亚洲先锋成人| 操她视频在线观看| 精品亚洲一区二区三区| 精品无人乱码一区二区三区| www.在线观看av| 中文字幕五月欧美|