• nsn_huang
    2019-11-10
    一定要自己手动debug,debug之后看视频就感觉很熟悉,能吸收很多内容。看了好几遍才理解,要有耐心啊。

    作者回复: 是的,要有耐心,我打算课程结束,我也再从头到尾看一遍。哈哈

    
     4
  • 再续啸傲
    2019-12-03
    听到这,对于netty的一些组件不是很了解,就很难跟上课程进度。比如channel、eventloop与eventloopgroup的关系,又来个selector,感觉很混乱。

    作者回复: 因为默认有一点了解的,所以很多细节一带而过了。这里补充说明下:
    channel: 也就是连接;
    eventloop:为连接服务的执行器,说白了,就是一个死循环(loop)轮训、处理channel上发生的事件(event)。一个channel只会绑定到一个eventloop,但是一个eventloop一般服务于多个channel.
    eventloopgroup: 假设就一个eventloop服务于所有channel,肯定会有瓶颈,所以搞一个组,相当于多线程了。

    
     3
  • 交叉路口
    2019-11-05
    老师,看完视频后感觉理解不是很好,能不能画个图讲解一下?比如一个请求过来经过各个组件,每个组件所做的事情都画出来,这样再结合源码去看会效果比较好,不然听完源码解析,感觉并没有理解透啊

    作者回复: 其实应该一口气把七个工序都读了,可能就清晰多了,回头我也画张图,再给大家串串,然后到时候(更新完后我集中把所有问题都处理)做个常见问题小册子给你们。最近在做课程,很多问题没来得及回复,不好意思

    
     3
  • 夏露
    2019-11-20
    老师帮我回答一个问题, 比如说我一个bossgroup有8个线程, 在启动过程中, 初始化了8个NioEventGroup作为executor, 注册serversocketchannel的时候采用power(2)方式选择了其中1个, 然后绑定了serversocketchannel, 问题是其他7个NioEventGroup是不是没有用?如果有用,用来干嘛?

    作者回复: 是的,没有用,判断有没有用的标准,就是看绑定的端口多少,像服务器,一般都绑定一个地址启动,比如8080,所以其他的的用不到,但是你绑定2个端口起启动就会用到了,比如一个绑定8080,一个绑定443.

    
     2
  • fanhang116
    2019-11-08
    讲的不是很好,老师自己可能很清楚,但是不能深入浅出的讲出来,为讲代码而讲代码!如何深入浅出的讲出来需要技巧!
    自己悟吧

    作者回复: 三种境界吧,一是能解决问题,二是解决问题之外还知道原理,三是不仅知道原理还能说出来且让别人容易理解,第三种值得努力研究。

    
     2
  • 13761642169
    2019-11-25
    忽然想到,server 绑定多个端口的情况,是不是就用到 bossGroup 多个线程了?

    作者回复: 你说的太对了!hadoop的web hdfs http服务器就绑定了两个端口。不记得后面的课程有没有提,所以这里我直接告诉你这样的案例,谢谢

    
     1
  • 小猿猴 .
    2019-11-03
    每次听老师解读源码都晕晕的,是我太菜还是大家都这样

    作者回复: 不懂也没有关系,抓住主线和本质就行了,因为细节就算懂了,过段时间也忘记了,然后另外,如果ppt上的主线和本质不懂的话,那可能要补下相关的知识。加油!

    
     1
  • 小小征
    2019-10-30
    老师想请教几个问题:
    1.pipeline这块有点不太明白?为什么直接定位到head?
    2.active 状态是不是做为channel bind地址和端口完成的一种状态?
    3.selectionKey.interestOps(interestOps | readInterestOp); 这段代码代表了 注册OP_ACTIVE吗?并没有看到标识别啊
    4.readInterestOp 这个字段为16是什么意思?
    展开

    作者回复: 1 因为所有的pipeline都是以head开始,以tail结束。所以演示的时候,我知道核心逻辑在head中,所以为了节省跳转时间,直接定位到最后了。
    2 是的,启动后,就active了。
    3 没有OP_ACTIVE,注册的是readInterestOp,如果是ServerSocketChannel,就是指OP_ACCEPT,也就是16.
    4 16代表accept,表示开始监听连接请求的事件了。

     1
     1
  • 布小丫学编程
    2020-02-05
    老师,鼠标点进去就debug到那个地方,怎么做到的?
    
    
  • punchline
    2020-02-02
    老师您好,想问下netty启动服务 在open selector时,是每一个nioeventloop都会对应一个selector吗? 也就是说服务端开启的时候,会创建多个selector吗?
    
    
  • yihang
    2020-01-14
    基本清楚了,需要对nio有一定掌握。一些细节自己下去再看。另外,channelnitializer 在哪里能看到是一次性的?没看到在哪里移除的?

    作者回复: io.netty.channel.ChannelInitializer:里面在执行完后,有这样一句:
    pipeline.remove(this);
    就是这句移除掉自己的。

    private boolean initChannel(ChannelHandlerContext ctx) throws Exception {
            if (initMap.add(ctx)) { // Guard against re-entrance.
                try {
                    initChannel((C) ctx.channel());
                } catch (Throwable cause) {
                    // Explicitly call exceptionCaught(...) as we removed the handler before calling initChannel(...).
                    // We do so to prevent multiple calls to initChannel(...).
                    exceptionCaught(ctx, cause);
                } finally {
                    ChannelPipeline pipeline = ctx.pipeline();
                    if (pipeline.context(this) != null) {
                        pipeline.remove(this);
                    }
                }
                return true;
            }
            return false;
        }

     1
    
  • 冬渐暖
    2019-12-02
    创建一个NioEventLoopGroup主线流程:
                  1.先创建Selector选择器去检查一个或多个NIO Channel(通道)的状态是否处于可读、可写,和这个NioEventLoopGroup绑定下
     2.异步创建并初始化(主要是初始化SocketChannel---》就是以前说的设置keepAlive的那些child)jian听器ServerSocketChannel ,jian听新进来的TCP连接通道
     3.通过jian听器 把workGroup和bossGroup拿出来
     4.将这个jian听器通过task注册到一开始创建的selector上
     5.绑定地址异步阻塞启动
     6.死循环注册接受连接事件到选择器上去(类似于dubbo的初始化消费者)



    注册的时候 next() 是获取一个可用的 EventLoop. inEventLoop是判断这个EventLoop是不是当前线程的

    你的io.netty.bootstrap.ChannelFactory泛型反射+工厂创建NioServerSocket已经被io.netty.channel.ChannelFactory替代了,搞不懂为什么名字都弄一样的。。而且还有继承关系。

    发现
    eventLoop.execute(new Runnable() {
        @Override
        public void run() {
            register0(promise);
        }
    });
    这段代码有点想java实体类的构造器,先执行构造方法(这里是execute()),然后执行静态方法(这里是run() )
    展开
    
    
  • 飞翔
    2019-11-07
    selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);

    老师 这里的this 是nioserversocketchannel 是吧

    作者回复: 是的,启动的时候是这个,建立连接的时候,就是nio socket channel了,注意区分。

    
    
  • 飞翔
    2019-11-07
    老师 在abstractChannel里边 register方法里边有
    eventLoop.execute(new Runnable() {
                            @Override
                            public void run() {
                                register0(promise);
                            }
                        });

    eventloop 是哪个类呀,还有在哪里写了execute方法
    展开

    作者回复: 可以是NioEventLoopGroup,也可以是别的(例如EpollEventLoopGroup),课程里面说的都是前者,实现execute在io.netty.util.concurrent.AbstractEventExecutorGroup#execute

    
    
  • 鱼向北游
    2019-10-31
    请问老师 以后会讲pipeline这块吗

    作者回复: 后面有,在业务处理那块,如果到时候哪里不清楚,可以留言,谢谢。

    这里可以简单说说:pipeline其实就像工厂的生产线,上面有很多道工序(channel handler),然后这个产线的开始就是接受到的原始数据,最终把产品加工,处理完,打包出去就结束了,本身还是很简单的,扩展性就在于这些工序可以随意定制,我们基于netty开发实际上就是写这些工序,然后有序组织起来。

    
    
  • 小不点
    2019-10-30
    固定周三打卡,老师讲的很好
    
    
我们在线,来聊聊吧