前两天写了一点netty相关的知识,并写了一个demo,可是对其原理仍是没有深刻,今天咱们来作一次研究吧bootstrap
首先让咱们来认识一下netty的几个核心人物吧安全
Netty 应用程序经过设置 bootstrap(引导)类的开始,该类提供了一个 用于应用程序网络层配置的容器。服务器
ServerChannel实现负责建立子 Channel,它表明接受链接网络
在调用 bind() 或 connect() 以后,Bootstrap 类负责建立管道给客户或应用程序,异步
底层网络传输 API 必须提供给应用 I/O操做的接口,如读,写,链接,绑定等等。对于咱们来讲,这层结构几乎老是会成为一个“socket”。 Netty 中的接口 Channel 定义了与 socket 丰富交互的操做集:bind, close, config, connect, isActive, isOpen, isWritable, read, write 等等。 Netty 提供大量的 Channel 实现来专门使用。这些包括 AbstractChannel,AbstractNioByteChannel,AbstractNioChannel,EmbeddedChannel, LocalServerChannel,NioSocketChannel 等等。socket
ChannelHandler支持不少协议,而且提供用于数据处理的容器。咱们已经知道 ChannelHandler 由特定事件触发。 ChannelHandler 可专用于几乎全部的动做,包括将一个对象转为字节(或相反),执行过程当中抛出的异常处理。
经常使用的一个接口是 ChannelInboundHandler,这个类型接收到入站事件(包括接收到的数据)能够处理应用程序逻辑。当你须要提供响应时,你也能够从 ChannelInboundHandler 冲刷数据。一句话,业务逻辑常常存活于一个或者多个 ChannelInboundHandler。oop
ChannelPipeline 提供了一个容器给 ChannelHandler 链并提供了一个API 用于管理沿着链入站和出站事件的流动。每一个 Channel 都有本身的ChannelPipeline,当 Channel 建立时自动建立的。 ChannelHandler 是如何安装在 ChannelPipeline? 主要是实现了ChannelHandler 的抽象 ChannelInitializer。ChannelInitializer子类 经过 ServerBootstrap 进行注册。当它的方法 initChannel() 被调用时,这个对象将安装自定义的 ChannelHandler 集到 pipeline。当这个操做完成时,ChannelInitializer 子类则 从 ChannelPipeline 自动删除自身。spa
1.Channel 绑定到 ChannelPipeline
2.ChannelPipeline 绑定到 包含 ChannelHandler 的 Channel
3.ChannelHandler
4.当添加 ChannelHandler 到 ChannelPipeline 时,ChannelHandlerContext 被建立线程
EventLoop 用于处理 Channel 的 I/O 操做。一个单一的 EventLoop一般会处理多个 Channel 事件。一个 EventLoopGroup 能够含有多于一个的 EventLoop 和 提供了一种迭代用于检索清单中的下一个。netty
简单点来讲,EventLoopGroup 是一个线程池,EventLoop是其中一个线程
但netty并不只限于此
一旦 Channel 是分配给一个 EventLoop,它将使用这个 EventLoop 在它的生命周期里和一样的线程。你能够,也应该,依靠这个,由于它能够确保你不须要担忧同步(包括线程安全、可见性和同步)在你 ChannelHandler实现。
Netty 全部的 I/O 操做都是异步。由于一个操做可能没法当即返回,咱们须要有一种方法在之后肯定它的结果。出于这个目的,Netty 提供了接口 ChannelFuture,它的 addListener 方法注册了一个 ChannelFutureListener ,当操做完成时,能够被通知(无论成功与否)。