Netty的使用及理解,來說說你的想法?

BIO(缺乏彈性伸縮能力,併發量小,容易出現內存溢出,出現宕機 每一個客戶端對應一個線程

Netty的使用及理解,來說說你的想法?

Netty

偽異步IO:創建線程池,由線程池裡邊的線程負責連接處理,M個個請求進來時,會在線程池創建N個線程。容易出現線程池阻塞。由一個線程池來處理客戶端的請求。

Netty的使用及理解,來說說你的想法?

Netty

NIO:異步非阻塞,服務器實現模式為一個請求一個線程,客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

對於NIO,有兩點需要強調的:

(1)關於概念有兩種理解,New I/O(相對於之前的I/O庫是新增的)和Non-block I/O(非阻塞的)。由於NIO的目標就是讓java支持非阻塞I/O,所有更多人喜歡用Non-block I/O。

(2)很多人喜歡將NIO稱為異步非阻塞I/O,但是,如果按照嚴格的NUIX網絡編程模型和JDK的實現進行區分,實際上它只是非阻塞I/O,不能稱之為異步非阻塞I/O。但由於NIO庫支持非阻塞讀和寫,相對於之前的同步阻塞讀和寫,它是異步的,因此很多人習慣稱NIO為異步非阻塞I/O。

AIO: JDK1.7升級了NIO庫,升級後的NIO庫被稱為NIO2.0,正式引入了異步通道的概念。NIO2.0的異步套接字通道是真正的異步非阻塞I/O,此即AIO。其服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。

BIO(一請求以應答模型): 一個獨立的acceptor監聽客戶端的連接,監聽到客戶端的請求連接之後,為每個客戶端創建一個新的線程,進行鏈路處理。處理完之後,通過輸出流返回給應答客戶端,此時線程銷燬。

Netty服務器的原理:

Netty的使用及理解,來說說你的想法?

Netty

圖中每次請求的讀取是通過UpStream來實現,然後激活我們的服務邏輯如EchoServerHandler,而服務器向外寫數據,也就是響應是通過DownStream實現的。每個通道Channel包含一對UpStream和DownStream,以及我們的handlers(EchoServerHandler),如下圖,這些都是通過channel pipeline封裝起來的,數據流在管道里流動,每個Socket對應一個ChannelPipeline。

channel pipeline是關鍵:

  • 為每個Channel 保留 ChannelHandlers ,如EchoServerHandler
  • 所有的事件都要通過它
  • 一個Channel對應一個 ChannelPipeline
  • 包含協議編碼解碼 安全驗證SSL/TLS和應用邏輯
Netty的使用及理解,來說說你的想法?

Netty

非阻塞的IO通信框架

Netty概述:

1、netty是基於Java NIO的網絡應用框架,client-server框架

2、Netty是一個高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸的支持,

作為一個異步NIO框架,Netty的所有IO操作都是異步非阻塞的,

通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結果。

3、作為當前最流行的NIO框架,Netty在互聯網領域、大數據分佈式計算領域、遊戲行業、通信行業等獲得了廣泛的應用,

Netty的使用:

1.創建一個服務器端(ServerBootstrap)

1.需要創建兩個對象, new NioEventLoopGroup();

2.然後創建一個服務器端的對象new ServerBootstrap();

3.使用服務器對象調用group方法將第一步創建的兩個對象傳入到服務器對象中。

4.然後再調用channel方法傳入NioServerSocketChannel.class

5.在接著調用childHandler方法,傳入繼承了ChannelInitializer的類。注:此類用於對剛剛接收的channel進行初始化。(可進行設置接收傳輸數據的編碼和解碼與添加自定義處理邏輯的類,需要繼承SimpleChannelInboundHandler。然後重寫該類的方法進行自己邏輯部分的處理)

6.在實現了ChannelInitializer類中實現 了initChaannel方法,然後需要獲取ChannelPipeline這個類來進行設置,獲取方法是:通過該實現方法的參數.pipeline方法來得到。從而可以進行設置接收到channel進行編碼解碼的設置與添加自己邏輯部分的類。

7.添加自己的邏輯部分的類或代碼了。使用上步得到的CHannelPipeline來調用addLast方法添加。設置編碼和解碼也一樣。,附圖:

Netty的使用及理解,來說說你的想法?

Netty

8.開始編寫繼承了SimpleChannelInboundHandler類的類,然後重寫該類的一些方法來完成自己的邏輯代碼。

channelActive():建立連接的時候觸發

channelRead0():收到客戶端發來的消息的時候觸發

.....

9.綁定端口開始接收進來的連接,使用服務器端對象調用bind方法綁定端口號然後調用sync方法來進行監聽並接受連接

10.關閉服務器使用 future.channel().closeFuture().sync();來關閉服務器

並關閉第一步所創建的兩個NioEventLoopGroup。調用shutdownGracefully方法

注:上述為創建了一個服務器端步驟

如果在繼承了SimpleChannelInboundHandler類的上邊添加@Sharable註解

第五步必須為調用childHandler,否則報錯childHandler not set

註解解釋:

@Sharable // 表示它可以被添加到多個ChannelPipeline中。

2.創建一個客戶端(Bootstrap)

1.創建一個NioEventLoopGroup對象,用來傳入下班創建的Bootstrap客戶端對象。

2.創建Bootstrap客戶端對象

3.使用創建的客戶端對象調用group對象竄入創建 NioEventLoopGroup對象。然後下邊和創建服務器端對象的步驟一樣到第9步。注:這裡跟服務器端第五步稍微有點區別,客戶端調用的是handler方法,而服務器端調用的是childHandler方法

4.開始連接服務器,使用創建的客戶端對象調用connect對象將所需要連接的服務器ip及端口號。然後再調用sync方法進行與服務器的連接。

5.向服務器端發送數據,需要創建一個Channel對象,使用第四步創建的對象嗲用channel方法得到一個Channel對象。然後使用該對象調用writeAndFlush方法來像服務器端發送數據。

6.關閉當前與服務器連接的話將第一步創建的NioEventLoopGroup對象關閉即可,調用shutdownGracefully方法。

加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群號是:338549832 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!


分享到:


相關文章: