前言
今天給大家推薦一個(gè).NET Core WebSocket實(shí)現(xiàn)簡(jiǎn)易、高性能、集群即時(shí)通訊組件:FreeIM。
官方組件介紹
FreeIM 使用 WebSocket 協(xié)議實(shí)現(xiàn)簡(jiǎn)易、高性能(單機(jī)支持5萬+連接)、集群即時(shí)通訊組件,支持點(diǎn)對(duì)點(diǎn)通訊、群聊通訊、上線下線事件消息等眾多實(shí)用性功能。
WebSocket介紹
WebSocket是一種在Web應(yīng)用程序和服務(wù)器之間建立持久連接的通信協(xié)議。它通過在客戶端和服務(wù)器之間創(chuàng)建一個(gè)全雙工通信通道,實(shí)現(xiàn)了服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù)的功能。
相比起傳統(tǒng)的HTTP請(qǐng)求-響應(yīng)模式,WebSocket具有以下幾個(gè)優(yōu)勢(shì):
實(shí)時(shí)性:WebSocket提供了實(shí)時(shí)的雙向通信,服務(wù)器可以主動(dòng)推送數(shù)據(jù)給客戶端,而不需要客戶端發(fā)起請(qǐng)求。這使得實(shí)時(shí)通信應(yīng)用如聊天室、股票行情等變得更加簡(jiǎn)單和高效。
減少數(shù)據(jù)傳輸量:WebSocket在建立連接時(shí)需要進(jìn)行握手,之后數(shù)據(jù)幀的開銷較小,只需要發(fā)送少量的控制信息,因此相比于HTTP請(qǐng)求的頭部信息,可以減少數(shù)據(jù)傳輸?shù)拈_銷。
低延遲:由于WebSocket是一個(gè)長(zhǎng)連接,避免了每次請(qǐng)求都要建立TCP連接的開銷,從而降低了延遲。
節(jié)省服務(wù)器資源:WebSocket使用一個(gè)TCP連接進(jìn)行全雙工通信,相比于傳統(tǒng)的HTTP請(qǐng)求,避免了頻繁的連接和關(guān)閉操作,減少了服務(wù)器的負(fù)擔(dān)。
支持跨域通信:WebSocket允許在瀏覽器中通過Javascript與不同域名下的服務(wù)器進(jìn)行通信,實(shí)現(xiàn)了跨域通信的功能。
項(xiàng)目源碼截圖

設(shè)計(jì)思路
終端
(如瀏覽器/小程序/iOS/android) 統(tǒng)一使用 websocket 連接 ImServer
;
ImServer
(支持集群)根據(jù) clientId 分區(qū)管理 websocket 連接;
WebApi
使用 ImHelper 調(diào)用方法(如:SendMessage、群聊相關(guān)方法),將數(shù)據(jù)推至 Redis chan;
ImServer
訂閱 Redis chan,收到消息后向 終端
推送消息;
- 解耦了業(yè)務(wù)和通訊,架構(gòu)更加清淅;
ImServer
充當(dāng)消息轉(zhuǎn)發(fā),連接維護(hù),代碼萬年不變、且不需要重啟維護(hù)WebApi
負(fù)責(zé)所有業(yè)務(wù)
ImServer 服務(wù)端
public void Configure(IApplicationBuilder app)
{
app.UseFreeImServer(new ImServerOptions
{
Redis = new FreeRedis.RedisClient("127.0.0.1:6379,poolsize=5"),
Servers = new[] { "127.0.0.1:6001" }, //集群配置
Server = "127.0.0.1:6001"
});
}
WebApi 業(yè)務(wù)端
public void Configure(IApplicationBuilder app)
{
//...
ImHelper.Initialization(new ImClientOptions
{
Redis = new FreeRedis.RedisClient("127.0.0.1:6379,poolsize=5"),
Servers = new[] { "127.0.0.1:6001" }
});
ImHelper.EventBus(
t => Console.WriteLine(t.clientId + "上線了"),
t => Console.WriteLine(t.clientId + "下線了"));
}
Html5 終端
終端連接 websocket 前,應(yīng)該先請(qǐng)求 WebApi 獲得授權(quán)過的地址(ImHelper.PrevConnectServer),偽代碼:
ajax('/prev-connect-imserver', function(data) {
var url = data; //此時(shí)的值:ws://127.0.0.1:6001/ws?token=xxxxx
var sock = new WebSocket(url);
sock.onmessage = function (e) {
//...
};
})
項(xiàng)目源碼
更多實(shí)用功能特性歡迎前往開源地址查看👀,別忘了給項(xiàng)目一個(gè)Star💖。
https://github.com/2881099/FreeIM
該文章在 2023/8/25 9:15:31 編輯過