Netty
JBoos提供的基于NIO的异步非阻塞框架
线程模型
单线程模型
用一个线程通过多路复用实现所有的IO请求,可支持的并发量较弱
线程池模型
服务端采用一个线程专门处理客户端的连接请求,采用一个线程组负责IO操作
Netty模型
Netty抽象出两组线程池,BossGroup专门负责客户端的连接,WorkerGroup专门负责网络读写操作。NioEventLoop表示一个不断循环处理任务的线程,每个NioEventLoop都有一个selector。用于监听绑定在其上的socket网络通道,内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由NioEventLoop负责
- 一个NioEventLoopGroup包含多个NioEventLoop
- 每个NioEventLoop包含一个Selector和taskQueue
- 每个NioEventLoop上的Selector都会监听多个NioChannel
- 每个NioChannel只会绑定在一个NioEventLoop上
异步模型
FUTURE,CALLBACK和HANDLER
Netty的异步模型是建立在future和callback上的,目的是为了使业务代码从网络基础应用编码中脱离出来
核心API
-
ChannelHandler 通道状态类
方法 描述 public void channelActive(ChannelHandlerContext ctx) 通道就绪事件 public void channelRead(ChannelHandlerContext ctx,Object msg) 通道读取数据事件 public void channelReadComplete(ChannelHandlerContext ctx) 数据读取完毕事件 public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) 通道异常事件 -
Pipeline和ChannelPipeline
ChannelPipeline是Handler的集合,负责处理、拦截inbound和outbound的事件和操作,相当于一个链
方法 描述 ChannelPipeline addFirst(ChannelHandler handler) 把一个业务处理类添加到链中的第一个位置 ChannelPipeline addLast(ChannelHandler handler) 把一个业务处理类添加到链中的最后一个位置 -
ChannelHandlerContext
事件上下文处理对象,pipeline中的实际处理节点,每一个ChannelHandlerContext中包含一个具体的事件处理器ChannelHandler,同时也绑定了Pipeline和Channel的信息。
-
ChannelOption 是Socket的标准参数类
-
ChannelFuture 表示IO中的异步操作结果
Channel channel() 返回正在进行IO操作的channel
ChannelFuture sync() 等待异步操作执行完毕
-
EventLoopGroup和其实现类NioEventLoopGroup
服务器一般提供两个EventLoopGroup 例如BossEvenetLoop和WorkerEventLoop
public Future<?> showdownGracfully() 断开连接,关闭线程
-
ServerBootstrap和Bootstrap
ServerBootstrap是服务端的启动助手,Bootstrap是客户端的启动助手
方法 描述 public ServerBootstrap group(EventLoopGroup parentGroup,EventLoopGroup childGroup) 用于服务端,设置两个EvenetLoop public B group(EventLoopGroup group) 用于客户端,设置一个EventLoop public B channel(Class<? extends C> channelClass) 用于设置服务端的一个channel实现 public<T> B option(ChannelOption<T> option,T value) 用来给ServerChannel添加配置 public<T> ServerBootstrap childOption(ChannelOption<T> childOption,T value) 用来给接收到的通道添加配置 public ServerBootstrap childHandler(ChannelHandler childHandler) 用来设置业务处理类 public ChannelFuture bind(int inetPort) 设置服务器端占用的端口号 public ChannelFuture connect (String inetHost,int inetPort) 用于客户端,用来连接服务器 -
Unpooled 操作缓冲区的类
public static ByteBuf copiedBuffer(CharSequence string,Charset charset) 通过给定的数据和字符编码返回一个ByteBuf对象