netty學習筆記-netty的整體結構(一)

不使用netty是怎麼實現網絡通信的

netty是一個網絡框架, 本篇會向你介紹netty的整體結構. 回憶下我們在上學時實現的"聊天室小程序", 當時是如何做的. 首先我們定義兩個系統Server和Client, 然後在Server端構造一個ServerSocket, 綁定一個端口port, 通過accept()方法等待請求進來, 爲了處理多個請求, 通常我們在這裏獲取到請求後會將具體的處理任務派給其他線程處理, 當前線程繼續accept()等待下一次請求. Client這邊會構造一個Socket, 綁定端口port. 這就是一個通信的小程序大概的結構, 如圖所示爲一次數據通信

1 服務端創建ServerSocket 2 服務端創建監聽線程accept thread和工作線程池work thread pool 3 客戶端創建Socket, 此時建立了連接connection 4 客戶端創建工作線程work thread 5 客戶端發送請求request, 服務端accept thread監聽到request, 並分配給work thread pool中的某個線程 6 work thread 處理信息 7 返回信息給Client 整個通信流程大概就是這樣, 看起來雖然步驟比較多, 但是好像我也可以實現! 當然netty不會這麼簡單(雖然還不知道哪裏不簡單~), 不過整體網絡通信思路差不多. 下面來看下netty的通信過程.

netty通信過程

先上圖

老闆是不是沒換碟~~ 雖然netty很吊, 但是網絡通信的玩法還是這樣, 要通信就要先在兩個端點建立連接, 爲了提高吞吐就需要開啓多個線程處理不同類型的消息或者行爲. netty牛X的地方是這幾個部分的具體實現上, 下面根據這個圖大概說下netty的整體結構.

netty整體結構

netty整體分爲三層: 網絡通信層, 事件調度層, 服務編排層

網絡通信層

網絡通信層有三個主要的組件: ServerBootstrap, Bootstrap, Channel

ServerBootstrap & Bootstrap

Bootstrap就是啓動, 引導的意思. ServerBootstrap和Bootstrap分別是服務端和客戶端啓動netty的引導類. 雖然我們在圖中將其類比爲ServerSocket和Socket, 但是這兩個Bootstrap功能要強大的多, 一方面需要創建連接, 另一方面還要負責系統的初始化工作, 總之就是整個系統的入口.

ServerBootstrap和Bootstrap很相似, 區別:ServerBootstrap作用於服務端, Bootstrap作用於客戶端, 服務端比客戶端就多了需要監聽請求的工作, 在netty中將監聽請求的線程組(EventLoopGroup)爲Boss, 處理請求的線程組爲Worker(嘖嘖~). 而客戶端只需要一個Worker線程組. 這些線程處理的數據被封裝爲Channel.

Channel

Channel作爲"通信管道"的抽象, 貫穿整個流程. 想象一個水管, 對於水管來說, 它知道里面有水還是沒有水(就緒), 知道一端有沒有桶來接水(註冊). 這些其實就對應Channel的不同狀態, 不同狀態都有對應的事件回調, 後面我們會再詳細的看各種狀態(因爲現在我也不清楚~), 那麼事件回調操作是如何執行的呢? 這就是事件調度層要做的事.

事件調度層

這一層主要就是Boss和Worker這哥倆, 它們都是線程池, 叫作EventLoopGroup, 其中的線程叫作EventLoop. 當接收到一個Channel時, EventLoopGroup會選擇一個EventLoop與該Channel綁定(註冊). 那麼該Channel中的各種事件回調就需要這個EventLoop去執行, 那麼具體的執行內容又是什麼? 那就要看服務編排層.

服務編排層

服務編排層就是一條流水線, 稱爲ChannelPipeline(處理Channel的流水線), 每一個處理節點都是一個ChannelHandler, ChannelHandlerContext中保存了ChannelHandler需要的上下文信息.

結尾

以上就是第一節課的總結, 對netty的整體結構有了簡單的瞭解, 後面再慢慢補充細節

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