golang寫的即時通訊伺服器
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介面,提供一些聊天系統基本的業務功能,例如,登入,註冊,新增好友,刪除好友,建立群組,新增人到群組,群組踢人等功能
3 拆包粘包以及訊息協議
TCP拆包粘包是自己寫的一個演算法,其思想就是每次從系統緩衝讀取資料流,放置到自己實現的一個buffer中,以後拆包粘包,還是訊息解碼都是在這個buffer完成,其目的是減少記憶體拷貝,提高效能。
其中每一個TCP都遵循TLV格式(即型別,長度,值),第一部分由兩個位元組來標示資料型別,第二部分用兩個位元組來標示資料長度,第三部分則是真正要解碼的資料。
訊息協議使用Google的Protocol Buffers,具體訊息協議定製在/public/proto包下
4 訊息唯一id
唯一訊息id的主要作用是用來標示一次訊息傳送的完整流程,訊息傳送->訊息投遞->訊息投遞迴執,用來線上排查線上問題。
每一個訊息有唯一的訊息的id,由於訊息傳送頻率比較高,所以效能就很重要,當時沒有找到合適第三方庫,所以就自己實現了一個,原理就是,每次從資料庫中拿一個資料段,用完了再去資料庫拿,當用完之後去從資料庫拿的時候,會有一小會的阻塞,為了解決這個問題,就做成了非同步的,就是保證記憶體中有n個可用的id,當id消耗掉小於n個時,就從資料庫獲取生成,當達到n個時,goroutine阻塞等待id被消耗,如此往復。
5 主要邏輯
client: 客戶端
connect:連線層
logic:邏輯層
mysql:儲存層
登入
單發
群發
6 日誌
使用了zap的日誌框架,下圖展示了一次兩個裝置從登入,發一條訊息,再到下線的一次流程的完整日誌
7 api文件
https://documenter.getpostman.com/view/4164957/RzZ4q2hJ
8 github
相關文章
- golang寫的即時通訊伺服器gimGolang伺服器
- golang寫的即時通訊伺服器gim,支援TCP,WebSocketGolang伺服器TCPWeb
- Socket搭建即時通訊伺服器伺服器
- 即時通訊
- 即時通訊和即時通訊的區別是什麼,都有什麼特點?
- koa-socket即時通訊
- 小程式即時通訊demo
- iOS流式即時通訊教程iOS
- eddChat即時通訊(聊天系統)
- [場景設計]即時通訊
- 即時通訊視訊聊天原理是什麼
- 即時通訊技術文集(第13期):Web端即時通訊技術精華合集 [共15篇]Web
- 基於 swoole擴充套件 的即時通訊 im套件
- 交友原始碼中即時通訊怎麼工作的?原始碼
- Android 即時通訊開發小結(二)Android
- iOS整合融雲SDK即時通訊整理iOS
- java WebSocket 即時通訊配置使用說明JavaWeb
- 重新認識融雲,「不止即時通訊」
- Linux安裝即時通訊軟體SignalLinux
- Android學習筆記--基於XMPP的即時通訊Android筆記
- QT開發的即時通訊軟體(基於UDP)QTUDP
- 實現在安卓平臺下的即時通訊安卓
- 企業即時通訊是免費OA質的提升
- 「實戰」搭建完整的IM(即時通訊)應用(2)
- 「實戰」搭建完整的IM(即時通訊)應用(1)
- 即時通訊傳送檔案的方法有幾種?
- Android 接入騰訊IM即時通訊(詳細圖文)Android
- flutter 呼叫環信sdk 實現即時通訊Flutter
- DAPP即時通訊系統開發(詳細案例)丨DAPP即時通訊系統開發(方案規則)/原始碼APP原始碼
- 騰訊互動白板+即時通訊+實時音視訊,Android學生端接入Android
- Java Websocket實現即時通訊功能入門教程JavaWeb
- 開源企業即時通訊和線上客服
- golang寫的IM伺服器(文件更新)Golang伺服器
- 即時通訊IM,是時代進步的逆流?看看JNPF怎麼說
- DAPP區塊鏈即時通訊系統開發(功能詳情)丨DAPP即時通訊系統開發(原始碼專案)APP區塊鏈原始碼
- Golang 編寫 Tcp 伺服器GolangTCP伺服器
- 基於 go-Laravel-broadcast 實現 Laravel 的即時通訊(Broadcasting)GoLaravelAST
- 一套簡單的web即時通訊——第二版Web