Netty之主從Reactor多線程模型

Reactor模式用於解決高性能IO問題,特別適合處理海量的I/O事件,它是當前大多數IO組件所採用的IO模式。Netty網絡框架就是基於Reactor模式進行設計和開發的,當請求抵達後,服務處理程序使用多路分配策略,同步地派發這些請求至相關的請求處理程序。

Netty可以通過配置不同參數實現不同Reactor線程模型,在Netty的官方demo中,推薦使用主從Reactor多線程模型,所以這裏主要講解常用的主從Reactor多線程模型。

主從Reactor線程模型的特點,服務端用於接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池bossGroup。Acceptor接收到客戶端TCP連接請求並處理完成後,將新創建的SocketChannel註冊到workGroup線程池的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。

(1)bossGroup:監聽ServerSocketChannel,接收到客戶端連接請求後交由Acceptor處理,成功建立連接後將SocketChannel派發給workGroup。

(2)Acceptor:聯想Socket編程大概也能猜到這是處理客戶端請求鏈接的,Acceptor僅僅完成登錄、握手和安全認證等操作,一旦鏈路建立成功,就將SocketChannel註冊到後端workGroup線程池的IO線程上,由IO線程負責後續的IO操作。

(3)workGroup:監聽SocketChannel的IO事件,完成編碼、解碼以及相應業務處理。

下面給出一個主從Reactor多線程模式的使用實例:

public class Server {
	public static void main(String[] args) throws Exception {
		// Configure the server
		// 創建兩個EventLoopGroup對象
		// 創建boss線程組 ⽤於服務端接受客戶端的連接
		EventLoopGroup bossGroup = new NioEventLoopGroup(2);
		// 創建 worker 線程組 ⽤於進⾏ SocketChannel 的數據讀寫
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			// 創建 ServerBootstrap 對象
			ServerBootstrap b = new ServerBootstrap();
			// 設置使⽤的EventLoopGroup
			b.group(bossGroup, workerGroup)
			// 設置要被實例化的爲 NioServerSocketChannel 類 
			.channel(NioServerSocketChannel.class)
			// 設置 NioServerSocketChannel 的處理器
			.handler(new LoggingHandler(LogLevel.INFO))
			// 設置連⼊服務端的 Client 的 SocketChannel 的處理器
			.childHandler(new ServerInitializer());
			// 綁定端⼝,並同步等待成功,即啓動服務端
			ChannelFuture f = b.bind(8888);
			// 監聽服務端關閉,並阻塞等待
			f.channel().closeFuture().sync();
		} finally {
			// 優雅關閉兩個 EventLoopGroup 對象
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}
}

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