Netty源码剖析——ChannelPipeline篇(三十五)

ChannelPipeline | ChannelHandler | ChannelHandlerContext 介绍

三者关系

  1. 每当 ServerSocket 创建一个新的连接,就会创建一个 Socket,对应的就是目标客户端。
  2. 每一个新创建的 Socket 都将会分配一个全新的 ChannelPipeline (以下简称 pipeline)
  3. 每一个 ChannelPipeline 内部都含有多个 ChannelHandlerContext(以下简称 Context)
  4. 他们一起组成了双向链表,这些 Context 用于包装我们调用 addLast 方法时添加的 ChanneHandler (以下简称handler )
  5. 上图中: ChannelSocket 和 ChannelPipeline 是一对一的关联关系,而 pipeline 内部的多个 Context 形成了链表,Context 只是对 Handler 的封装。
  6. 当一个请求进来的时候,会进入 Socket 对应的 pipeline,并经过 pipeline 所有的 handler,对,就是设计模式中的过滤器模式

ChannelPipeline 作用及设计

pipeline 的接口设计

 

可以看到该接口继承了 inBound,outBound,Iterable 接口,表示他可以调用数据出站的方法和入站的方法,同时也能遍历内部的链表, 看看他的几个代表性的方法,基本上都是针对 handler 链表的插入,追加,删除,替换操作,类似是一个 LinkedList。同时,也能返回 channel(也就是 socket)

在 pipeline 的接口文档上,提供了一幅图

  • 这是一个 handler 的 list,handler 用于处理或拦截入站事件和出站事件,pipeline 实现了过滤器的高级形式,以便用户控制事件如何处理,以及 handler 在 pipeline 中如何交互。
  • 上图描述了一个典型的 handler 在 pipeline 中处理I/O事件的方式,I/O事件由 inboundHandler 或者outBoundHandler 处理,并通过调用 ChannelHandlerContext,fireChannelRead方法转发给其最近的处理程序
  • 入站事件由入站处理程序以自下而上的方向处理,如图所示。入站处理程序通常处理由图底部的I/O线程生成入站数据。入站数据通常从如 SocketChannel.read(ByteBuffer) 获取。
  • 通常一个 pipeline 有多个 handler,例如,一个典型的服务器在每个通道的管道中都会有以下处理程序
    1. 协议解码器 - 将二进制数据转换为 Java 对象。
    2. 协议编码器 - 将 Java 对象转换为二进制数据。
    3. 业务逻辑处理程序 - 执行实际业务逻辑(例如数据库访问)
  • 业务程序不能将线程阻塞,会影响I/O的速度,进而影响整个Netty 程序的性能。如果你的业务程序很快,就可以放在I/O线程中,反之,你需要异步执行。或者在添加 handler 的时候添加一个线程池,例如:
    1. //下面这个任务执行的时候,将不会阻塞 I/O 线程,执行的线程来自 group 线程池
    2. pipeline.addLast (group, “handler”, new MyBusinessLogicHandler () ) :
  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值