一、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实现的网络应用框架,具有高性能、高可靠性、高并发性的特点,适用于开发高性能的网络应用。