1、Netty中的Channel 和jdk nio包下的Channel是什么关系?
答:netty包中的channel持有一个nio的Channel
2、Netty客户端Bootstrap.connect()的过程。
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new StringEncoder());
pipeline.addLast(new StringDecoder());
//业务处理器
pipeline.addLast(new NettyServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind(hostname, port).sync();
System.out.println("服务提供方开始提供服务~~");
channelFuture.channel().closeFuture().sync();
①boostrap设置bossGroup和workerGroup
②用反射的方式的方式创建NioChannel(这时还没创建)
③添加channel里 pipeline 的 编码、解码、自定义Handler
④执行bind()方法
注意在serverBootstrap的 init 方法是在 bind 方法里进行的,之前的都是配置赋值。
创建channel
initAndRegister 将channel注册到EventLoop中去
绑定端口,开启Socket服务都是异步执行的,返回的都是Future ,所以要sync()。
3、Channel注册到NioEventLoop的过程。
NioEventLoop 里run方法for(;;)
select策略: selectNow方法 监听socket就绪
selectKeys: 拿出就绪的channel
先在secket缓冲区load到bytebuff中
然后调用channel#fireChannelRead()的方法
异步交给pipeline中
inboundHandler#channelRead方法
4、Promise是什么?
promise接口全异步处理(类似ajax)
ChannelPromise里有Channel,channel里有eventLoop
promise最终由eventLoop来执行
5、Pipeline的实际模式非常灵活,说说你对他的理解。
责任链模式:
http解码(转换数据格式)->http协议#data#json->转换成java类(DTO)->businessHandler
DTO加密->json->http->channel->socket写缓冲区->socket传输
6、Netty使用PipeLine模式时做了一些优化,就是向后传递Handler时的优化是什么?
netty 5 里多了mask 标识inboud/outboud handler 基类方法有无overwrite ,有, mask=1, 无, mask=0 ,跳过无响应时间的handler
7、谈谈你对NioEventLoopGroup的理解。
NioEventLoopGroup 理解为线程池
NioEventLoop 单个线程池
线程池中持有 线程数=默认线程数*2
group中next()方法返回 EventLoop
NioEventLoop里的线程对象延迟创建
@Override
public void execute(Runnable command) {
threadFactory.newThread(command).start();
}
8、NioEventLoop内部的任务队列做哪些优化?
将LinkBlockingQueue换成JCTools 里的Queue
MpscArrayQueue多生产者单消费者
MpmcArrayQueue多生产者多消费者
特性CAS锁 ,对customerIndex消费者角标上锁