前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty剖析 - 掌握Netty 整体架构脉络

Netty剖析 - 掌握Netty 整体架构脉络

作者头像
小小工匠
发布2024-05-26 13:33:16
680
发布2024-05-26 13:33:16
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

Netty 整体结构

Core 核心层

  1. 可扩展的事件模型: Netty的核心层提供了一个可扩展的事件模型,这使得开发者能够方便地处理各种网络事件,如连接建立、数据接收、数据发送等。
  2. 通用的通信API: Netty的核心层提供了通用的通信API,简化了网络编程的复杂性。开发者可以使用这些API来构建各种类型的网络应用,如TCP、UDP等。
  3. 支持零拷贝的ByteBuf: ByteBuf是Netty中用于数据传输的缓冲区抽象,支持零拷贝的ByteBuf能够在数据传输过程中最大程度地减少内存复制的开销,提高了性能和效率。

Protocol Support 协议支持层

协议支持层提供了对主流协议的编解码实现,包括但不限于HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等。

  1. 覆盖主流协议: Netty的协议支持层涵盖了许多主流协议的编解码实现,这包括了常见的HTTP、WebSocket等协议,以及诸如SSL、Protobuf等协议,使得开发者能够在Netty的基础上快速地构建支持这些协议的网络应用。
  2. 支持自定义应用层协议: 除了主流协议外,Netty还支持开发者自定义应用层协议。这意味着开发者可以根据自己的需求定义和实现特定的应用层协议,并在Netty的支持下进行编解码,从而实现定制化的网络通信。
  3. 降低开发成本: Netty的协议支持层极大地降低了开发者构建网络应用的成本。通过利用Netty提供的丰富协议支持,开发者可以避免重复实现常见协议的编解码逻辑,从而加快开发速度,提高效率。

Transport Service 传输服务层

  1. 支持多种传输方式: 传输服务层支持多种网络传输方式,包括Socket、HTTP隧道、虚拟机管道等。这些传输方式能够满足不同场景下的需求,使得Netty框架更加灵活和适用于各种网络应用。
  2. 对TCP、UDP等数据传输进行抽象和封装: Netty对TCP、UDP等数据传输进行了抽象和封装,使得用户在编写网络应用时可以更加聚焦于业务逻辑的实现,而不必关心底层数据传输的细节。这种抽象和封装提高了开发效率,并且使得网络应用更加易于维护和扩展。

传输服务层的存在使得Netty框架具备了强大的网络传输能力,为开发者提供了简洁、高效的网络编程接口,帮助他们快速构建可靠的网络应用。

Netty 逻辑架构

网络通信层

网络通信层其主要职责是执行网络I/O操作,支持多种网络协议和I/O模型的连接操作。一旦网络数据被读取到内核缓冲区,就会触发各种网络事件,这些事件随后会被传递给事件调度层进行处理。

核心组件包括BootStrapServerBootStrapChannel,它们的作用如下:

  1. BootStrap: BootStrap是用于客户端引导的类,用于配置和启动客户端应用程序的网络通信。通过BootStrap,可以设置客户端的连接参数、指定连接的协议、选择I/O模型等。
  2. ServerBootStrap: ServerBootStrap是用于服务器引导的类,用于配置和启动服务器端应用程序的网络通信。通过ServerBootStrap,可以设置服务器的监听端口、指定处理客户端连接的处理器、选择I/O模型等。

Bootstrap 和 ServerBootStrap 十分相似,两者非常重要的区别在于 Bootstrap 可用于连接远端服务器,只绑定一个 EventLoopGroup。而 ServerBootStrap 则用于服务端启动绑定本地端口,会绑定两个 EventLoopGroup,这两个 EventLoopGroup 通常称为 Boss 和 Worker。

  1. Channel: Channel表示一个网络连接的抽象,它可以是客户端与服务器端之间的通信管道。Channel提供了对网络I/O操作的封装,包括读取数据、写入数据、关闭连接等操作。

事件调度层

事件调度层其主要职责是通过 Reactor 线程模型对各类事件进行聚合处理,并通过 Selector 主循环线程集成多种事件,包括 I/O 事件、信号事件、定时事件等。实际的业务处理逻辑通常是由服务编排层中相关的 Handler 完成。

核心组件包括 EventLoopGroupEventLoop

  1. EventLoopGroup: EventLoopGroup 是一组 EventLoop 的集合,它负责管理和调度 EventLoop 的生命周期。在大多数情况下,一个 EventLoopGroup 会包含多个 EventLoop,每个 EventLoop 在单独的线程中运行,负责处理特定的 I/O 事件。
  2. EventLoop: EventLoop 是事件循环,它负责处理特定线程中发生的事件。每个 EventLoop 包含一个 Selector 主循环线程,通过它来监听和处理各种事件。在 Reactor 线程模型中,EventLoop 负责接收事件、调度事件处理、执行事件处理器等工作。

