組件分享之后端組件——組件化、高擴(kuò)展性、高性能的開源服務(wù)器網(wǎng)絡(luò)庫cellnet
背景
近期正在探索前端、后端、系統(tǒng)端各類常用組件與工具,對其一些常見的組件進(jìn)行再次整理一下,形成標(biāo)準(zhǔn)化組件專題,后續(xù)該專題將包含各類語言中的一些常用組件。歡迎大家進(jìn)行持續(xù)關(guān)注。
組件基本信息
- 組件:cellnet
- 開源協(xié)議:MIT License
內(nèi)容
本節(jié)我們進(jìn)行分享一個組件化、高擴(kuò)展性、高性能的開源服務(wù)器網(wǎng)絡(luò)庫cellnet,以下是其官方介紹的應(yīng)用領(lǐng)域:
主要使用領(lǐng)域:
游戲服務(wù)器
方便定制私有協(xié)議,快速構(gòu)建邏輯服務(wù)器、網(wǎng)關(guān)服務(wù)器、服務(wù)器間互聯(lián)互通、對接第三方SDK、轉(zhuǎn)換編碼協(xié)議等
ARM設(shè)備
設(shè)備間網(wǎng)絡(luò)通訊
證券軟件
內(nèi)部RPC
它能讓我們在建立一些TCP連接器時進(jìn)行有效重連、優(yōu)化重啟,其架構(gòu)可以參考下圖

image.png
使用案例如下:
const peerAddress = "127.0.0.1:17701"
// 服務(wù)器邏輯
func server() {
// 創(chuàng)建服務(wù)器的事件隊列,所有的消息,事件都會被投入這個隊列處理
queue := cellnet.NewEventQueue()
// 創(chuàng)建一個服務(wù)器的接受器(Acceptor),接受客戶端的連接
peerIns := peer.NewGenericPeer("tcp.Acceptor", "server", peerAddress, queue)
// 將接受器Peer與tcp.ltv的處理器綁定,并設(shè)置事件處理回調(diào)
// tcp.ltv處理器負(fù)責(zé)處理消息收發(fā),使用私有的封包格式以及日志,RPC等處理
proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {
// 處理Peer收到的各種事件
switch msg := ev.Message().(type) {
case *cellnet.SessionAccepted: // 接受一個連接
fmt.Println("server accepted")
case *TestEchoACK: // 收到連接發(fā)送的消息
fmt.Printf("server recv %+v\n", msg)
// 發(fā)送回應(yīng)消息
ev.Session().Send(&TestEchoACK{
Msg: msg.Msg,
Value: msg.Value,
})
case *cellnet.SessionClosed: // 會話連接斷開
fmt.Println("session closed: ", ev.Session().ID())
}
})
// 啟動Peer,服務(wù)器開始偵聽
peerIns.Start()
// 開啟事件隊列,開始處理事件,此函數(shù)不阻塞
queue.StartLoop()
}
// 模擬客戶端邏輯
func client() {
// 例子專用的完成標(biāo)記
done := make(chan struct{})
// 創(chuàng)建客戶端的事件處理隊列
queue := cellnet.NewEventQueue()
// 創(chuàng)建客戶端的連接器
peerIns := peer.NewGenericPeer("tcp.Connector", "client", peerAddress, queue)
// 將客戶端連接器Peer與tcp.ltv處理器綁定,并設(shè)置接收事件回調(diào)
proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {
switch msg := ev.Message().(type) {
case *cellnet.SessionConnected: // 已經(jīng)連接上
fmt.Println("client connected")
ev.Session().Send(&TestEchoACK{
Msg: "hello",
Value: 1234,
})
case *TestEchoACK: //收到服務(wù)器發(fā)送的消息
fmt.Printf("client recv %+v\n", msg)
// 完成操作
done <- struct{}{}
case *cellnet.SessionClosed:
fmt.Println("client closed")
}
})
// 開啟客戶端Peer
peerIns.Start()
// 開啟客戶端隊列處理
queue.StartLoop()
// 等待客戶端收到消息
<-done
}
以上內(nèi)容均來源于cellnet中的README,有需要的小伙伴可以進(jìn)行點擊深入了解,目前游戲領(lǐng)域使用還是比較多的。
本文聲明:

88x31.png
知識共享許可協(xié)議
本作品由 cn華少 采用 知識共享署名-非商業(yè)性使用 4.0 國際許可協(xié)議 進(jìn)行許可。