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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/238125.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:09
下一篇 2024-12-12 12:09

相关推荐

  • TensorFlow Serving Java:实现开发全功能的模型服务

    TensorFlow Serving Java是作为TensorFlow Serving的Java API,可以轻松地将基于TensorFlow模型的服务集成到Java应用程序中。…

    编程 2025-04-29
  • Python训练模型后如何投入应用

    Python已成为机器学习和深度学习领域中热门的编程语言之一,在训练完模型后如何将其投入应用中,是一个重要问题。本文将从多个方面为大家详细阐述。 一、模型持久化 在应用中使用训练好…

    编程 2025-04-29
  • ARIMA模型Python应用用法介绍

    ARIMA(自回归移动平均模型)是一种时序分析常用的模型,广泛应用于股票、经济等领域。本文将从多个方面详细阐述ARIMA模型的Python实现方式。 一、ARIMA模型是什么? A…

    编程 2025-04-29
  • Python实现一元线性回归模型

    本文将从多个方面详细阐述Python实现一元线性回归模型的代码。如果你对线性回归模型有一些了解,对Python语言也有所掌握,那么本文将对你有所帮助。在开始介绍具体代码前,让我们先…

    编程 2025-04-29
  • Python线程等待指南

    本文将从多个方面详细讲解Python线程等待的相关知识。 一、等待线程结束 在多线程编程中,经常需要等待线程执行完毕再进行下一步操作。可以使用join()方法实现等待线程执行完毕再…

    编程 2025-04-29
  • Python两个线程交替打印1到100

    这篇文章的主题是关于Python多线程的应用。我们将会通过实际的代码,学习如何使用Python两个线程交替打印1到100。 一、创建线程 在Python中,我们可以使用Thread…

    编程 2025-04-28
  • VAR模型是用来干嘛

    VAR(向量自回归)模型是一种经济学中的统计模型,用于分析并预测多个变量之间的关系。 一、多变量时间序列分析 VAR模型可以对多个变量的时间序列数据进行分析和建模,通过对变量之间的…

    编程 2025-04-28
  • 如何使用Weka下载模型?

    本文主要介绍如何使用Weka工具下载保存本地机器学习模型。 一、在Weka Explorer中下载模型 在Weka Explorer中选择需要的分类器(Classifier),使用…

    编程 2025-04-28
  • ROS线程发布消息异常解决方法

    针对ROS线程发布消息异常问题,我们可以从以下几个方面进行分析和解决。 一、检查ROS代码是否正确 首先,我们需要检查ROS代码是否正确。可能会出现的问题包括: 是否正确初始化RO…

    编程 2025-04-28
  • Python实现BP神经网络预测模型

    BP神经网络在许多领域都有着广泛的应用,如数据挖掘、预测分析等等。而Python的科学计算库和机器学习库也提供了很多的方法来实现BP神经网络的构建和使用,本篇文章将详细介绍在Pyt…

    编程 2025-04-28

发表回复

登录后才能评论