1.netty概述
Netty是由JBOSS提供的一个java开源框架,基于NIO的客户、服务器端的编程框架。
Netty实现的协议包括FTP、HTTP、SMTP、WEBSOCKET等待
Netty解决了NIO编程的复杂的线程模型,以及断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流处理的问题,Epoll空轮询导致的CPU飙升100%
2.netty核心组件
- ServerBootstrap 启动类
- NioEventLoopGroup 线程组 持有多个NioEventLoop
- NioEventLoop 其实就是一个reactor内部会维护一个selector和线程组
- ChannelInitializer channel初始化器
- NioSocketChannel netty提供的封装了java NIO相关API的对象
SocketChannel API同ChannelHandler一样非常庞大,最终继承自AbstractChannel并实现了Channel接口(即ChannelInitializer的泛型)
- ChannelPipeline
一个管理ChannelHandler的流水线,提供一系列的对ChannelHandler进行CRUD的链表方法
下图引用自netty.ChannelPieline源码
- ChannelHandler netty提供的用于从SocketChannel读写数据的执行器
- ChannelOption 一些常量配置
- ChannelFuture 用于异步关闭channel
参考如下代码:用于异步关闭channel
ChannelFuture channelFuture = bootstrap.bind().sync();
channelFuture.channel().closeFuture().sync();
3.Netty线程模型
4.Netty API简单使用示例
package cn.qu.netty.web;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
public class NettyServer {
final static Log log = Log.createLog();
public static NettyServer createNettyServer() {
NettyServer nettyServer = new NettyServer();
return nettyServer;
}
/**
* @Description:
* @param port
* @param queueSize netty 线程组中的队列最大容量
* @throws InterruptedException
*/
public void start(int port, int queueSize, String[] scannerPackage) throws Exception {
NioEventLoopGroup bossGroup = null;
NioEventLoopGroup workerGroup = null;
ApplicationContext applicationContext = new ApplicationContext(scannerPackage);
HandlerMappingProvider handlerMappingProvider = new HandlerMappingProvider(applicationContext);
FilterProvider filterProvider = new FilterProvider(applicationContext);
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup();
ChannelFuture channelFuture = bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, queueSize).childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new HttpServerCodec())
.addLast(new HttpObjectAggregator(64 * 1024)) // 最大5mb
// .addLast(new CheckIpInboundHandler()) 抽象到过滤器
.addLast(new DefaultHandler(filterProvider, handlerMappingProvider));
}
}).bind(port).sync();
log.log("netty server start success : port=" + port);
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}