純golang編寫的分布式可伸縮IM服務器:FishChatServer
FishChatServer
FishChat(魚傳 -魚傳尺素) - FishChat是一款優秀的即時通訊軟件(IM), 它集合了市面上已有產品的優點, 并具備智能硬件網關管理(學習QQ物聯思想, 構思中).
NOTE: 魚傳取自古樂府《飲馬長城窟行》客從遠方來, 遺我雙鯉魚. 呼兒烹鯉魚, 中有尺素書.
FishChat Android客戶端見 https://github.com/oikomi/FishChatAndroid (緊張開發中)
Status
It is not usable yet and still under early development.
Todo
- support p2p communication
- support group communication
- support message encryption
- support file transfer
- support audio
- support video
系統架構
關鍵服務器詳解
gateway
gateway server主要是接受client請求,進行通用的功能設置,目前這塊只做了分配msg_server的功能,后面可根據需要進行擴展
在gateway server的配置文件中最重要的是配置msg_server列表
"MsgServerList" : [ "192.168.159.169:19000", "192.168.159.169:19001" ],
msg_server
msg_server是消息的主體,維護著客戶端連接和keeplive,同時要注意router、manager和monitor都訂閱了msg_server的channel
SYSCTRL_CLIENT_STATUS = "/sysctrl/client-status" SYSCTRL_TOPIC_STATUS = "/sysctrl/topic-status" SYSCTRL_TOPIC_SYNC = "/sysctrl/topic-sync" SYSCTRL_SEND = "/sysctrl/send" SYSCTRL_MONITOR = "/sysctrl/monitor"
這些channel保證了msg_server在事件觸發時會廣播通知后面的router、manager和monitor服務
router
router顧名思義是做了msg_server之間的消息轉發
manager
manager主要是管理client信息存儲、離線消息存儲等等,通過它和redis聯系
monitor
monitor主要是收集監控各服務器狀態信息,目前monitor是可選項,可按需要啟動它
部署
FishChatServer采用分布式可伸縮部署方式。如果沒有多機條件,可以單機部署:
建議: 單機測試部署
- gateway一臺
- msg_server兩臺
- router一臺
- manager一臺
- monitor一臺
NOTE: FishChatServer依賴redis,請先啟動redis,讓它監聽在默認端口
NOTE: 可以通過修改各文件夾下面的json配置文件配置服務器參數
./gateway
./msg_server -conf_file=msg_server.19001.json
./msg_server -conf_file=msg_server.19000.json
./router
./manager
./monitor
當然你可以修改各文件夾下面的json配置文件修改配置參數
NOTE: router、manager和monitor一定要在msg_server啟動之后啟動,因為他們都訂閱了msg_server的channel
技術細節
FishChatServer完全采用Golang開發(https://golang.org/)
音視頻方案
音視頻采用nginx-rtmp架構,借助ffmpeg技術,客戶端輸出rtmp流,服務器輸出hls流
協議
1. client to MsgServer
syntax: SEND_PING_CMD
format: SEND_CLIENT_ID
syntax: SEND_CLIENT_ID_CMD
format: SEND_CLIENT_ID ID