您的位置:

Netty线程模型详解

一、Netty线程模型图

Netty是一个非阻塞的、事件驱动的网络应用程序框架。它提供了一个基于NIO的异步通讯模型,采用了Reactor模式,使用单线程处理器(或少量线程池)来接收和处理所有的事件。下面是Netty线程模型的图示:

Netty线程模型的特点是:

  1. 仅有一个线程(单线程)处理所有I/O事件。
  2. 事件处理是串行化的,同一时刻只能处理一个事件。
  3. 使用了多个线程池进行业务处理。

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