通过事件调度层,网络应用程序能够高效地处理各种事件,包括网络 I/O 事件、信号事件和定时事件等,从而实现并发处理和高性能的网络通信。

我们可以总结出 EventLoopGroup、EventLoop、Channel 的几点关系。

  • 一个 EventLoopGroup 往往包含一个或者多个 EventLoopEventLoop 用于处理 Channel 生命周期内的所有 I/O 事件,如 accept、connect、read、write 等 I/O 事件。
  • EventLoop 同一时间会与一个线程绑定,每个 EventLoop 负责处理多个 Channel
  • 每新建一个 ChannelEventLoopGroup 会选择一个 EventLoop 与其绑定。该 Channel 在生命周期内都可以对 EventLoop 进行多次绑定和解绑。

在Netty框架中,EventLoopGroup是Netty Reactor线程模型的具体实现方式之一。Reactor线程模型是一种并发模式,用于处理多个客户端连接的网络I/O事件。

在Reactor线程模型中,有一个或多个线程负责监听并接收事件,然后将这些事件分发给对应的事件处理器进行处理。

具体来说,EventLoopGroup在Netty中对应着Reactor线程模型中的Reactors。根据EventLoopGroup的配置不同,Netty可以支持不同类型的Reactor线程模型,包括单线程模型、多线程模型和主从多线程模型。

  1. 单线程模型:在单线程模型中,EventLoopGroup只包含一个EventLoop。在Netty中,Boss和Worker都使用同一个EventLoopGroup,这意味着所有的网络I/O事件都由同一个EventLoop来处理。这种模型适用于并发连接较少的场景,能够简化并发控制和线程同步。
  2. 多线程模型:在多线程模型中,EventLoopGroup包含多个EventLoop。Boss和Worker仍然使用同一个EventLoopGroup,但是有多个EventLoop来处理不同的连接。这种模型适用于并发连接较多的场景,能够提高并发处理能力。
  3. 主从多线程模型:在主从多线程模型中,EventLoopGroup包含多个EventLoop,但是Boss和Worker分别使用不同的EventLoopGroup。主Reactor负责新的网络连接Channel的创建,并将Channel注册到从Reactor上。这种模型适用于高并发的网络应用,能够更好地分离连接接受和事件处理的责任。

因此,EventLoopGroup作为Netty框架中的核心处理引擎,通过创建不同配置的EventLoopGroup,实现了不同类型的Reactor线程模型,以满足不同场景下的性能需求和并发处理能力。


服务编排层

服务编排层其主要职责是负责组装各类服务,并实现网络事件的动态编排和有序传播。服务编排层的核心组件包括ChannelPipelineChannelHandlerChannelHandlerContext

  1. ChannelPipeline: ChannelPipeline是Netty的核心编排组件,用于组装各种ChannelHandler。实际的数据编解码和加工处理操作都由ChannelHandler完成。ChannelPipeline可以理解为ChannelHandler的实例列表,内部通过双向链表将不同的ChannelHandler连接在一起。当I/O读写事件触发时,ChannelPipeline会依次调用ChannelHandler列表对Channel的数据进行拦截和处理。
  2. ChannelHandler: ChannelHandler是处理I/O事件或者拦截I/O操作的处理器。它可以通过ChannelPipeline实现对网络数据的编解码、加工处理以及其他业务逻辑的实现。每个ChannelHandler都会被添加到ChannelPipeline中,以便在特定的事件发生时被调用。
  3. ChannelHandlerContext: ChannelHandlerContext提供了ChannelHandlerChannelPipeline之间的通信桥梁。它包含了当前ChannelHandlerChannelPipeline的信息,并提供了操作ChannelPipeline的方法。ChannelHandlerContext可以用于获取Channel、触发事件以及动态修改ChannelPipeline等操作。

需要注意的是,ChannelPipeline是线程安全的,因为每个新的Channel都会绑定一个新的ChannelPipeline,而每个ChannelPipeline关联一个EventLoop,而EventLoop仅会绑定一个线程。这种设计保证了在多线程环境下的线程安全性。

通过这些核心组件,服务编排层实现了对网络事件的动态编排和有序传播,为Netty应用程序提供了高效、灵活的网络通信处理能力。


