关于netty的简单介绍-通俗易懂版本

关于netty的简单介绍-通俗易懂版本

  • 关于netty
  • netty特点
  • netty、tcp、http的不同
  • netty链接过程

关于netty

Netty是一个功能强大、灵活且高性能的网络应用框架,适用于构建各种网络通信的应用程序。其优雅的设计和丰富的功能使得它成为Java开发者在网络编程领域的重要工具之一。

netty特点

Netty是一个基于Java的异步事件驱动的网络应用框架,它专注于提供高性能、高可靠性的网络通信。以下是对Netty的简要介绍:
异步事件驱动: Netty采用异步的事件驱动模型,通过事件和回调机制来处理网络操作。这使得Netty非常适合构建高并发、高性能的网络应用程序。
NIO支持: Netty基于Java的NIO(New I/O)实现,使用了非阻塞的I/O操作。这意味着它可以处理大量并发连接而不会因为一个连接的阻塞而影响其他连接的处理。
组件化和可重用性: Netty的设计是模块化的,提供了一组可重用的组件,如编解码器、处理器和其他工具类。这使得开发者可以根据需要选择并组合这些组件,从而更容易地构建定制化的网络应用。
高性能: Netty的设计目标之一是提供高性能的网络通信。通过采用异步和事件驱动的方式,以及对Java NIO的有效利用,Netty在处理大量并发连接时能够保持低延迟和高吞吐量。
协议支持: Netty提供了对多种网络协议的支持,包括但不限于TCP、UDP、HTTP、WebSocket等。它也支持自定义协议的开发。
安全性: Netty提供了一些安全特性,包括SSL/TLS支持,以保障通信的安全性。
广泛应用: Netty在众多领域得到了广泛的应用,包括网络服务器、游戏服务器、消息推送系统、分布式系统等。

netty、tcp、http的不同

其实有很多人都不理解http和netty的区别,为什么netty是nio是不阻塞的,而http就是阻塞的了,底层不都是tcp吗?那tcp,netty,http都是什么关系呢?
TCP(Transmission Control Protocol)位于OSI(Open Systems Interconnection)模型的传输层(Layer 4),它负责在网络中提供可靠的、面向连接的数据传输服务。TCP协议是在操作系统的网络协议栈中实现的,但它并不是操作系统层,而是在操作系统上运行的网络层的一部分。
Netty是一个基于Java的网络应用框架,它提供了对TCP、UDP等协议的支持。Netty工作在应用层(Layer 7),它为开发者提供了更高层次的抽象,简化了网络编程的复杂性。虽然Netty可以用于实现TCP和其他协议,但它本身并不是一个协议,而是一个框架。
HTTP(Hypertext Transfer Protocol)是一个应用层协议,工作在OSI模型的顶层,即应用层(Layer 7)。它是用于在Web浏览器和Web服务器之间传输超文本的协议。HTTP通常基于TCP协议,但也可以在其他传输层协议上运行,例如在TLS/SSL上运行的HTTPS。
综合来看,在网络通信中,TCP位于传输层,Netty是一个应用层的网络应用框架,而HTTP是应用层的协议。这样是不是就清楚很多了,TCP是操作系统用来传输数据的,netty是应用发送数据的,应用并不能直接操作操作系统,或者说这样的难度太大,所以出现了netty,而http是咱们发送数据的协议,也就是说,netty是tcp的升级版,而HTTP则是在应用层上的一种特定协议,用于在Web环境中传输数据。操作系统提供了底层的TCP协议实现,而Netty和HTTP则是在应用程序层面上提供了更友好和高级别的接口。

netty链接过程

