CXCommunicationFramework 網絡通信框架實現(第一章)— 架構設計

源碼地址

      GitHub:https://github.com/KonsanAlide/CXCommunicationFramework

章前闡述

      這一章主要講的是整個框架的設計思路,其實主要是服務器端部分,這一部分在博客上有很多人講過,思路上大都相似,只是細節上有所不同,雖然這細節偏偏是決定了性能的關鍵性,不過本章不深入分析這些細節,只闡述架構,原因如下:

       一、因爲這Version0.2只是居於經驗,僅把架構設計、線程模型、模塊層次、邏輯流程、基本的消息通信這幾塊走通,實現初步穩健的架構、準確的數據傳輸、會話管理、錯誤處理,性能方面暫時未經過大量調整和測試,後期會有這方面的內容;              

       二、這個框架初步來講,僅是一個通用性框架,實現的時間有限,能力有限。一般來講,能滿足普通的單服務器節點的大規模數據傳輸,這是一個Open的架構,如果對性能或者效率上有很多要求,大家也需要在自己的業務環境中進行一定的調整,相信這一點對大都有幾年的網絡通信開發經驗的通信來講,都不困難,需要的是大量的測試和細微的調整。通過本框架代碼,提供給大家一些基礎的架構模塊,希望能給大家帶來一些方便:當需搭建這樣一套系統的時候,無需再花費大量時間從頭實現,僅需要進行一定的調整和業務邏輯部分的編碼實現即可。

       三、網絡通信的細節問題,在論壇和博客上有很多人反覆的討論解決過,我並不見得比他們更優秀。

架構設計說明

       下面我們接上昨天前文,來說明下這個框架的設計架構。

       服務端(CXCommunicationServer):目前兼容Windows和Linux兩個平臺,Windows使用IOCP,linux使用epoll,大約分了四層(時間精力都有限的情況下,這裏面的層次劃分其實並不非常明顯):內核IO通信層、數據包解析層、會話管理層、用戶消息處理層。

       客戶端(CXCommunicationClient):目前兼容Windows和Linux兩個平臺,包含基礎的SOCKET封裝類,包含消息通信類,文件傳輸客戶端類,多線程測試函數。下來要增加會話管理類。未來如時間允許,P2P實現、UDP實現也會逐漸加入到裏面來。

       內存管理模塊(CXMemoryCache):目前初步實現一個簡單的內存鏈表(slab)來做一個內存池對象,實現一個內存池對象管理類。

       其它模塊:其它模塊皆爲輔助功能,不單獨講,在後文闡述的過程中會涉及一些。


服務端(CXCommunicationServer)架構設計

內核IO通信層

       內核IO通信層,主要是對IOCP和EPOLL模型接口的封裝,把工作線程和監聽線程封裝在一起。這裏我這一版本暫時用獨立的監聽線程來Accept連接,而不是加入到模型中通過工作線程來統一處理,原因很簡單:時間有限,而且想和後面的去掉監聽線程的版本進行一些比較,讓大家更直觀的看到兩者區別,其次,在大部分的同學的業務場景中,這種模式可能會更簡單好操作一些。
      該層主要是實現類是CXSocketServerKernel,該類的實現邏輯也簡單:
      通過Start函數來創建監聽的socket,啓動監聽線程,啓動多個工作線程;
      監聽線程ListenThread 循環的等待Accept socket鏈接,觸發OnAccept事件,把socket拋到CXCommunicationServer來處理,申請CXConnectionObject資源、分配消息處理隊列、分配內存池資源等,把socket加入到IOCP和EPOLL模型中,通知模型等待接收數據。
       工作線程WaitThread循環的等待socket的IO事件(目前版本只等待接收數據事件),接收到事件後,處理異常情況,把正確的Receive事件拋給CXCommunicationServer的OnRecv來處理

        備註:CXCommunicationServer類是服務端的管理類,協調啓動各大模塊並進行中間處理。

數據包解析層

        數據包解析層,包含兩個工作:數據包解包(排序、加解密、解壓),數據包分發。

   CXCommunicationServer類接收內核IO層CXSocketServerKernel拋出來的事件,把Receive事件拋給CXConnectionObject來處理。

        CXConnectionObject類是連接封裝對象,處理收發包、排序、組包拆包、加解密、加解壓等數據處理邏輯的,當然這塊的功能也可以抽到一層獨立的數據處理層來弄,開始設計時我是如此考慮的,但開發中時間一趕,就全塞到這類裏面來了,而且數據校驗、加解密、加解壓還沒實現。

      數據分發模塊,CXDataDispathLevelImpl、CXMessageQueue、CXMessageProcessLevelBase是屬於這一部分的,CXConnectionObject把拆解出來消息包通過直接放入CXDataDispathLevelImpl中CXMessageQueue對象中,CXDataDispathLevelImpl有多個CXMessageQueue對象,CXMessageProcessLevelBase是線程對象,有多個,CXMessageProcessLevelBase從CXMessageQueue中不停的獲取消息包並拋到會話層和用戶消息處理層來處理。

會話管理

       在本框架裏面會話是一個用戶的身份對象,該用戶不是業務層上的普通用戶,而是針對一個客戶端來講的,一個會話裏面包含一個及以上的鏈接對象CXConnectionObject,包含一個會話ID,和一些會話緩存。
       計劃中會話使用租期管理,一個客戶端中的多個Socket鏈接使用同一個會話,鏈接時需要進行合法驗證。有一個主消息的鏈接對象、次要消息鏈接對象、數據傳輸鏈接對象、RPC鏈接對象等,每一種對象代表一種基礎的傳輸協議封裝,所傳輸的數據的大小可能不同,所以CXConnectionObject中提供了一大一小兩個CXMemoryCache指針來申請釋放不同大小的內存
   這一部分的主要類是CXSessionLevelBase、CXSessionMessageProcess、CXSessionsManager、CXConnectionSession。
       目前CXSessionMessageProcess類中對socket鏈接發過來的第一個包進行會話驗證和處理。

       

用戶消息處理層

       在本框架裏面這一層目前做得很簡單,只有CXUserMessageProcess一個類,而且目前只簡單的實現文件下載功能。這一部分等待使用者自由擴展,而且可以使用protobuf等第三方對象封裝傳輸協議,也可以實現RPC,請自由發揮。

 客戶端(CXCommunicationClient

       客戶端部分目前實現的有些簡單,包含基礎的SOCKET封裝類,包含消息通信類,文件傳輸客戶端類,多線程測試函數。這一部分目前邏輯簡單,我不詳細說明,大家直接測試一下,立馬明白。下來要增加的是會話管理類,在會話中增加多個鏈接。未來如時間允許,P2P實現、UDP實現也會逐漸加入到裏面來。


最後

       突然想起來,可能有些同學想要知道下該代碼如何編譯,很簡單:

       把代碼下載下來後,在CXCommunicationServer等文件夾所在的目錄下建一個build文件夾,命令行中cd到這個build文件夾裏面,用“cmake .. 即可構建好工程,Windows和Linux皆同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章