【第11篇】Netty的Channel与ChannelPipeline剖析详解

1、bind与doBind方法

  • bind,doBind完成Socket创建与连接

2、Channel(掌握点)

  • Channel 可以获取状态,连接,断开
  • Channel 可以接收Buffer的大小
  • Channel 提供Read,Write绑定
  • Channel 可以向用户提供ChannelPipeline,它可以处理当前IO和事件的所有请求(组合作用)
  • Channel是一个层次性的通道连接

NIO 深入详解和重要体系分析

3、异步

  • 在Netty有独特的设计IO,他的IO操作都立刻返回,他不会保证请求的IO的是完成的,不论这些IO的成功或失败,取消,Netty的ChannelFuture都会返回
  • 异步不会保证请求的IO是立即完成状态,因为他是立刻返回的去执行其他任务

4、DefaultChannelPipeline(难点)

  • DefaultChannelPipeline才用采用链表操作,在此类的里面可以看到tail与head可以看到构造方法
    DefaultChannelPipeline

5、 ChannelPipeline(此类非常重要)

  • ChannelPipeline是ChannelHandler的一个集合,他是用于处理拦截与Channel,ChannelPipeline相关的进来的事件以及出去的操作,ChannelPipeline实现了高级拦截过滤器的管理(它的创建于高级模式)
  • ChannelPipeline本身不做任何事情,它相当于容器,一个IO时间Handler要么是一个ChannelInboundHandler处理,要么是一个ChannelOutboundHandler处理,转发与它最近的Handler通过事件传播方法定义ChannelHandlerContext来实现(重点
  • ChannelPipeline有数字进行标识出/入栈
  • ChannelPipeline会丢弃有些客户端不需要的句柄,提高效率,如:超出边界
  • 自定义事件group用于处理不必要阻塞,提高线程的速度与性能(处理器)如:pipelinie.addLast('group',new 自定义实例);
  • ChannelPipeline-> addLast(group,name,ChannelHandler),第三个ChannelHandler这个句柄用于指定事件处理,用于提高线程占用CPU的耗损性能,从而提高线程的执行速度(难点)

创建一个管道Creation of a pipeline

 public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundInvoker, Iterable>
  • 处理或截取通道的入站事件和出站操作的通道处理程序列表。ChannelPipeline实现了拦截过滤器模式的高级形式,使用户能够完全控制事件的处理方式以及管道中的ChannelHandlers之间的交互方式。
  • 每个通道都有自己的管道,并且在创建新通道时自动创建管道。

建立一个管道(Building a pipeline)

  • 用户应该在管道中有一个或多个通道处理程序来接收I/O事件(例如读取)和请求I/O操作(例如写入和关闭)。例如,一个典型的服务器在每个通道的管道中都有以下处理程序,但是您的里程可能会根据协议和业务逻辑的复杂性和特征而有所不同:
    1、协议解码器——将二进制数据(例如ByteBuf)转换成Java对象。
    2、协议编码器——将Java对象转换成二进制数据。
    3、业务逻辑处理程序——执行实际的业务逻辑(例如数据库访问)。
    它可以表示为如下的例子:
static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);/默认事件执行组
 ChannelPipeline pipeline = ch.pipeline();
 pipeline.addLast("decoder", new MyProtocolDecoder());//解码器
 pipeline.addLast("encoder", new MyProtocolEncoder());//加密器
 pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

事件如何在管道中流动

I/O Request via Channel or ChannelHandlerContext 流程图

  • 下图描述了通常情况下,ChannelPipeline中的ChannelHandlers如何处理I/O事件。一个I / O事件是由ChannelInboundHandlerChannelOutboundHandler和转发到其最亲密的处理程序通过调用ChannelHandlerContext中定义的事件传播方法,如ChannelHandlerContext.fireChannelRead(对象)ChannelHandlerContext.write(对象)

  • I/O Request via Channel or ChannelHandlerContext 流程图

6、 ChannelHandler

  • ChannelHandler在任何时都可以添加和移除一个ChannelPipeline,它本身就是一个线程安全的

7、 拦截器与过滤器(改良点)

  • 过滤器与拦截器用于控制请求与流程行为操作,如:servlet的filter与Struts的拦截器
  • Netty改变了传统的过滤器,要么请求处理了一个流程的进与出,进(请求),出(响应),改变了入栈与出栈的处理的方式独特性,每一个Channel都有独立的pipeline,当她实例一个Channel会自动创建(重点

8、出栈与入栈(掌握点)

  • 入栈是从外面进程序
  • 出栈是从程序到外面
  • 一个入栈事件句柄通过底向上这种方式,一个入栈句柄通常入栈数据通过现场来自远程访问,如:数据操作,Socket.read获取数据,如处理超出顶部边界,它会主动丢弃,查看方式,通过日志记录方式跟踪信息.
  • 一个出栈事件句柄由上向下方式处理,出栈通常对转换操作,如:出栈事件超出底部会与它相关的Channel进行处理,这时IO线程会处理实际的操作,如:Write方法
  • 出栈与入栈处理是独立的,他们之间是没有相关的。

9、 推荐学习博客

Netty源码分析之ChannelPipeline详解

你可能感兴趣的:(【第11篇】Netty的Channel与ChannelPipeline剖析详解)