博客
关于我
Netty源码—5.Pipeline和Handler二
阅读量:789 次
发布时间:2023-02-15

本文共 2360 字,大约阅读时间需要 7 分钟。

ChannelPipeline和ChannelHandler的核心知识

Netty作为一个高性能的异步I/O框架,其最大的特征之一就是ChannelHandler是可插拔的,可以动态编织ChannelPipeline。ChannelPipeline和ChannelHandler的配合使得Netty能够实现高效的网络通信和事件处理。在实际应用中,ChannelHandler可以根据业务需求灵活配置和删除,例如权限认证、流量控制等场景。

Pipeline和Handler的作用和构成

ChannelPipeline是Netty处理网络通信的核心逻辑框架,负责将读写事件按照预定义的顺序传播给用户定义的ChannelHandler。ChannelHandler则是Netty应用程序的灵魂,负责处理I/O事件、异常、连接状态变化等。

ChannelPipeline内部采用双向链表结构,每个节点是一个AbstractChannelHandlerContext对象。每个节点保存着一个用户自定义的ChannelHandler。ChannelHandlerContext中包含了ChannelPipeline和Channel的所有上下文信息。通过ChannelPipeline的链表结构,开发者可以动态添加和删除ChannelHandler。

ChannelHandler的分类

在Netty中,ChannelHandler可以分为以下几类:

  • InboundHandler:负责处理读取事件(Inbound事件),包括数据读取、连接活跃激活、连接不活跃等。
  • OutboundHandler:负责处理写入事件(Outbound事件),包括数据写入、连接关闭等。
  • ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter:Netty提供的默认实现,负责将事件传递给下一个ChannelHandler。
  • 自定义Handler:用户可以根据需求继承自上述基础类或直接实现ChannelHandler接口。
  • 特殊的ChannelHandler实现

    以AuthHandler为例,它用于对第一个传来的数据包进行权限认证。如果认证通过,AuthHandler会主动删除自己,这样后续的数据包就不会再进行认证校验了。

    public class AuthHandler extends SimpleChannelInboundHandler {    @Override    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf data) throws Exception {        if (verify(data)) {            ctx.pipeline().remove(this);        } else {            ctx.close();        }    }}

    ChannelHandler的生命周期

    ChannelHandler从注册到释放的整个过程可以分为以下几个阶段:

  • 注册:通过pipeline().register()方法将ChannelHandler添加到ChannelPipeline链表中。
  • 激活:当连接活跃时,触发channelActive()方法。
  • 读取:当有数据可读时,触发channelRead()方法。
  • 写入:当有数据需要发送时,触发channelWrite()方法。
  • 异常处理:在I/O操作过程中出现异常时,触发exceptionCaught()方法。
  • 关闭:当连接关闭时,触发channelUnregistered()方法。
  • 资源释放:通过handlerRemoved()方法释放资源。
  • ChannelPipeline的事件传播

    ChannelPipeline的事件传播机制分为Inbound事件、Outbound事件和异常事件三种类型。

    Inbound事件传播

    Inbound事件的传播从HeadContext结点开始,依次调用每个InboundHandler的相应方法。事件传播的终点是TailContext结点。默认情况下,Inbound事件会从HeadContext传播到TailContext。

    Outbound事件传播

    Outbound事件的传播从TailContext结点开始,依次调用每个OutboundHandler的相应方法。事件传播的终点是HeadContext结点。Outbound事件的处理通常用于数据的写入和发送。

    异常事件传播

    在I/O操作过程中发生异常时,ChannelPipeline会通知所有Handler的exceptionCaught()方法。异常事件从当前结点开始,依次传播到下一个结点,直到TailContext结点处理完毕。

    ChannelPipeline的总结

    ChannelPipeline的核心结构包括:

  • 初始化:由AbstractChannel创建,默认添加HeadContext和TailContext结点。
  • 数据结构:采用双向链表结构,支持动态添加和删除ChannelHandler。
  • 事件传播:Inbound事件从HeadContext到TailContext传播,Outbound事件从TailContext到HeadContext传播。
  • 异常处理:异常事件从当前结点开始,依次传播到下一个结点,直到TailContext处理完毕。
  • 通过灵活配置和管理ChannelHandler,开发者可以根据需求定制Netty的行为,实现高效的网络通信和业务逻辑处理。

    转载地址:http://ivcfk.baihongyu.com/

    你可能感兴趣的文章
    nacos自动刷新配置
    查看>>
    nacos运行报错问题之一
    查看>>
    Nacos部署中的一些常见问题汇总
    查看>>
    NACOS部署,微服务框架之NACOS-单机、集群方式部署
    查看>>
    Nacos配置Mysql数据库
    查看>>
    Nacos配置中心中配置文件的创建、微服务读取nacos配置中心
    查看>>
    Nacos配置中心集群原理及源码分析
    查看>>
    nacos配置在代码中如何引用
    查看>>
    nacos配置新增不成功
    查看>>
    nacos配置自动刷新源码解析
    查看>>
    Nacos集群搭建
    查看>>
    nacos集群搭建
    查看>>
    nacos集群节点故障对应用的影响以及应急方法
    查看>>
    nagios安装文档
    查看>>
    nagios服务端安装
    查看>>
    name_save matlab
    查看>>
    Nami 项目使用教程
    查看>>
    Nancy之基于Nancy.Hosting.Aspnet的小Demo
    查看>>
    NAND NOR FLASH闪存产品概述
    查看>>
    nano 编辑
    查看>>