其实,如果你可以把下列的过程描述清楚。netty的基本轮廓就有了,再去学习细节就可以了,我看到很多文章,上来就讲三大组件,整个人都是蒙的状态,所以先给大家看下基本流程,对着图去看各个组件会好很多了。
关于netty的简单介绍-通俗易懂版本_第1张图片
在Netty中,建立连接和发送数据涉及到多个组件,包括 Buffer、SocketChannel、Selector、SelectableChannel、SelectionKey、以及与之相关的线程。以下是这些组件如何在一个连接中协同工作的详细过程:
1. Buffer:
Buffer 是Netty中用于存储数据的缓冲区。Netty使用 ByteBuf 作为其特定的缓冲区实现。在建立连接和发送数据的过程中,ByteBuf 用于缓存和管理数据。
2. SocketChannel:
SocketChannel 是Netty中用于实际数据传输的通道。对于服务器端,使用 ServerSocketChannel 来监听连接请求,并在新连接建立时创建 SocketChannel。对于客户端,直接使用 SocketChannel 进行连接。
3. Selector:
Selector 是Java NIO 中的一个关键组件,用于实现多路复用。在Netty中,Selector 用于监听多个通道上的事件,以确定哪些通道已经就绪可以进行读写操作。通过 Selector,可以在一个线程中同时管理多个通道。
4. SelectableChannel:
SelectableChannel 是可以注册到 Selector 上的通道,使得这个通道可以参与多路复用的事件监听。在Netty中,SocketChannel 就是 SelectableChannel 的一种实现。
5. SelectionKey:
SelectionKey 表示一个通道在 Selector 上的注册信息,包含了通道的状态和就绪事件。通过 SelectionKey,可以获取对应的通道、感兴趣的事件、已经就绪的事件等信息。在Netty中,SelectionKey 通常与 Channel 结合使用,例如 NioSocketChannel 的注册会返回一个 SelectionKey 对象。
6. Thread:
Netty使用多线程模型,其中有两种重要的线程组:BossGroup 和 WorkerGroup。BossGroup 负责监听连接请求,创建新连接,并将新连接注册到 WorkerGroup 的 Selector 上。WorkerGroup 负责处理已经建立的连接上的数据读写操作。

上图中的组件做了简单的介绍,那发送数据具体的过程如下(这里尽量简洁介绍):
1. 创建 ServerBootstrap 或 Bootstrap 实例:
ServerBootstrap 用于服务器端,Bootstrap 用于客户端。
2.配置 EventLoopGroup:
创建 BossGroup 和 WorkerGroup,分别用于监听连接请求和处理连接上的数据。
3.配置通道类型和处理器链:
配置 ServerSocketChannel 或 SocketChannel,以及相应的处理器链。
4.绑定端口(服务器端)或发起连接(客户端):
服务器端调用 bind(),客户端调用 connect()。
5.创建 ChannelPipeline 和 ChannelInitializer:
在 ChannelInitializer 中配置初始的通道处理器链。
6.连接建立时的处理(服务器端):
当有新的连接建立时,ChannelInitializer 中的 initChannel 方法被调用,配置通道的处理器链。
7.数据发送:
在处理器链中添加适当的 ChannelHandler,例如 SimpleChannelInboundHandler。
当需要发送数据时,将数据写入 ByteBuf,并通过 SocketChannel 发送。
8.Selector的运行:
BossGroup 和 WorkerGroup 的 EventLoop 启动,开始运行 Selector。
9.多路复用过程:
Selector 不断轮询注册在上面的 SelectableChannel,当有就绪事件发生时,相关的 SelectionKey 被标记为就绪。
10.处理就绪事件:
根据 SelectionKey 获取对应的 SocketChannel。
通过 SocketChannel 进行读写数据。
11.关闭连接:
当连接关闭时,相应的 SelectionKey 被取消,通道关闭。
这个流程描述了Netty中建立连接和发送数据的主要步骤,其中涉及到 Buffer、SocketChannel、Selector、SelectableChannel、SelectionKey、以及与之相关的线程等多个组件。在这个过程中,Netty的多线程模型、事件循环以及异步的特性都得到了充分的利用,以提供高性能和可扩展性。

这里我只做了简单介绍,netty是一个庞大的架构,之后的文章我会分开模块对其进行分析
这里作为目录方便大家学习(后续持续更新中):
学习Netty(一)------Netty 架构概览
学习Netty(二)------Netty 启动过程与初始化
学习Netty(三)------Channel 和 EventLoop
学习Netty(四)------ChannelPipeline 和 ChannelHandler

你可能感兴趣的:(java,java,后端,http,spring,网络协议,网络)