组件关系梳理

  1. 服务端启动初始化:
    • 在服务端启动初始化时,会创建两个核心组件:Boss EventLoopGroup和Worker EventLoopGroup。
    • Boss EventLoopGroup负责监听网络连接事件。
    • 当有新的网络连接事件到达时,Boss EventLoopGroup会将对应的Channel注册到Worker EventLoopGroup。
  2. Worker EventLoopGroup和EventLoop:
    • Worker EventLoopGroup会被分配一个EventLoop来处理每个注册的Channel的读写事件。
    • 每个EventLoop都是单线程的,通过Selector进行事件循环。
  3. 客户端发起I/O读写事件:
    • 当客户端发起I/O读写事件时,服务端的EventLoop会进行数据的读取。
  4. 数据处理过程:
    • 数据被传递到ChannelPipeline的第一个ChannelInboundHandler中。
    • ChannelPipeline会依次调用每个ChannelInboundHandler对数据进行处理,并将处理结果传递给下一个ChannelInboundHandler。
    • 数据处理完成后,如果需要将数据写回客户端,则会经过ChannelPipeline的ChannelOutboundHandler进行处理。
  5. 数据写回客户端:
    • 处理结果在ChannelPipeline的ChannelOutboundHandler中传播,最终写回到客户端。

总体来说,Netty内部的逻辑流程是由EventLoopGroup、EventLoop和ChannelPipeline等核心组件共同协作完成的。EventLoopGroup负责管理多个EventLoop,每个EventLoop负责处理一个或多个Channel的读写事件。ChannelPipeline负责管理ChannelHandler,并通过它们对数据进行加工处理和传递。整个过程保证了网络事件的有序处理和高效传输。


Netty 源码结构

Core 核心层模块

  1. netty-common模块:
    • 核心基础包,为Netty提供丰富的工具类。
    • 包括通用工具类和自定义并发包。
    • 通用工具类如定时器工具TimerTask、时间轮HashedWheelTimer等。
    • 自定义并发包包括异步模型Future & Promise、FastThreadLocal等。
  2. netty-buffer模块:
    • 实现了更加完备的ByteBuf工具类,用于网络通信中的数据载体。
    • 提供了人性化的Buffer API设计,成为Java ByteBuffer的完美替代品。
    • 解决了ByteBuffer长度固定造成的内存浪费问题,更安全地更改了Buffer的容量。
    • 做了许多优化,例如缓存池化、减少数据拷贝的CompositeByteBuf等。
  3. netty-resolver模块:
    • 主要提供了一些有关基础设施的解析工具,包括IP地址、主机名、DNS等。

Protocol Support 协议支持层模块

  1. netty-codec模块:
    • 主要负责编解码工作,实现原始字节数据与业务实体对象之间的相互转化。
    • 支持了大多数业界主流协议的编解码器,如HTTP、HTTP2、Redis、XML等,为开发者节省了大量的精力。
    • 提供了抽象的编解码类ByteToMessageDecoder和MessageToByteEncoder,开发者可以通过继承这两个类轻松实现自定义的编解码逻辑。
  2. netty-handler模块:
    • 主要负责数据处理工作,是一串有序handler的集合。
    • 提供了开箱即用的ChannelHandler实现类,包括日志、IP过滤、流量整形等。
    • 开发者只需在pipeline中加入相应的ChannelHandler即可使用这些功能。

通过netty-codec和netty-handler模块,Netty框架为开发者提供了强大而灵活的工具,帮助他们轻松实现数据的编解码和处理,从而构建高性能、可靠的网络应用程序。


Transport Service 传输服务层模块

  1. netty-transport模块:
    • 是Netty提供数据处理和传输的核心模块。
    • 提供了许多重要的接口,包括Bootstrap、Channel、ChannelHandler、EventLoop、EventLoopGroup、ChannelPipeline等。
    • Bootstrap负责客户端或服务端的启动工作,包括创建、初始化Channel等。
    • EventLoop负责向注册的Channel发起I/O读写操作。
    • ChannelPipeline负责ChannelHandler的有序编排。

这些组件在Netty的逻辑架构中扮演着重要的角色,共同协作实现了网络数据的传输和处理。通过netty-transport模块,开发者可以方便地启动客户端或服务端,管理事件循环、通道和通道处理器,并确保它们之间的有序传输和处理。

戳这里

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Netty 整体结构
    • Core 核心层
      • Protocol Support 协议支持层
        • Transport Service 传输服务层
        • Netty 逻辑架构
          • 网络通信层
            • 事件调度层
              • 服务编排层
                • 组件关系梳理
                • Netty 源码结构
                  • Core 核心层模块
                    • Protocol Support 协议支持层模块
                      • Transport Service 传输服务层模块
                      相关产品与服务
                      云数据库 Redis
                      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档