[程式碼已開源]叢集聊天伺服器與客戶端開發

EricLing0529發表於2024-03-27
  • 伺服器
    • 服務
    • 技術特點
    • 如何使用
    • 依賴庫
  • 客戶端

伺服器

伺服器程式碼在https://gitee.com/ericling666/sponge,對應的客戶端原始碼在https://gitee.com/ericling666/spongeclient

對本專案的演示,請看影片【叢集聊天伺服器與仿微信客戶端開發,伺服器基於muduo,mysql,redis,客戶端基於Qt6和FluentUI,程式碼已開源】

伺服器可用於本地部署,也可以部署到雲端,使用docker compose一行程式碼就能部署所有服務,主要有以下服務:
img
詳細的配置資訊見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>快速驗證是否啟動成功
img

你還可以輸入以下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地址和埠號

當然也可以在配置檔案中修改

相關文章