几道netty源码面试题

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消费者角标上锁

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值