简介
本章将介绍channel、eventloop、channleFuture
1 | EmbeddedChannel |
- EventLoop 流控、多线程、并发
这一章主要讨论高级的EventLoop与Channle、Threads,以及EventLoopGroup的关系,我们将在第七章深入讲述eventLoop
1 | 一个EventLoopGroup包含一个或多个EventLoop |
如图
- ChannelFuture 异步通知
在netty中的所有I/O线程都是异步的,因为所有的操作都不回立即返回结果,因此我们需要一种方式在未来的事件去决定它的结果
ChannelHandler and ChannelPipeline
我们可以通过了解具体的细节去看这些组件怎么管理流式、以及执行业务逻辑。
ChannelHandler
从用户的立场来讲,netty最重要的部分就是component就是ChannleHandler,通常netty提供一个应用逻辑的容器,去处理所有的出站与入站的数据。这是因为ChannelHadnler所有的方法都是由Event来触发。包括异常的处理,数据类型的转换等。ChannelPipleline
一个ChannelPipleline提供一个链式ChannelHandler的容器,并且处理入站与出站的流式数据,当一个Channel创建的时候,它会自动被分配给一个ChannelPipleline
1 | 一个 ChannelInitializer 实现通常将自己注册在ServerBootstrap |
如图
adapters
代理的作用就是它对所有的方法都有自己的默认实现,因此你可以通过这些类很快的开发基于自定义的实现,只用覆盖你想要覆盖的方法1
2
3
4ChannelHandlerAdapter
ChannelInboundHandlerAdapter
ChannelOutboundHandlerAdapter
ChannelDuplexHandlerAdapterSimpleChannelInboundHandler
通常我们编写的应用都是接受一个解码的消息并且通过应用逻辑处理我们的消息。那么创建一个ChannelHandler,你可以通过继承一个基类 SImpleChannleInboundHandlerT是你要处理的java类型,最重要的一个方法是channelRead0(Channel- HandlerContext,T),记住不要堵塞线程
- Bootstrapping
bootstrap 类提供了一个用于配置以及应用网络层的容器,用于连接一个给定特殊的端口与host
category | Bootstrap | Bootstraping |
---|---|---|
网络功能 | 连接一个远程的host、port | 绑定本地端口 |
EventLoopGroup的数量 | 1 | 2 |
如图
为什么server端需要两个channles、以及EventLoopGroup,因为一个channle接受创建新连接,一个负责接受正常的请求。
编码与解码 Encoders and Decoders
当数据入站的时候可能通过解码(即byte-> java Object),出站的时候就更好相反,这是编码
netty提供了类似于ByteToMessageDecoder MessageToByteEncoder这样的编解码,通常netty也提供了入站与出站的编解码代理类
本章总结
在这章我们讨论了理解了netty的一席而技术以及架构要点,我们重新回顾了前面的一些具体细节
特殊的我们讨论了,ChannleHandler的一个层次结构,并且介绍了编解码组件,描述了数据在网络层byte格式转换的相辅相成只是。