下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 22 | 源码剖析:启动服务
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Netty源码剖析与实战

共60讲 · 约650分钟
4347
免费
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 揭开Netty面纱
免费
04 | 为什么舍近求远:不直接用...
免费
05 | 为什么孤注一掷:独选Nett...
06 | Netty的前尘往事
07 | Netty的现状与趋势
08 | Netty怎么切换三种I/O模...
09 | 源码剖析:Netty对I/O模...
10 | Netty如何支持三种Reacto...
11 | 源码剖析:Netty对Reacto...
12 | TCP粘包/半包Netty全搞...
13 | 源码剖析:Netty对处理粘...
14 | 常用的“二次”编解码方式
15 | 源码剖析:Netty对常用编...
16 | keepalive与idle监测
17 | 源码剖析:Netty对keepal...
18 | Netty的那些“锁”事
19 | Netty如何玩转内存使用
20 | 源码解析:Netty对堆外内...
21 | Netty代码编译与总览
22 | 源码剖析:启动服务
23 | 源码剖析:构建连接
24 | 源码剖析:接收数据
25 | 源码剖析:业务处理
26 | 源码剖析:发送数据
27 | 源码剖析:断开连接
28 | 源码剖析:关闭服务
29 | 编写网络应用程序的基本步...
30 | 案例介绍和数据结构设计
31 | 实现服务器端编解码
32 | 实现一个服务器端
33 | 实现客户端编解码
34 | 完成一个客户端雏形
35 | 引入"响应分发"完善客户...
36 | Netty编码中易错点解析
37 | 调优参数:调整System参...
38 | 调优参数:权衡Netty核心...
39 | 调优参数:图解费脑的三个...
40 | 跟踪诊断:如何让应用易诊...
41 | 跟踪诊断:应用能可视,心...
42 | 跟踪诊断:让应用内存不“...
43 | 优化使用:用好自带注解省...
44 | 优化使用:“整改”线程模...
45 | 优化使用:增强写,延迟与...
46 | 优化使用:如何让应用丝般...
47 | 优化使用:为不同平台开启...
48 | 安全增强:设置“高低水位...
49 | 安全增强:启用空闲监测
50 | 安全增强:简单有效的黑白...
51 | 安全增强:少不了的自定义...
52 | 安全增强:拿来即用的SSL...
53 | 安全增强:拿来即用的SSL...
54 | 安全增强:拿来即用的SSL...
55 | Cassandra如何使用Netty...
56 | Dubbo如何使用Netty ?
57 | Hadoop如何使用Netty ?
58 | 赏析Netty之美
59 | 如何给Netty贡献代码?
60 | 课程回顾与总结
本节摘要

精选留言(13)

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

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

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

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

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

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

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

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

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

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

    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
  • 2019-12-03
    听到这,对于netty的一些组件不是很了解,就很难跟上课程进度。比如channel、eventloop与eventloopgroup的关系,又来个selector,感觉很混乱。

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

  • 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
    固定周三打卡,老师讲的很好