默認
發表評論 3
想開發IM:買成品怕坑?租第3方怕貴?找開源自已擼?盡量別走彎路了... 找站長給點建議
go語言寫的IM服務器
閱讀(9185) | 評論(3 收藏2 淘帖
1 簡要介紹
goim是一個即時通訊服務器,代碼全部使用golang完成,功能包含好友之間一對一聊天,群組聊天,支持單用戶多設備同時在線,就像微信一樣,當你同時使用兩個設備登錄賬號時,兩個設備可以都可以接收到消息,當你用一個設備發送消息時,另一個設備也能收到你發送的消息。目前完成了第一版,第一版不想做的太復雜龐大,但是好多細節邏輯都做了反復的推敲,其主要目的是先作出核心功能,不考略加緩存和MQ提高性能,所以還不是很完善,以后會逐漸完善。2 所用技術
golang+mysql完成,web框架使用了gin(對gin進行了簡單的封裝),日志框架使用了zap,當然也自己寫了一些小組件,例如TCP拆包粘包,唯一消息id生成器,數據庫統一事務管理等。
3 項目分層設計
項目主要氛圍兩層,connect層和logic層,public包下放置了一些connect層和logic層公用的代碼和一些基礎庫。  
connect連接層,主要維護和客戶端的tcp連接,所以connect是有狀態的,connect包含了TCP拆包粘包,消息解碼,客戶端心跳等一些邏輯。   
logic邏輯層是無狀態的,主要維護消息的轉發邏輯,以及對外提供http接口,提供一些聊天系統基本的業務功能,例如,登錄,注冊,添加好友,刪除好友,創建群組,添加人到群組,群組踢人等功能
4 拆包粘包以及消息協議
TCP拆包粘包是自己寫的一個算法,其思想就是每次從系統緩沖讀取數據流,放置到自己實現的一個buffer中,以后拆包粘包,還是消息解碼都是在這個buffer完成,其目的是減少內存拷貝,提高性能。  
其中每一個TCP都遵循TLV格式(即類型,長度,值),第一部分由兩個字節來標示數據類型,第二部分用兩個字節來標示數據長度,第三部分則是真正要解碼的數據。  
消息協議使用Google的Protocol Buffers,具體消息協議定制在/public/proto包下  

5 消息唯一id
唯一消息id的主要作用是用來標示一次消息發送的完整流程,消息發送->消息投遞->消息投遞回執,用來線上排查線上問題。  
每一個消息有唯一的消息的id,由于消息發送頻率比較高s,所以性能就很重要,當時沒有找到合適第三方庫,所以就自己實現了一個,原理就是,每次從數據庫中拿一個數據段,用完了再去數據庫拿,當用完之后去從數據庫拿的時候,會有一小會的阻塞,為了解決這個問題,就做成了異步的,就是保證內存中有n個可用的id,當id消耗掉小于n個時,就從數據庫獲取生成,當達到n個時,goroutine阻塞等待id被消耗,如此往復。

6 主要邏輯
client: 客戶端  
connect:連接層  
logic:邏輯層  
mysql:存儲層  

登錄
                                    

單發
                                                  
群發
                                             
7 日志
使用了zap的日志框架,下圖展示了一次兩個設備從登錄,發一條消息,再到下線的一次流程的完整日志

8 api文檔
https://documenter.getpostman.com/view/4164957/RzZ4q2hJ
9 github
https://github.com/alberliu/goim





即時通訊網 - 即時通訊開發者社區! 來源: - 即時通訊開發者社區!

推薦方案
評論 3
頂一下,怎么聯系作者詳聊
引用:hcjs 發表于 2019-03-27 15:28
頂一下,怎么聯系作者詳聊

作者已經把它的代碼開源了
簽名: 《主流移動端賬號登錄方式的原理及設計思路》http://www.uktmgv.tw/thread-2863-1-1.html
牛逼,學習一下。
打賞樓主 ×
使用微信打賞! 使用支付寶打賞!

返回頂部
曾氏料二肖中特