一、Netty線程模型圖
Netty是一個非阻塞的、事件驅動的網路應用程序框架。它提供了一個基於NIO的非同步通訊模型,採用了Reactor模式,使用單線程處理器(或少量線程池)來接收和處理所有的事件。下面是Netty線程模型的圖示:
Netty線程模型的特點是:
- 僅有一個線程(單線程)處理所有I/O事件。
- 事件處理是串列化的,同一時刻只能處理一個事件。
- 使用了多個線程池進行業務處理。
二、Netty線程模型有哪些
在Netty的線程模型中,常見的有以下線程池:
- BOSS線程池: 接收連接到來並註冊每一個新的 Channel。
- WORKER線程池: 處理業務請求。
- 業務線程池: 處理業務請求中的耗時操作。
- 定時器線程池: 處理定時任務。
三、Netty線程模型基於NIO
Netty線程模型基於NIO,因為NIO相對於BIO具有更好的並發性能,適用於高性能、高並發的網路應用。
Netty線程模型中的I/O事件是由Java NIO的Selector處理的。當一個Channel的連接建立成功後,將其註冊到Selector上,Selector會不斷地輪詢已經註冊的Channel,當發現Channel有事件發生時(例如:連接請求、數據到達等),則交給Worker線程池進行處理。
四、Netty線程模型詳解
Netty線程模型詳細解釋如下:
1. Bootstrap類的作用
Bootstrap類是客戶端程序的啟動引導類,用來配置和啟動Netty客戶端程序。其中,BOSS線程池的線程個數通過 bossGroup.option(ChannelOption.SO_BACKLOG, 1024) 方法設置。
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); // Bootstrap類 b.group(bossGroup) // Boss線程池 .channel(NioSocketChannel.class) // 設置socket工廠 .option(ChannelOption.TCP_NODELAY, true) // 設置TCP參數 .handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new HelloClientHandler()); } }); ChannelFuture f = b.connect("127.0.0.1", 8080).sync(); // 連接伺服器 f.channel().closeFuture().sync(); // 等待連接關閉 } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
2. Boss線程池
Boss線程池接收連接到來並註冊每一個新的 Channel。Boss線程池一般採用單線程模型,這也是為什麼說Netty是一種非阻塞、事件驅動的模型。
3. Worker線程池
Worker線程池處理業務請求,處理業務請求的過程中可能需要耗時操作,可以採用業務線程池進行處理。Worker線程池一般使用多線程模型,線程個數可以通過 workerGroup.option(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.SO_BACKLOG, 128) 方法進行設置。
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(5); // Worker線程池,有5個線程 try { ServerBootstrap b = new ServerBootstrap(); // ServerBootstrap類 b.group(bossGroup, workerGroup) // Boss和Worker線程池 .channel(NioServerSocketChannel.class) // 設置channel工廠 .option(ChannelOption.SO_BACKLOG, 1024) // 設置TCP參數 .childOption(ChannelOption.SO_KEEPALIVE, true) .childOption(ChannelOption.TCP_NODELAY, true) .childHandler(new ChannelInitializer<SocketChannel>() {// 業務處理類 @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ServerHandler()); } }); ChannelFuture f = b.bind(8080).sync(); // 綁定埠 f.channel().closeFuture().sync(); // 等待伺服器連接關閉 } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
4. 業務線程池
業務線程池處理業務請求中的耗時操作,使得Worker線程能夠快速地處理其他請求。
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(5); ExecutorService businessThreadPool = Executors.newFixedThreadPool(10); // 業務線程池 try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true) .childOption(ChannelOption.TCP_NODELAY, true) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ServerHandler(businessThreadPool)); } }); ChannelFuture f = b.bind(8080).sync(); // 綁定埠 f.channel().closeFuture().sync(); // 等待伺服器連接關閉 } finally { businessThreadPool.shutdown(); workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
5. 定時器線程池
定時器線程池處理定時任務。Netty中的定時任務採用HashedWheelTimer實現。
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(5); ExecutorService businessThreadPool = Executors.newFixedThreadPool(10); HashedWheelTimer timer = new HashedWheelTimer(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true) .childOption(ChannelOption.TCP_NODELAY, true) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ServerHandler(businessThreadPool, timer)); } }); ChannelFuture f = b.bind(8080).sync(); // 綁定埠 f.channel().closeFuture().sync(); // 等待伺服器連接關閉 } finally { timer.stop(); businessThreadPool.shutdown(); workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }
五、Netty線程模型 知乎
Netty線程模型可以參見知乎上的這個問題:https://www.zhihu.com/question/26928320
六、Netty線程模型 -CSDN
Netty線程模型可以參見CSDN博客上的這篇文章:https://blog.csdn.net/Colin_16/article/details/75522154
七、Netty模型
Netty是一個基於NIO的網路框架,適用於開發高性能、高可靠性的網路應用程序。
八、Netty框架幹什麼的
Netty框架提供了一些常用的協議的實現,比如HTTP、WebSocket、FTP等。在實際開發中,可以直接使用Netty提供的協議實現來快速地開發網路應用。
九、Netty框架原理
Netty框架的原理是基於NIO,採用了Reactor模式。使用單線程處理器(或少量線程池)來接收和處理所有的事件。事件處理是串列化的,同一時刻只能處理一個事件。使用了多個線程池進行業務處理。
十、Netty框架是什麼
Netty框架是一個基於Java NIO實現的網路應用框架,具有高性能、高可靠性、高並發性的特點,適用於開發高性能的網路應用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238125.html