- 伺服器
- 服務
- 技術特點
- 如何使用
- 依賴庫
- 客戶端
伺服器
伺服器程式碼在https://gitee.com/ericling666/sponge,對應的客戶端原始碼在https://gitee.com/ericling666/spongeclient。
對本專案的演示,請看影片【叢集聊天伺服器與仿微信客戶端開發,伺服器基於muduo,mysql,redis,客戶端基於Qt6和FluentUI,程式碼已開源】
伺服器可用於本地部署,也可以部署到雲端,使用docker compose一行程式碼就能部署所有服務,主要有以下服務:
詳細的配置資訊見docker compose檔案。
服務
- mysql,埠均是3306,方便資料庫客戶端直連。
- nginx,埠是8000,反向代理了三個服務節點server1、server2、server3。
- redis,埠是6379,方便redis客戶端直連。
- server1、server2、server3隨機埠,容器內部分別指定為8001、8002、8003,還可以任意新增多個sponge server服務,然後用nginx做負載均衡,這裡僅配置了三臺。
技術特點
- 採用tcp長連線實現資料通訊,訊息傳遞直接透過目標使用者的tcp長連結發到客戶端。
- 對於不在同一臺伺服器上的兩個使用者之間的通訊,使用redis的釋出訂閱功能實現訊息的轉發。redis的connector是
redis-plus-plus
,對redis的連線實現了一個連線池,見redisconnectionpool.h。 - 支援離線訊息,把離線訊息儲存到mysql資料庫中,對mysql資料庫的連線,實現了一個資料庫連線池mysqlconnectionpool。
- 使用muduo網路庫實現網路通訊。
- 使用json解析資料,有自定義的應用層協議欄位。
- 使用dockerfile快速構建映象,對第三方依賴透過git submodule實現版本控制和依賴管理,方便部署。
- 使用nginx實現傳輸層反向代理、負載均衡,所有服務透過docker compose直接啟動,方便管理和維護。
- 使用cmake構建,沒有使用平臺特定的API, 依賴庫也都是跨平臺的,因此,理論上,支援windows、mac、linux,但是僅在linux上測試過。
- 實現了一個執行緒安全的非同步日誌工具類,見logger.h,對INFO和ERROR兩種日誌型別分別輸出到檔案和終端。
如何使用
有兩種部署方式,一種是僅編譯spongeserver服務,然後其它服務使用本地安裝或者docker容器,另一種辦法則是全部用docker部署,只需要使用docker compose一行程式碼就能啟動所有容器。
第一種辦法,可以參考dockerfile檔案給出的編譯命令,以下簡單給出命令和說明。
# 下載本倉庫,必須帶上--recursive,這樣會自動克隆muduo,hiredis,redis-plus-plus這幾個子模組
git clone --recursive https://gitee.com/ericling666/sponge
sudo apt update
# 安裝mysql的connector
sudo apt install libmysqlcppconn-dev
# 編譯、安裝muduo網路庫
mkdir -p /path to sponge/dependencies/muduo/build
cd /path to sponge/dependencies/muduo/build
cmake -DMUDUO_BUILD_EXAMPLES=OFF ..
make -j4
sudo make install
# 編譯、安裝hiredis庫
mkdir -p /path to sponge/dependencies/hiredis/build
cd /path to sponge/dependencies/hiredis/build
cmake ..
make -j4
sudo make install
# 編譯、安裝redis-plus-plus庫
mkdir -p /path to sponge/dependencies/redis-plus-plus/build
cd /path to sponge/dependencies/redis-plus-plus/build
cmake -DREDIS_PLUS_PLUS_CXX_STANDARD=11 -DREDIS_PLUS_PLUS_BUILD_STATIC=OFF -DREDIS_PLUS_PLUS_BUILD_TEST=OFF ..
make -j4
sudo make install
# 編譯 sponge server
mkdir -p /path to sponge/build
cd /path to sponge/build
cmake -DCMAKE_BUILD_TYPE=release -DSPONGE_DISABLE_EXAMPLES=ON -DSPONGE_DISABLE_TESTS=ON ..
make -j4
# 修改mysql和redis的ip地址,(埠號如果不一致也要相應修改),這裡是把localhost修改為$mysql和$redis,你需要把$mysql、$redis修改為對應的ip地址
sed -i 's/localhost/$mysql/g' /path to sponge/bin/mysql.cnf
sed -i 's/localhost/$redis/g' /path to sponge/bin/redis.cnf
cd /path to sponge/bin
# 啟動server程序,監聽8000埠
./server 0.0.0.0 8000
此外,還需要匯入資料庫表,匯入指令碼見檔案sponge.sql。
nginx的配置見檔案nginx.conf和檔案sponge.conf。
第一種辦法,相對麻煩,推薦第二種辦法,命令如下,影片中演示的也是這種方案,可以快速部署,上雲。
# 下載本倉庫,必須帶上--recursive,這樣會自動克隆muduo,hiredis,redis-plus-plus這幾個子模組
git clone --recursive https://gitee.com/ericling666/sponge
# 啟動所有服務,這會下載mysql、redis、nginx等映象,並且下載ubuntu映象,用於構建sponge server映象,構建指令碼見dockerfile檔案
docker compose up -d
伺服器啟動之後,可以透過nc <ip> <port>
快速驗證是否啟動成功
你還可以輸入以下json格式的字串,而不需要客戶端,直接與伺服器通訊:
// 使用者登入
{"msgType":1, "USERID":6, "password":"6"}
// 註冊使用者
{"msgType":2, "name":"Eric Ling", "password":"whatever"}
// 退出登入
{"msgType":3, "USERID":7}
// 使用者聊天
{"msgType":4,"FROMID":6,"TOID":8,"msg":"你好 8號","sendTime":1703078264002}
// 新增好友
{"msgType":6,"U1":1,"U2":2}
// 查詢好友
{"msgType":8,"FROMID":6}
// 群聊訊息
{"msgType":9,"FROMID":6,"GROUPID":8,"msg":"你好 8號","sendTime":1703078264002}
// 加入群聊
{"msgType":10,"FROMID":6,"GROUPID":7}
// 建立群聊
{"msgType":12,"FROMID":6,"name":"cpp","description":"cpp group."}
// 查詢離線訊息
{"msgType":14,"FROMID":1}
// 查詢賬號
{"msgType":15,"keyword":"1"}
依賴庫
其中libmysqlcppconn-dev是透過apt直接安裝的,json庫是header only,其它三個庫都是從原始碼構建的
- libmysqlcppconn-dev
- muduo
- hiredis
- redis-plus-plus
- json
客戶端
頁面參考了https://github.com/zhuzichu520/kim-qt的程式碼,該專案是FluentUI的作者編寫的,僅開源了客戶端的程式碼,使用的是websocket,服務端使用netty和java實現。
本專案的客戶端基本仿照他的kim-qt程式碼實現的。
客戶端的編譯,需要用到Qt6,在windows和linux mint中都編譯過,僅測試過6.2.4和6.6.2兩個版本,其它Qt6的版本應該也可以,沒有試過Qt5版本
首先下載本倉庫
git clone https://gitee.com/ericling666/spongeclient
克隆到本地之後,還需要下載依賴庫,在spongeclient目錄下執行以下命令
git clone https://github.com/zhuzichu520/fluentui
然後用qt creator開啟, 進行編譯即可
在首次使用時,需要在設定中修改伺服器的ip地址和埠號
當然也可以在配置檔案中修改