Netty學習記錄-入門篇( 二 )


  • 再通過selectionKey反向獲取socketChannel,方法channel() 。
  • 可以通過得到的channel,完成業務邏輯 。
  • Netty概述異步的、基于事件驅動的網絡應用程序框架,用以快速開發高性能、高可靠的網絡IO程序 。
    Netty學習記錄-入門篇

    文章插圖
    有了NIO為什么還需要Netty?
    不需要過于關注底層的邏輯 , 對下面的sdk等進行封裝,相當于簡化和流程化了NIO的開發過程 。springspringboot的關系差不多 。
    因為 Netty 5出現重大bug,已經被官網廢棄了,目前推薦使用的是Netty 4.x的穩定版本 。
    Netty高性能架構設計線程模型基本介紹
    Netty學習記錄-入門篇

    文章插圖
    傳統阻塞 I/O 服務模型
    Netty學習記錄-入門篇

    文章插圖
    模型特點:
    • 采用阻塞IO模式獲取輸入的數據
    • 每個連接都需要獨立的線程完成數據的輸入,業務處理,數據返回
    問題分析:
    • 當并發數很大 , 就會創建大量的線程,占用很大系統資源
    • 連接創建后,如果當前線程暫時沒有數據可讀,該線程會阻塞在read操作,造成線程資源浪費
    Reactor 模式I/O 復用結合線程池,就是 Reactor 模式基本設計思想 。
    Netty學習記錄-入門篇

    文章插圖
    Reactor在一個單獨的線程中運行 , 負責監聽和分發事件,分發給適當的處理程序來對IO事件作出反應 。它像公司的電話接線員,接聽來自客戶的電話并將線路轉譯到適當的聯系人 。
    單 Reactor 單線程
    Netty學習記錄-入門篇

    文章插圖
    • 優點:模型簡單,沒有多線程、進程通信、競爭問題,全部都在一個線程中完成 。
    • 缺點:性能問題 , 只有一個線程,無法完全發揮多核CPU性能 。Handler在處理某個連接上的業務時 , 整個進程無法處理其他連接事件,很容易導致性能瓶頸 。
    單 Reactor 多線程
    Netty學習記錄-入門篇

    文章插圖
    在上一代的問題上進行修改,Reactor主線程只負責響應事件,不做具體的業務處理,通過read讀取數據后,會分發給后面的worker線程池的某個線程處理業務 。
    • 優點:充分利用多核CPU的處理能力 。
    • 缺點:多線程數據共享和訪問比較復雜,Reactor處理所有的事件監聽與響應,在單線程運行,在高并發場景容易出現性能瓶頸 。
    主從 Reactor 多線程針對單 Reactor 多線程模型中 , Reactor 在單線程中運行,高并發場景下容易成為性能瓶頸,可以讓 Reactor 在多線程中運行 。
    Netty學習記錄-入門篇

    文章插圖
    Reactor主線程MainReactor對象通過select監聽連接事件,收到事件后,通過Acceptor處理連接事件 。當Acceptor處理連接事件后,MainReactor將連接分配給 SubReactor,SubReactor將連接加入到連接隊列進行監聽,并創建Handler進行各種事件處理 。
    • 優點:父線程與子線程的數據交互簡單職責明確 , 父線程只需要接收新連接 , 子線程完成后續的業務處理 , 無需返回數據給主線程
    • 缺點:編程復雜度較高 。
    Reactor模式小結
    1. 單Reactor單線程 , 前臺接待員和服務員是同一個人,全程為客戶服務 。
    2. 單Reactor多線程,1個前臺接待員,多個服務員,接待員只負責接待 。
    3. 主從Reactor多線程,多個前臺接待員,多個服務生 。
    Netty 模型
    Netty學習記錄-入門篇

    文章插圖
    • Netty抽象出兩組線程池,BossGroup專門負責接收客戶端的連接,WorkerGroup專門負責網絡的讀寫 。
    • 每個worker nioEventLoop處理業務時,會使用pipeline(管道),pipeline中包含了channel,即通過pipeline可以獲取到對應通道 , 管道中維護了很多的處理器 。
    異步模型基本介紹