00:00
把前面讲的内容先做一个小结。因为后面呢,我们要形成一个文档对吧,所以说把前面讲的内容做一下小结,我们前面呢,已经把这一部分说了,就是哪块呢,就是ni的介绍和应用场景,我把它总结一下。Ni的音介绍和应用场景,我们讲了哪些内容呢?看一下,首先呢,先给大家说了一下,我们学习ninety这套课程,它的一个要求,就对同学们的一个要求。好,我先放这儿哈。要求什么呢?要求我们具备以下的一些知识。梳理一下。如果说咱们是零基础的呢,就先把基础打好了,过后再来听这门课程。我们又给他家说了一下ninety,一个呃,它到底是个什么,什么东西,给他说了一下,梳理到这ni是什么呢?我们看一下,我这里总结了五点。
01:02
对,我这里总结五点,梳理一下。第一个呢,我们首先要知道ni呢,它是一个Java的开源项目,现在呢是get ho上的一个独立的项目,大家都可以参与道Nike的一个开发和维护上面去,第二个呢,要明白它是一个异步的。基于实验驱动的这么一个框架,那到底怎么体现出异步,怎么体现出实验驱动呢?后面我们会用案例还有相应的图解来进行介绍。嗯,好,这个呢,我们就说到这儿哈,然后异步,关于异步呢,我这里还画了一个图,我们把这个图呢,也拿过来,用阿贾克斯来给大家描述了一下。对,放这哈。紧接着我们说ni呢,它是针对TCP协议下面的一个关于客户端的高并发应用,这里我们要看到ni,它和TCP,还有NIO的这么一个关系,这里也有一张图,我把这张图也给大家梳理过来。
02:06
这张这张图虽然很简单,但是呢,它是有一定指导意义的,就是说我们要明白ni它是在NIO的基础之上,而n nio呢,又是在我们原生的Java IO和网络这个基础之上的,要明白这一点,所以说我们在学ni的时候呢,为什么老师讲先要有Java的基础。然后呢,到我们在讲nit之前,大家也看出来,我们肯定先要说一下NIO。如果IO咱们不是很清楚,或者说了解的不到位,那你学ni呢,也就只学个皮毛对吧?所以我们还是要循序渐进的来把。掌握到位。我们紧接着继续往下梳理,下面呢,我们说了一下Nike的应用场景。呃,我们说Nike的应用场景呢,主要是要这么去理解,因为Nike它是一个基础性的框架。他做什么呢?他做基于网络的高并发,或者说叫网络的通讯,那现在的很多框架,他都不可避免的要跟网络进行交互,而且呢,都有并发的问题,所以Nike刚好就是解决这个痛点的,因此呢,Nike这个框架呢,它往往被其他的框架来使用,你比如说double,你比如说像。
03:24
像咱们在做这个,呃,Double,你比如说后面游戏行业对不对,像大数据领域都会看到Nike的一个应用。我把这里呢也梳理到位。好,放在这好,一个是互联网行业会用到。梳理到这个地方。同样,我们给他。来一个标号啊,这样看起来比较清晰一点,紧接着继续往下梳理。游戏行业我们呢也会用到Nike,因为你游戏一般是做的网络游戏嘛,你既然是网络游戏,肯定就涉及到数据的通讯的问题。
04:04
既然涉及到数据通讯,就会用到我们的奶。我把这个放到这就可以了啊,有两张图,紧接着继续往下梳理,包括我们大数据,大数据应用也是因为这样的一个原因,因为你比如说我们在大数据里面有个叫AV的。这么一个组件,这个组件呢,它是做序列化的,序列化它要实现什么呢?实现数据文件的共享,那同样也是及到我们一个通讯网络通讯的问题,对吧?也也有可能还涉及到一个service,就是你要提供网络服务,那同样我们也会应用到Nike框架,那ni的框架呢,有些时候呢,还要做二次封装,那要做二次封装往往对Nike的源码和它的机制要求就更高一点。我也把它梳理到这儿。大数据的领域。好,放到这哈,很简单。OK。
05:00
啊,大数据这张图呢,我也给大家拿过来。没问题,紧接着我们继续往下梳理,后面呢,我们来说let,除了呃,前面讲的还有哪些地方,像阿卡flink还有Spark,其实也都会用到nit。好,我也把它梳理到这去,其他的开源项目对很多同学们有兴趣,可以到这个网站上去看一下。比如说我们常见的阿卡阿弗Li。Spark呢,都会用到Nike。紧接着我们又给大家推荐了两本书,那么两本书呢,各有特点,第一本书叫Nike in action。Nit action呢是相对实在一点,而且书的作者本身就是nity的实际贡献者,所以说讲的呢应该是比较到位的,第二个呢是Nike权威指南,Nity权威指南呢,他对理论还有nity的。基本原理运行机制讲的比较到位,唯一的缺点呢,就是这本书它是基于NITY5的,所以说NITY5和NITY4呢,Nity已经不维护了,NITY5和NIT4的API区别还是比较大的,但是基本的原理和运行机制还是大同小异,同学们如果比较喜欢实战,你可以看这本书,如果想对理论和机制做一个深入的了解,可以参考这本书。好,我把。
06:23
这个书呢,这两本书给它放到这儿好,有兴趣的同学呢,可以去看一看。好,这是我们上次课的一个回顾,那现在呢,我们接着往下讲。现在呢,我们就来看一下bio,说为什么要讲bio呢?Bio其实就是我们的主摄IO,说的再直接点,就是我们原生的Java IO那。大家可以看到我们在前面是不是已经讲过这这一点了。这儿是不是有个图啊。对,就这个图,这个图就是我们加入的原生AO,这个呢是同学们在前先前就应该要知道的。
07:02
那我这这里呢,用一个非常简短的一个小案例,待会儿呢,我们回顾一下。Java IO它是怎么回事?好吧,然后呢,我们再继续往下讲,那么看一下bio是个什么呢,来看。Bio呢?其实它是一种IO模型,那既然我们提到了IO模型,我们就来说一说在Java这个领域里边,IO模型到底有多少种?而IO模型呢,它也对我们整个程序的性能有巨大的影响,我们来看一下IO模型,可以简单这样理解,就是用什么样的通道进行数据的发送和接收。举个例子,比如说我们这有一个服务器端,OK,这边有我们一个客户端,这个客户端呢,可能是你自个儿写的,也有可能就是浏览器都可以,那么他们在进行这个通讯的时候,就是我们这个通道。是怎么样一种形式,对我们程序影响是很大的,比如说你这是一个单通道还是一个双通道,你这里有有没有用到缓冲,你是用异步的还是同步的,你是用阻塞的还是非阻塞的,那么对我们整个程序的性能都会有巨大的影响,而实际上呢,我们整个IO模型它也是在发展中,在整个这个编程,就是在我们,呃计算机发展过程中,也在逐渐的完善,最早的时候呢,因为我们程序都比较小。
08:27
网络的并发性,呃,要求并不是很高,所以说原生态原生的Java其实就可以满足了,但随着我们这个社会的发展。嗯,这个大并发网络,大并发的需求越来越大,所以说就产生了NIO,那么NIO呢,又因为它使用的时候会有一些,呃,兼容性的问题,还有一些。使用起来效率是否是否呃快捷的问题,就产生了一个Nike的框架,所以说每一个领域,每一个阶段呢,就会产生新的技术来满足社会,满足我们开发的需求,对吧,所以说我们说Java呢,目前它有三种网络。
09:07
编程模型,也就也也就是我们所说的IO模型,那有哪哪几种呢?BIIOIO和AIO,那么我们先给大家说一下,到他们分别是什么,我们先说bio bio呢,这个就是我们传统的阻塞型,也就是我们所说的原生Java IO。它是同步并阻塞的,那我给他说几句话,大家看一下它是什么意思呢?指的是服务器实现模式为一个连接对应一个线程。大家可以想象你一个连接对应对应一个线程,那势必当我们的连接或者叫并发数很大的时候,就会造成什么问题呢?我们的线程就会很多,是不是像显然这种阻传统传统的阻塞型呢,其实它在处理大冰发的时候呢,是会有一个什么呀,它会是有一个瓶颈的。
10:03
在我们专业术语叫瓶颈,那即急什么呢?急客户端有连接请求的时候,服务器端就需要启动一个线程进行处理,如果这个连接注意听这句话,如果这个连接不做任何事情,会造成不必要的线程开销,什么意思呢?就说你你你连接了一个线程,连接了一个通道,或者说一呃连接了一个呃,起了一个线程以后呢,如果你不去用它。他也会闲置在那里。那其实就是一种浪费啊,其实浪费,那么我画一个简单示意图来说一下bio到底是什么,那么画一个图,因为有时候呢,语言描述是比较嗯不准确的,或者不形象,我们呢,画一个图,大家就知道bio这个模型。来看一下。标模型呢,你可以这么去理解对吧,它的它的文字的描述是不是就就这样一个描述啊,但是呢,它不够形象,我给大家画一个图呢,会比较清晰的描述出bio是什么,来看一下怎么理解它哈。
11:08
嗯,OK。现在呢,比如说现在这里我有一个12万。服务器server端。同学们,那么server端呢,我们假如这边有很多客户客户端。好,我们现在这边呢,有客户端哈,这是我们的客户端。Client。假如是client。好,呃,OK。这比如说我们画三个吧。画三个客户端。没有问题吧?这时当我们客户端向server发一个发一个请求,或者发一发出一个连接请求的时候,Server在bio模型的时候,它会怎么去处理呢?它会这么处理,同学们看。首先呢,它在这一个连接来了哈,连接来了过后呢,呃,我们这边会启动一个线程。
12:03
好,我在这儿画一个颜色,好,你有三个连接,我就会有三个线程。对,好,这个呢,我用shred表示。没问题吧,这这个T。12这边呢,也会有一个线程。那么这个线程它会怎么样呢?同学们看到它会这样子做的,它会在这里呢?建立一个所谓的。连接。好,这边每个有个连接,我就十个亿哈。好的。往我这个往下面拉一点点。那么通过这个连接呢,它既可以完成这个读的操作,当然它也可以完成写的操作。好,我把这句话也放在这里来,没问题吧,那我这里呢,就这样来表示,就说你来了一个呢,我给你产生一个。
13:01
产生一个线程。对不对,我产生一个线程,然后这边呢,会有。连接。好,这边有连接。好,所以说这边呢,就相当于是个客户端,客户端这边呢,肯定会,你可以理解成它就会有一个shocked。对不对,肯定会有个shocked,你既然是网络编程,肯定是shocked,这是没问题的,这边也会有shocked。Circuit,所以说我们这样这个图形就比较形象的描述出bio模型的。嗯,一个大致的。大致的一个情况。大家可以看。就说你这有一个连接过来,我这个服务服务器端呢,就会产生一个线程,这个线程呢,会跟我们服务器端进行一个通讯,当然它呃底层会有一个socket socket形成一个连接,通过这个soet呢,我们可以进行读,也可以进行写。
14:00
对,那同样这边也是一样,这边一样,那这种模型有什么缺点,大家有没有看到有什么缺点呢?它的缺点就是如果我们这个客户端非常非常的多。大家想是不是就意味着我们服务器这端有很很多很多的县城,但是大家知道县城其实是有开销的。线程是有开销的,而且你这个线程进行这个切换,你如果你的CPU,因为你服务器这端,因为对于多并发来讲,压力是在哪边呢?同学们,对于这个多并发来讲,压力主要是在服务器端,而不在客户端,因为你客户端这个无所谓嘛,我一我这个客户端企业线程给你通讯,我这个并不累。我我对服客户端的压力并不大,主要是压力在服务器端,那你服务器端起了很多线程,势必造成这个服务器的性,就是说他他在处理的时候,肯定就没有办法处理很多很多的这种。口断了对不对,你够大并发就会有一个瓶颈,而且更可怕的是你建连建完一个连接以后,你是不是一直在通讯呢?不一定就说你这个你这个连接或者叫so的连接,呃,做好了以后,你不是时时刻刻在进行读写,你有空闲,你有空闲的话呢,我们这个服务器端也要去维护这个线程。
15:16
这就造成了不必要的开销。好,这个就是我们所说的传统的bio模型,而且它还有一个毛病,它有什么毛病呢?这个会阻塞,阻塞在这里。就是我在进行读写的时候,如果我没有读到东西,我会在这在读的那个函数或者方法阻塞在那,在阻塞在那个地方。好,这是这个模型,那下面呢,我们再看一下NIONIO呢,其实就是对BIO的一一个改进,或者说一个嗯,一个改良,它是什么意思呢?他说同步非阻塞。我们来看一下这句话的理解是怎么说啊,他的是这样的描述的服务器实现的模型为一个线程处理多个请求。或者说处理多个连接,或者你可以理解成处理多个客户端都可以。
16:04
都可以。及客户端发送的连接请求都会注册到一个叫做多路复用器上,这个多路复用器呢,你可以待会我会说,其实你可以简单理解成就是一个select选择器。那么多路复用器轮巡到。一有允许到连接有IO请求的时候就会进行处理。同样我也给大家画一个图,因为文字其实同学们理解起来比较费劲,也不够形象,那同学们现在呢,老师再画一个图来说一下我们的bio模型,呃,NIO模型是一个什么玩意儿?NIO模型,这个N呢,就代表non blocking,待会我们还会讲的,N就代表非主色哈,非主色,那同样我们对这个图来进行一个改良。为了让大家看到它和bio的一个区别呢,我把这个图复制过来。你看他会怎么改啊。他会怎么改良呢?OK,好,这样就比较形象了,同学们看他是这么改的,客户端安这边应不会有太多的改变,就是你还是得有一个线程给他通讯嘛,这个是跑不了的,那服务器端会怎么变呢?好的,它是这样玩的,注意看。
17:13
注意看啊。呃,往这往下面拉一拉。往下面拉一拉,诶这个怎么没有拉下来哈。好,这样子吧。他会怎么做呢?它会在这个,呃,服务器这边呢,我们可以启动一个线程就可以了,这线程我就不要了。哎,因为什么呢?因为你服务器呃,太多的线程会怎么样,会对这个高频发有个瓶颈,他会怎么做呢?他会这样做的。OK,服务器这边呢,我起一个线程,对,然后呢,我让这个线程呢,去维护一个select。Select。好,这叫选择器,后面我们会详讲的,同学们现在先对它有个基本的认识好不好?就是选择器,选择器在我们NIO编程里面呢,同学们到时候会看到,其实就是一个对象。
18:07
其实就是一个对象。然后这个选择题他会干什么呢?诶有点意思了,你看。看,好,让我们的选择去去维护多个连接或者叫通道,它是这么来的,那这就OK了,你看怎么样啊,同学们看这里。它是这样子的,我在server这边起一个线程,这个线程里面呢,可以去维护一个select,或者你可以认为它就是一个多路复用器,然后这个select在在干什么呢?他就在这这里不停的轮巡。轮询轮询他看你这个连接或者呃,当当然在NIO里面,我们也可以认为它是一个通道,他会看你这个通道或者是连接里面呢,有一个什么样的事件发生了,我就把把你这个有事件发生的这么一个连接,或者说是通道选择,选择到选择到过呢,我再进行一个处理。
19:02
明白了吧,所以说这里面就其实就体现出刚才我们所说的事件驱动,还有什么呢?就是多路复用的,多路复用的特点,那大家可以看到我的一个线程其实就可以维护。多个。连接是不是当然有同学说了,说老师那一个线程它最多能维护多少个呢?我们会后面会去讲的,呃,一个线程肯定你也不能让他维护,就就说你不能说我下面有100万个客户端,我就让一个线程去维护,这也不现实,对不对,所以说我们在这边呢,也可以用多个线程。诶,大家看这个模型吧,有多个性质,其实后面大家学到后面就知道这个就是我们的这个worker,呃,我叫worker group。啊,它上面这个主,这个主线程呢,我们可以称为叫包,那么这边呢,我们一个线程就可以维护多个,就相当于说什么感觉哈,当然我现在只是一个比较简单的说明哈,就相当于说我们可以。
20:05
这样做。好,往这边拉一拉啊。好,我把这个server呢放这。对。我这里画的是个简单示意图,明白我的意思吧,就说我这个server呢,可以启动,呃嗯,多个线我还是可以启动多个线程的,但是我一个线程呢,不再像原先的bio模型,就一个线程维护一个连接,或者说维维护一个客户,而什么样呢?而是我一个线程我可以维护多个。那这样子呢,就可以有效的利用什么呀,就可以有效的利用我们这个线程,让它不要闲置,不要有过多的闲置。肯定,这种方式呢,它就比原先这个方式要更加的怎么样更加的灵活了,而且可以充分发挥我们现成的作用,为什么它这样设计的,它的理论基础是什么呢?它的理论理论基础就是说你这一个客户端跟服务器端建成一个连接过后,这个连接并不是时时刻刻处于一个活动的状态,大家承承认这样这一点吧,也就是说你客户端和服务器端连接形成了过后,难道你一直都在写数据或者读数据吗?不一定吧。
21:20
你肯定是,你肯定是一一会在写数据,停了一会儿,又又又在写数据或者读数据,又停一会儿,那我就利用你这个特点干什么呢?当你闲置的时候,你当你活动的时候,你就开始活动,我就我就开始在服服务器端给你进行调用CPU进为你服务,如果你处于一个inacive,就是非活动状态,我就干什么,我又让别的这些这个连接活动起来,进行数据的读写不就完了吗?对,所以说这样子呢,其实他就可以处理更多的并发。其实这就就是NIO的一个核心的思想,只是呢,我现在画的是一个比较简单的图而已。
22:03
因为我们到了Nike呢,它有一个reactor模型,就是我们叫做反应器模型,会让我们这个模型更加的健壮,更加的实用,明白好同学们,这是NIO模型,我就简单的聊到这里好吗?因为我们现在只说一个基本的东西,好后面呢还有一个AIO模型,这个AIO模型呢,其实就是也有人也把它叫做NIO点二它是什么呢?它是异步非主色。但是我先说一下这个AIO模型呢,其实是JDK1.7里面引进去的,但是呢,注意听我说这句话,但是目前这个AIO呢,还没有得到一个广泛的应用。没有得到一个广泛应用,你比如说我们这个ninety,我们这个ninety。这个ni啊,其实它并不是基于AIO这个模型的,而是基于NIO这个模型的,苏州AIO这个模型呢,其实目前没有得到非常广泛的使用,那至于将来会怎么样,我们就呃,拭目以待会或许随着他AIO模型的越来越成熟,它可能会逐步的呃,应用到我们实际的一个项目或者框架里面去,好吧,所以这个AIO模型呢,我们做一个了解就可以了,我简单说一下。
23:20
AIO呢,它是引入了异步通道的概念,采用了productor的一个模式,简化了程序的编写,有效的对于有效的请求才产生线程,也就是说他还会对你的请求进行一个处理,就说你这个请求到底是有效的还是无效的?它还会进行这样一个判断,它的特点是先由操作系统完成后,才通知服务器程序启动线程去处理,一般适用于连接较多且连接时间较长的应用。那这里呢,这个AI模型它往往跟操作系统有非常密切的关系。呃,非常密切的关系,因此呢,这点大家明白。后面呢,我们会重点讲的当然就是NIO了,这个NIO是我们重点好BIIO,我BIIO呢,我提一下AI,我我B讲BIIO,主要是想对IO进一个比较,AIOAIO呢,我这命就做一个了解,好的说到这里就可以了,紧接着我们继续往下看。
24:19
那么我再多说一句,Bio IO a IO适用的场景是什么样子的?因为面试官呢,有时候他去问你,哎,他说你这个同学有没有实际开发经验,他可能会问bio用到什么地方比较合理?呃,Bio就是我们说的传统IO啊,就是我们的原生的加yo明白吧,NIO呢?呃,他他问NIO用到什么地方,AIO用到什么地方,我们简单看一下,Bio呢?呃,Bio它是一个传统的,它适用于连接数目较小且固定的这种架构。这种方式对服务器资源要求比较高,为什么比较高?刚才是不是老师已经讲过它的示意图了,因为它一个连接或者一个一个连接,它就会起一个线程。
25:00
那么它的并发局限于应用之中,在JDK1.4以前呢?这是唯一的选择,就在1.4以前,只有bio。但是这种方式呢,虽然它不能处理过多的高并发,但是程序简单易理解。就是同学们以前学的都是这种bio的,就它比较简单,大家一想,诶,一个请求来了过后,我我给你创建一个连创建一个这个soet给你通讯就完事了,来一个给你限一个,来一个建一个,对不对,比较好理解。N nio方式呢,它使用于连接数目较多,且连接比较短的这种架构,哎,你比如说聊天服务器发一个消息过去了,对吧,或者弹幕系统,还有服务器间的通讯编程比较复杂,在JDK1.4开始呢,就开始执行了,但这地方有个地方容易产生一个误会哈,就是随着NIO的这个IO这个后面的像ni呢,Ni其实还是可以做这个长链接的,没有任何问题啊,Ni可以的好,所以说我们说NIO呢,其实呃ni呢,对NIO又做了一个包装,那更强大了。
26:05
再往下面看,A这种方式呢,它属于连接数目角度去连接较长的重操作的一个架构,比如说相册服务,充分调用操作系统参与并发操作,编程比较复杂,从JDK7开始,但是呢,我多说一句,AIO目前没有得到非常广泛的应用,对。我们那个ni呢,是基于NIO的同学们,那关于这个我们前面所说的这个IO模型,就是我们Java里面IO模型这三种呢,给他做了一个比较。大家心里面要有数,就是说你在面试的时候,别人说IO模型在Java里面有几种,你要你要答上来哪几种啊,三种bio IO和AIO。好的同学们,我把这一小节呢先给大家梳理一下。我们讲一小节,就梳理一下对不对,大家就听得比较清晰了,往下搂。我们再梳理一个章节吧。干脆。再梳理一个章节没问题。
27:01
好,这是我们讲的BL,在讲BL的时候呢,诶为什么这个地方。我看下这里。好的,我把这个写就行了。我们说了哪呢?我们提到了一个IO模型。是不是提了一个IO模型呢?那IO模型我们是怎么去讲解的呢?我们先对IO模型做了一个基本的介绍。我们对IO模型做了基本介绍,好,给我来一个。标号吧,这样大家看起来比较清晰,然后呢,这里有两个图,我也跟大家阐述到这里好吧。便于同学们将来的一个理解。就有些时候呢,知识点并不是非常的复杂,重点就是要把它。理解到位,有时候你诶你你学这个东西学的越来越糊涂,可能就是因为没有理解,没有理解到位造成的。我们这边呢,还有一个NIO模型是吧。
28:03
别把它拿过来。就是我们的na模型。好的,我把这一张图呢,也给大家反复到我们的笔记中可以了,最后这里是不是我们还说了一下。这三种。模型或者IO模型,它的适用的场景是怎么样子的?适用的场景呢,我们这也做了一个简单的介绍。好的。同学们,关于这一讲,就是bio模型里面的IO模型,我我给他做了一个介绍,大家要有一个印象。尤其是这两张图,大家要。理解一下好吧,因为这两张图呢,虽然简单,但是后面它是有一个指导意义的,这讲我们就先说到这里。
我来说两句