Netty学习笔记一之整体架构

Posted by Finn on November 6, 2020

Netty作为一个高效的NIO网络框架,应用十分广泛,如知名的gRPC,Dubbo,很多中间件之间的通讯都是通过Netty来实现,其优秀的架构设计和规范代码,是很值得学习的,于是乎本来开始了啃Netty之路,并记下分享所学。

整体架构

Netty整体架构

  • Core核心层

    提供了可扩展的事件模型,通用的通讯API,以及著名的零拷贝ByteBuf

  • Protocol Support协议支持层

    覆盖了主流协议的编解码实现如HTTP, Websocket, SSL, ProtoBuf,压缩处理,大文件传输,RSTP,文本二进制等

  • Transport Service 传输服务

    输出网络传输能力,包括Socket, HTTP隧道, 虚拟机管道;对TCP UDP进行的封装,对用户隔离底层数据传输细节

Netty的架构十分清晰,每层职责明确单一,且具备很高的扩展性。

逻辑架构

逻辑架构

  • 网络通信层

    负责网络通信工作,将接受到的网络事件分发至事件调度层,核心组件包括Bootstrap、ServerBootstrap和Channel

    • Bootstrap

      客户端引导,连接远端服务,绑定EventLoopGroup,方便地启动Netty客户端程序

    • ServerBootstrap

      服务端引导,监听服务,绑定EventLoopGroup,方便构建一个基于Netty的服务端程序

    • Channel

      通道,封装与JDK NIO,使用者不再需要与Java Socket打交道,同时屏蔽了底层Socket的复杂性

  • 事件调度层

    Reactor 线程模型,处理IO的各种事件,核心组件包括EventLoopGroup和EventLoop

    • EventLoopGroup&EventLoop

      EventLoopGroup一个线程池,包含多个EventLoop

      EventLoopGroup、EventLoop、Channel 的几点关系

      1. 一个 EventLoopGroup 往往包含一个或者多个 EventLoop。EventLoop 用于处理 Channel 生命周期内的所有 I/O 事件,如 accept、connect、read、write 等 I/O 事件。

      2. EventLoop 同一时间会与一个线程绑定,每个 EventLoop 负责处理多个 Channel。

      3. 每新建一个 Channel,EventLoopGroup 会选择一个 EventLoop 与其绑定。该 Channel 在生命周期内都可以对 EventLoop 进行多次绑定和解绑。

  • 逻辑编排层

    组装逻辑,包括协议的编解码,业务逻辑的执行等;核心组件有 ChannelPipeline、ChannelHandler、ChannelHandlerContext

    • ChannelPipeline

      核心编排组件,负责组装各种 ChannelHandler,实际数据的编解码以及加工处理操作都是由 ChannelHandler 完成的。

    • ChannelHandler & ChannelHandlerContext

      ChannelHandler与开发者密切相关,大部分代码编写工作都是在ChannelHandler内完成,比如数据的编解码工作以及其他转换工作,业务逻辑处理等

      ChannelHandlerContext 用于保存 ChannelHandler 上下文,通过 ChannelHandlerContext 我们可以知道 ChannelPipeline 和 ChannelHandler 的关联关系。ChannelHandlerContext 可以实现 ChannelHandler 之间的交互