本次将会讲述Netty的类库和框架
首先是Java NIO的异步和时间驱动的实现,保证了高负载情况下的性能最大化和可扩展性,然后是一组设计模式,将应用程序从网络层解耦,简化了开发过程.最大限度的提高了可测试性,模块化和代码的可重用性
1.Channel EventLoop ChannelFuture
我们说这三个类
这三个是Netty网络抽象的代表
Channel — Socket
EventLoop — 控制流,多线程处理,并发
ChannelFuture — 异步通知
Channel 接口
基本的I/O操作 bind(),connect(),read(),write()依赖于底层网络传输的原语,Netty实现的Channel接口提供的API,降低了Socket的复杂性,其定义了一些根类
EventLoop接口
定义了Netty的核心抽象,用于处理连接的生命周期事件.
和Channel的关系如下
一个EventLoopGroup 包括一个或者多个EventLoop
一个EventLoop 声明周期中和一个Thread绑定
一个Channel在生命周期中只注册一个EventLoop
Channel触发的IO事件交给相同的EventLoop对应的Thread处理
ChannelFuture接口
Netty中所有的IO都是异步的,因此一个操作不会立刻返回,而可以再后续某个时间点进行确认结果
addListener()方法注册一个ChannelFutureListener,以便在某个操作完成时候得到通知
2.ChannelHandler 和 ChannelPipeline
ChannelHandler的方法是由网络事件触发的
ChannelInboundHandler则是一个需要实现的子接口,这种类型的ChannelHandler接收入站事件,利用实现ChannelHandler来业务上的逻辑
ChannelPipeline
ChannelPipeline 提供了 ChannelHandler 链的容器,将ChannelHandler放在这个链上’
整体放置的流程如下
一个ChannelInitializer的实现注册到了启动类中
当ChannelInitializer.initChannel()方法调用的时候,ChannelInitializer将在ChannelPipeline中定义安装一个自定义的ChannelHandler
ChannelInitializer将自己从ChannelPipeline中移除
ChannelHandler主要有两个子类
ChannelPipeline上的ChannelHandler的编排顺序由加载顺序决定
上面图可以看见,如果事件的运动方向从客户端到服务器端,可以称为出站
反之入站的
流动传递第一个ChannelInboundHandler 知道到达尾端
然后出站就是从尾端到头端,然后到达Socket层
当ChannelHandler被添加到ChannelPipeline时候,会被分配一个ChannelHandlerContext,代表了两者间的绑定
这个ChannelContext可以和Channel一样,去写入消息,不过Channel会导致消息从ChannelPipeline的尾端开始流动
后者导致ChannelPipeline的下一个ChannelHandler开始流动
不同类型的ChannelHandler 各自功能取决于超类
ChannelHandler提供了大量的适配器类,方便我们只重写我们需要实现特殊处理的方法和事件
常见的适配器有
ChannelHandlerAdapter
ChannelInboundHandlerAdapter
ChannelOutboundHandlerAdapter
ChannelDuplexHander
对于Netty来说
将一个发来的数据转换为Java对象,或者反方向转换为字节,都是需要编码器和解码器的
Netty提供了不同的抽象类来帮助你实现这个编解码,其本质上都是实现了ChannelOutboundHandler和ChannelInboundHandler接口
常见的实现编解码
可以利用抽象类 SimpleChannelInboundHandler<T>可以帮你,T是需要处理的泛型
并且利用ChannelHandlerContext来将输入参数传递给ChannelHandler的所有方法
Netty的引导类为应用程序提供了容器,涉及到将一个进程绑定到一个端口或者发起一个连接到指定主机的指定端口上
那么有两种引导,一种适用于客户端,一种适用于服务端
两者的区别简单如下
上述最大的不同在于EventLoopGroup的数量
服务器端需要使用一个EventLoopGroup来监听本地某个端口是否有新的连接
第二个EventLoopGroup则是包含了所有已经创建好的客户端连接
ServerChanel 相关的 EventLoopGroup 分配一个负责为传入连接创建Channel 的 EventLoop.
一旦连接建立成功,第二个EventLoopGroup就会为这个Channel分配一个EventLoop
本章中,我们说了下ChannelHandler ChannelPipeline的关系
讲解了ChannelHandler类的层次关系,说了编码器和解码器,说了互补功能