組件分享之后端組件——組件化、高擴(kuò)展性、高性能的開源服務(wù)器網(wǎng)絡(luò)庫cellnet

組件分享之后端組件——組件化、高擴(kuò)展性、高性能的開源服務(wù)器網(wǎng)絡(luò)庫cellnet

背景

近期正在探索前端、后端、系統(tǒng)端各類常用組件與工具,對其一些常見的組件進(jìn)行再次整理一下,形成標(biāo)準(zhǔn)化組件專題,后續(xù)該專題將包含各類語言中的一些常用組件。歡迎大家進(jìn)行持續(xù)關(guān)注。

組件基本信息

內(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)行許可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容