java多线程框架 netty,JavaSocket编程之Netty框架线程模型
1.Netty概述
Netty是一個由JBoss提供的高效的Java NIO client-server(客戶端-服務器)開發框架,使用Netty可以快速開發網絡應用。Netty提供了一種新的方式來使開發網絡應用程序,使其很容易使用且有很強的可擴展性。Netty的內部實現是很復雜的,但是Netty提供了簡單易用的API從網絡處理代碼中解耦業務邏輯。Netty是完全基于NIO實現的,采用事件驅動機制,非阻塞執行,所以整個Netty都是異步的。Netty框架體系結構圖如下:
Netty框架體系結構圖
2.Java NIO緩沖區與通道
一個Buffer對象是固定數量的數據的容器,其作用是一個存儲器。通道Channel是I/O傳輸發生時通過的入口,而緩沖區是這些數據傳輸的來源或目標。對于離開緩沖區的傳輸,您想傳遞出去的數據被置于一個緩沖區,被傳送到通道。緩沖區是包在一個對象內的基本數據元素數組。Buffer類相比一個簡單數組的優點是它將關于數據的數據內容和信息包含在一個單一的對象中。緩沖區家族成員如下所示:
緩沖區Buffer具有四個屬性來提供關于其所包含的數據元素的信息。
它們是:
容量(Capacity):緩沖區能夠容納的數據元素的最大數量。這一容量在緩沖區創建時被設定,且不能被改變。
上界(Limit):緩沖區的第一個不能被讀或寫的元素。或者說,緩沖區中現存元素的計數。
位置(Position):下一個要被讀或寫的元素的索引。位置會自動由相應的get( )和put( )函數更新。
標記(Mark):一個備忘位置。調用mark( )來設定mark = postion。調用reset( )設定position = mark。標記在設定前是未定義的(undefined)。
這四個屬性之間總是遵循以下關系
0 <= mark <= position <= limit <= capacity
3.Netty核心網絡模型
Netty是典型的Reactor模型結構,在實現上,Netty中的Boss類充當mainReactor,NioWorker類充當subReactor(默認NioWorker的個數是當前服務器的可用核數)。在處理新來的請求時,NioWorker讀完已收到的數據到ChannelBuffer中,之后觸發ChannelPipeline中的ChannelHandler流。Netty是事件驅動,非阻塞的,可以通過ChannelHandler鏈來控制執行流向。
3.1 Refactor單線程模型
Reactor單線程模型,指的是所有的IO操作都在同一個NIO線程上面完成;
Reactor單線程模型特點:
1)Java NIO服務端,接收客戶端的TCP連接;
2)Java NIO客戶端,向服務端發起TCP連接;
3)Java NIO服務端/客戶端,讀取通信對端的請求或者應答消息;
4)Java NIO服務端/客戶端,向通信對端發送消息請求或者應答消息
使用場景:對于一些小容量應用場景,可以使用單線程模型。但是對于高負載、大并發的應用場景卻不合適,比如一個NIO線程同時處理成百上千的鏈路,性能上無法支撐,即便NIO線程的CPU負荷達到100%,也無法滿足海量消息的編碼、解碼、讀取和發送。Reactor單線程模型如下圖所示:
3.2 Refactor多線程模型
Rector多線程模型與單線程模型最大的區別就是有一組NIO線程處理IO操作。
Reactor多線程模型的特點:
1)有一個專門的NIO線程-Acceptor線程用于監聽服務端,接收客戶端的TCP連接請求;
2)網絡IO操作-讀、寫等由一個NIO線程池負責,線程池可以采用標準的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送;
3)1個NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1個NIO線程,防止發生并發操作問題。
Reactor多線程模型如下圖所示:
3.3 Netty服務器端創建過程
Netty服務器啟動時,創建兩個NIOEventLoopGroup獨立的Reator線程池,一個用于接收客戶端的TCP連接,一個用于處理IO的相關的讀寫操作。
Netty線程模型是建立在Reactor模型的基礎上,線程模型并不是一成不變的,通過啟動參數的配置,可以在不同的線程模型之間切換。Netty服務器端創建過程序列圖如下:
Netty服務器端創建過程序列圖
1)首先創建一個ServerBootstrap實例,這是Netty服務端的啟動輔助類;
2)設置并綁定Reactor線程池,Netty的Reactor線程池是EventLoopGroup,它其實就是EventLoop線程的數組。EventLoop的職責是處理所有注冊到本線程多路復用器Selector上的Channel;
3)設置并綁定服務端NIOserverSocketChannel, Netty通過工廠類,利用反射方式創建NioServerSocketChannel對象
4)設置TCP連接參數,TCP鏈路建立時創建并初始化ChannelPipeline,它本質是一個負責處理網絡事件的職責鏈,負責管理和執行ChannelHandler。網絡事件以事件流的形式在ChannelPipeline中流轉,由ChannelPipeline根據ChannelHandler的執行策略調度ChannelHandler的執行;
5)添加并設置ChannelHandler,加入到ChannelPipeline事件流;
6)服務器端綁定監聽端口,并啟動服務器;
7)啟動NioEventLoop負責調度和執行Selector輪詢操作,選擇準備就緒的Channel集合;
8)當輪詢到準備就緒的Channel之后,就由Reactor線程NioEventLoop執行ChannelPipeline的相應方法;
9)執行Netty系統并調度執行ChannelHandler業務邏輯
3.4 Netty線程模型實例
注冊兩個OutboundHandler,執行順序為注冊順序的逆序,注冊兩個InboundHandler,執行順序為注冊順序,注冊HelloServerInHandler用于接收客戶端消息已經向客戶端發送消息,主要代碼如下:
本訂閱號提供Java相關技術分享,從Java編程基礎到Java高級技術,從JavaWeb技術基礎Jsp、Servlet、>JDBC到SSH、SSM開發框架,從REST風格接口設計到分布式項目實戰。剖析主流開源技術框架,用親身
實踐來譜寫深度Java技術日志。
Java技術日志
歡迎關注 Java技術日志 微信訂閱號
總結
以上是生活随笔為你收集整理的java多线程框架 netty,JavaSocket编程之Netty框架线程模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java8 拼接字符串 StringJo
- 下一篇: 分布式自增ID算法---雪花算法(Sno