netty in action笔记

Netty 网络抽象的代表:
Channel—Socket;
EventLoop—控制流、多线程处理、并发;
ChannelFuture—异步通知。


Channel 接口
基本的I/O 操作(bind()、connect()、read()和write())依赖于底层网络传输所提供的原语。
Channel 也是拥有许多预定义的、专门化实现的广泛类层次结构的根,下面是一个简短的部分清单
EmbeddedChannel;
LocalServerChannel;
NioDatagramChannel;
NioSctpChannel;
NioSocketChannel。
    OioServerSocketChannel 允许阻塞模式(旧的I/O)


EventLoop 接口
EventLoop 定义了Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。
一个EventLoopGroup 包含一个或者多个EventLoop;
一个EventLoop 在它的生命周期内只和一个Thread 绑定;
所有由EventLoop 处理的I/O 事件都将在它专有的Thread 上被处理;
一个Channel 在它的生命周期内只注册于一个EventLoop;
一个EventLoop 可能会被分配给一个或多个Channel。


ChannelFuture 接口
Netty 中所有的I/O 操作都是异步的。Netty 提供了ChannelFuture 接口,其addListener()方法注册了一个ChannelFutureListener,以
便在某个操作完成时(无论是否成功)得到通知。


ChannelHandler 和ChannelPipeline
管理数据流以及执行应用程序处理逻辑的组件。
ChannelHandler,它充当了所有处理入站和出站数据的应用程序逻辑的容器。


ChannelPipeline 提供了ChannelHandler 链的容器,并定义了用于在该链上传播入站
和出站事件流的API。当Channel 被创建时,它会被自动地分配到它专属的ChannelPipeline。
ChannelHandler 安装到ChannelPipeline 中的过程如下所示:
一个ChannelInitializer的实现被注册到了ServerBootstrap中①;
当ChannelInitializer.initChannel()方法被调用时,ChannelInitializer
    将在ChannelPipeline 中安装一组自定义的ChannelHandler;
ChannelInitializer 将它自己从ChannelPipeline 中移除。


在Netty 中,有两种发送消息的方式。你可以直接写到Channel 中,也可以写到和Channel-
Handler相关联的ChannelHandlerContext 对象中。前一种方式将会导致消息从Channel-
Pipeline 的尾端开始流动,而后者将导致消息从ChannelPipeline 中的下一个Channel-
Handler 开始流动。


零拷贝
零拷贝(zero-copy)是一种目前只有在使用NIO 和Epoll 传输时才可使用的特性。它使你可以快速
高效地将数据从文件系统移动到网络接口,而不需要将其从内核空间复制到用户空间,其在像FTP 或者
HTTP 这样的协议中可以显著地提升性能。但是,并不是所有的操作系统都支持这一特性。特别地,它对
于实现了数据加密或者压缩的文件系统是不可用的——只能传输文件的原始内容。反过来说,传输已被
加密的文件则不是问题。


ChannelHandler 的典型用途包括:
将数据从一种格式转换为另一种格式;
提供异常的通知;
提供Channel 变为活动的或者非活动的通知;
提供当Channel 注册到EventLoop 或者从EventLoop 注销时的通知;
提供有关用户自定义事件的通知。


ChannelPipeline 实现了一种常见的设计模式—拦截过滤器


SCTP 流控制传输协议 /UDT 协议  /STARTTLS 协议


ByteBuf API 的优点:
它可以被用户自定义的缓冲区类型扩展;
通过内置的复合缓冲区类型实现了透明的零拷贝;
容量可以按需增长(类似于JDK 的StringBuilder);
在读和写这两种模式之间切换不需要调用ByteBuffer 的flip()方法;
读和写使用了不同的索引;
支持方法的链式调用;
  支持引用计数;
支持池化。


直接缓冲区的主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为昂贵。如果你
正在处理遗留代码,你也可能会遇到另外一个缺点:因为数据不是在堆上,所以你不得不进行一
次复制,如代码清单5-2 所示


表5-6 ByteBufHolder 的操作
名 称 描 述
content()   返回由这个ByteBufHolder 所持有的ByteBuf
copy()      返回这个ByteBufHolder 的一个深拷贝,包括一个其所包含的ByteBuf 的非共享拷贝
duplicate() 返回这个ByteBufHolder 的一个浅拷贝,包括一个其所包含的ByteBuf 的共享拷贝


Netty提供了两种ByteBufAllocator的实现:PooledByteBufAllocator和Unpooled-
ByteBufAllocator。前者池化了ByteBuf的实例以提高性能并最大限度地减少内存碎片。
后者的实现不池化ByteBuf实例,并且在每次它被调用时都会返回一个新的实例。
Netty默认使用了PooledByteBufAllocator,通过Channel-
Config API或者在引导你的应用程序时指定一个不同的分配器来更改。


ByteBufUtil 类    
hexdump(),它以十六进制的表示形式打印ByteBuf 的内容。
boolean equals(ByteBuf, ByteBuf),它被用来判断两个ByteBuf实例的相等性。


ChannelHandlerContext 代表了ChannelHandler 和ChannelPipeline 之间的关
联,每当有ChannelHandler 添加到ChannelPipeline 中时,都会创建ChannelHandler-
Context。ChannelHandlerContext 的主要功能是管理它所关联的ChannelHandler 和在
同一个ChannelPipeline 中的其他ChannelHandler 之间的交互。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章