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();
}
}
}