Netty
Bootstrap “引导”程序的类, 包括ServerBootstrap 和Bootstrap
ChannelHandler
ChannelHandler在ChannelPipeline中,用来处理入站和出站的消息
ChannelInboundHandler 处理入站消息
ChannelOutboundHandler 处理出站消息
ChannelInitializer 用来配置Handlers,通过ChannelPipline来添加ChannelHandlers, 其实 ChannelInitializer自身也是ChannelHandler
缓冲主要包括
ByteBuf
ByteBufHolder
Netty 使用 reference-counting(引用计数)来判断何时可以释放 ByteBuf 或 ByteBufHolder 和其他相关资源,从而可以利用池和其他技巧来提高性能和降低内存的消耗。
ByteBuf 提供两个指针变量支付读和写操作,读操作是使用 readerIndex(),写操作时使用 writerIndex()。这和JDK的ByteBuffer不同,ByteBuffer只有一个方法来设置索引,所以需要使用 flip() 方法来切换读和写模式。
ByteBuf 一定符合:0 <= readerIndex <= writerIndex <= capacity
Channel, ChannelPipline, ChannelHandler 的关系如下图。
ChannelPipeline 是一系列的ChannelHandler 实例,
每一次创建了新的Channel ,都会新建一个新的 ChannelPipeline并绑定到Channel上
ChannelHandler 可以属于多个 ChannelPipeline,通过@Sharable注解使其可以被共享到其他ChannelPipline
ChannelHandlerContext
接口 ChannelHandlerContext 代表 ChannelHandler 和ChannelPipeline 之间的关联,并在 ChannelHandler 添加到 ChannelPipeline 时创建一个实例。一个 ChannelHandlerContext 使 ChannelHandler 与 ChannelPipeline 和 其他处理程序交互
AttributeMap这是是绑定在Channel或者ChannelHandlerContext上的一个附件,相当于依附在这两个对象上的寄生虫一样,相当于附件一样,如图所示:
这个图还算比较形象地描述了AttributeMap的作用,我们知道每一个ChannelHandlerContext都是ChannelHandler和ChannelPipeline之间连接的桥梁,每一个ChannelHandlerContext都有属于自己的上下文,也就说每一个ChannelHandlerContext上如果有AttributeMap都是绑定上下文的,也就说如果A的ChannelHandlerContext中的AttributeMap,B的ChannelHandlerContext是无法读取到的
注意:Netty 4.1 后取消了ChannelHandlerContext 的AttributeMap, 只保留Channel 的AttributeMap, 以免用户会 。具体使用时,不要再用ChannelHandlerContext.attr() , 而是采用 Channel.attr() .
EventLoop 接口代表事件循环, EventLoopGroup 代表事件集合
ChanelPipline 中 ChannelHandler 处理流程
注意:ChannelHandler 可以属于多个 ChannelPipeline