本文連接:https://blog.csdn.net/king866/article/details/54427447
Netty是一個高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸的支持,做爲一個異步NIO框架,Netty的全部IO操做都是異步非阻塞的,經過Future-Listener機制,用戶能夠方便的主動獲取或者經過通知機制得到IO操做結果。
做爲當前最流行的NIO框架,Netty在互聯網領域、大數據分佈式計算領域、遊戲行業、通訊行業等得到了普遍的應用,一些業界著名的開源組件也基於Netty的NIO框架構建react
傳統通訊採用了同步阻塞IO,當客戶端的併發壓力或者網絡時延增大以後,同步阻塞IO會因爲頻繁的wait致使IO線程常常性的阻塞,因爲線程沒法高效的工做,IO處理能力天然降低。編程
咱們經過BIO通訊模型圖看下BIO通訊的弊端安全
採用BIO通訊模型的服務端,一般由一個獨立的Acceptor線程負責監聽客戶端的鏈接,接收到客戶端鏈接以後爲客戶端鏈接建立一個新的線程處理請求消息,處理完成以後,返回應答消息給客戶端,線程銷燬,這就是典型的一請求一應答模型。
該架構最大的問題就是不具有彈性伸縮能力,當併發訪問量增長後,服務端的線程個數和併發訪問數成線性正比,因爲線程是JAVA虛擬機很是寶貴的系統資源,當線程數膨脹以後,系統的性能急劇降低,隨着併發量的繼續增長,可能會發生句柄溢出、線程堆棧溢出等問題,並致使服務器最終宕機。性能優化
Netty基於NIO,實現了對NIO的封裝及優化,從而Netty的通訊模式爲異步非阻塞通訊服務器
在IO編程過程當中,當須要同時處理多個客戶端接入請求時,能夠利用多線程或者IO多路複用技術進行處理。IO多路複用技術經過把多個IO的阻塞複用到同一個select的阻塞上,從而使得系統在單線程的狀況下能夠同時處理多個客戶端請求。與傳統的多線程/多進程模型比,I/O多路複用的最大優點是系統開銷小,系統不須要建立新的額外進程或者線程,也不須要維護這些進程和線程的運行,下降了系統的維護工做量,節省了系統資源。網絡
JDK1.4提供了對非阻塞IO(NIO)的支持,JDK1.6版本使用epoll替代了傳統的select/poll,極大的提高了NIO通訊的性能多線程
Netty架構按照Reactor模式設計和實現,它的服務端通訊序列圖以下架構
Netty的IO線程NioEventLoop因爲聚合了多路複用器Selector,能夠同時併發處理成百上千個客戶端Channel,因爲讀寫操做都是非阻塞的,這就能夠充分提高IO線程的運行效率,避免因爲頻繁IO阻塞致使的線程掛起。另外,因爲Netty採用了異步通訊模式,一個IO線程能夠併發處理N個客戶端鏈接和讀寫操做,這從根本上解決了傳統同步阻塞IO一鏈接一線程模型,架構的性能、彈性伸縮能力和可靠性都獲得了極大的提高。併發
何爲Reactor線程模型?框架
Reactor模式是事件驅動的,有一個或多個併發輸入源,有一個Service Handler,有多個Request Handlers;這個Service Handler會同步的將輸入的請求(Event)多路複用的分發給相應的Request Handler
從結構上,這有點相似生產者消費者模式,即有一個或多個生產者將事件放入一個Queue中,而一個或多個消費者主動的從這個Queue中Poll事件來處理;而Reactor模式則並無Queue來作緩衝,每當一個Event輸入到Service Handler以後,該Service Handler會馬上的根據不一樣的Event類型將其分發給對應的Request Handler來處理。
這個作的好處有不少,首先咱們能夠將處理event的Request handler實現一個單獨的線程,即
這樣Service Handler 和request Handler實現了異步,加快了service Handler處理event的速度,那麼每個request一樣也能夠以多線程的形式來處理本身的event,即Thread1 擴展成Thread pool 1,
Netty的Reactor線程模型1 Reactor單線程模型 Reactor機制中保證每次讀寫能非阻塞讀寫
一個線程(單線程)來處理CONNECT事件(Acceptor),一個線程池(多線程)來處理read,一個線程池(多線程)來處理write,那麼從Reactor Thread到handler都是異步的,從而IO操做也多線程化。
到這裏跟BIO對比已經提高了很大的性能,可是還能夠繼續提高,因爲Reactor Thread依然爲單線程,從性能上考慮依然有所限制
2 Reactor多線程模型
、
這樣經過Reactor Thread Pool來提升event的分發能力
3 Reactor主從模型
Netty的高效併發編程主要體如今以下幾點:
1) volatile的大量、正確使用;
2) CAS和原子類的普遍使用;
3) 線程安全容器的使用;
4) 經過讀寫鎖提高併發性能。
Netty除了使用reactor來提高性能,固然還有
一、零拷貝,IO性能優化
二、通訊上的粘包拆包
二、同步的設計
三、高性能的序列 ———————————————— 版權聲明:本文爲CSDN博主「zecoo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/king866/article/details/54427447