00:00
好,前面呢,我们学了一下double的一些应用,接下来呢,我们这一章就来研究double的原理,那么说double原理之前,我们先来回顾一下RPC的原理,所有的RPC我们在讲hello的时候,我们说过,诶,它呢就是想要完成一次远程过程调用,比如我们COMPUTER1里边的某一个客户端,哎,我们这个想要调用COMPUTER2里边服务端的某处代码,那怎么办呢?我们来发起一个远程调用请求,接下来呢,有一个代理对象是把我们想要调用的这些信息,哎,通过网络传输给我们服务端,我们服务端收到我们想要调哪个方法以及参数以后,服务端呢,去来调用本地的方法,这个方法呢,调用完成以后,服务端呢,这个代理帮我们把调用后的结果又通过网络传输出来,然后呢,我们这个客户端代理收到结果以后。
01:01
那就把这个结果给我们返回,而整个详细的细节呢,就牵扯到这么一些步骤,第一步我们服务的消费方就是我们客户端,他呢想要调我们这个代码,但是呢,我们一般是以本地的调用方式来调用服务,就像我们写double一样,我们就来调一个接口,调一个方法就行了,至于他中间怎么调,我们接下来看继续接下来第二步呢,就是我们客户端的这个代理,哎,我们可以认为这是一个代,它呢接收到我们想要调用的这个方法以后,比如我们要调用什么方法,包括方法用的参数等等,是什么,要将这些信息组装成我们能在网络间传输的这些消息,他这些组装好了以后呢,接下来我们这个客户端这个代理,他肯定要跟我们这个服务端要建起连接,他就得知道服务端在哪儿,他找到我们服务端的地址以后呢,就通过我们网络把我们这个消息呢发给。
02:01
服务端消息包含我们要调哪个方法,包括方法的参数是什么等等,当我们服务端的代理收到我们这个消息内容以后,他还要进行解码,哎,因为我们有可能给他传的是一个对象,对象我们还是需要序列化在网络中传输,那么呢,它就要反序列化等等还要解码过来,那解码过来以后呢,得到我们真正的一些参数的信息等等,根据这些我们再来调用本地的方法,调完以后呢,本地方法会传出我们相应的方法返回的这个数据,把这个返回数据传给我们服务端的这个代理,同样的返回数据,我们客户端要能收到,我们这个代理呢,将这个数据重新呢,又得序列化,哎,我们成为把这个数据呢,重新打包成消息,我们通过网络呢,又发送出来这个消息的打包呢,就牵扯到啊,我们这个继续把这个消息呢,编码发出去,那我们这个客户端收到。
03:01
它这个内容以后呢,哎,我们需要把这些内容要进行解码,得到我们真正要用的这个返回值,哎,比如我们要把序列化过来的数据呢,我要反序列化成我们想要的对象,至此呢,我们一次调用就成功了,那么这个客户端呢,也就是我们这个消费方最终呢,会得到我们远程调用服务端代码的返回结果,而我们用double的时候,其实我们就做了两步,第一步,第二步就是呢,我们面向接口的方式调一个远程方法,然后呢,我们直接拿到结果就行了,而中间的整个过程对于我们来说是透明的,我们看不见的,也就说我们RPC框架,它的作用就是想要把中间的过程封装起来,诶比如它呢,要做一个这个对象,代理对象要帮我们来发送编解码数据,包括呢要连上网络等等,这一系列环节都是应该由RPC框架来做的。这是我们。
04:01
RPC的一个简单流程,而我们的double呢,它也是一个RPC框架,所以说它一定也会遵循这么几个步骤,那我们在调试源码的时候,大家就注意,诶我们当前到底是处于在哪一个环节,包括呢,我们说搭报底层要进行通信的时候,AB2个服务器要加起通信,那怎么通信呢?它是来使用一个框架叫net net呢是基于Java的NIO,这个NIO呢,如果大家还不了解的同学可以去我们上硅谷鼓励学院来找李鹤飞老师讲的IO视频系统的来学习一下。简单来说呢,我们习惯性把NIO称为now broken IO,也就是非阻塞的IO,那么这个BIIO呢,就是block IO,阻塞式的IO,其实不管说哪种IO,所谓的IO就是指我们。
05:01
无论是网络间的数据传输,哎,我们是叫网络IO,还是本地磁盘的数据传输,那们叫本地的IO,它们呢,都算是IO,那么阻塞式跟非阻塞有什么区别呢?比如我们来看默认的阻塞式,假设呢,这是我们一个服务器,我们用BL的模式,当我们每一个请求一进来,哎,我们要接收到传来的数据,哎,我们开一个socket,哎,每一个请求进来,我们来开一个socket,开一个线程来处理数据,那我们来读取socket给我们传来的数据,我们在这儿获取到流,在这儿读取等等,我们在这儿操作来,包括关键我们读到数据以后,我们还要进行业务逻辑,哎,业务逻辑操作完了以后呢,一大堆完了以后我们再来返回,那与此同时,服务器可能会收到很多的请求,我们同时在这儿操作,而且呢,此时我们在业务逻辑没完成之前,我们这个线程都是不能得到释放的,那这样我们的。
06:01
服务器就不能同时处理大量的请求,因为有大量的线程在这阻塞,在这等待媒业务逻辑的完成,那我们呢,就可以采用NIO的方式,NIO呢多了一些概念,比如第一个叫channel channel呢就是我们通道,通道里边呢NIO还有一个叫buffer,利用我们这个buffer来进行数据传输,同样呢,还有一个叫selecter,我们称为选择器,这个呢,我们也是称为叫多路复用,那么它的原理是怎么样的呢?哎,我们一个select,它是来注册进了很多的通道,哎,相当于我们每一个请求进来,不是要给我们传递数据吗?或者干什么我们都可以弄成一些通道,然后呢,我们select通过来监听多个通道,当发现某一个通道里边的数据准备好了,比如某一个连接过来了,哎,我们可以select里边来鉴定实践,比如connect,我们连接成功了,们要做。
07:01
做什么?或者呢,Accept我们接收数据准备就绪了,我们要怎么办?包括呢,Read,我们这个读取就绪准备了怎么办,还有write就去了怎么办?然后呢,我们通过一个扫select来监听多个通道的方式,某一个通报的任何一个状态准备好了,我们可以额外的开一个线程就去来做这个事儿,那么这是我们说的多路复用的模型,它呢,就不像我们Bo一样,每一个请求进来就直接开一个线程慢慢执行,在这阻塞,而呢,我们使用这个扫雷来监听多个通道的各种事件,等我们感兴趣的事件就绪了以后,我们再来开一个线程去来执行相关的工作,那好,我们这个ne呢,其实就是基于NIO的这个多路复用模型来做的,那么net的基本原理来长这样来给大家放大。首先呢,我们这个net服务器来启动,启动呢,它肯定要绑定监听上某一个端口,比如我们double报的20880,这样呢,所有给这个端口发的数据,Ne服务器就能收到了,咱么这个启动以后呢,它会初始化它的这个服务器的通道,这个通道初始化好以后呢,它就会注册到我们select中,这个select就是我们说的那个多路复用器,他呢负责来监听一个事件,监听谁呢,就来监听accept的事件,Accept的事件呢,就是说当我们这个通道已经准备,哎接收准备就绪了,准备就绪以后呢,那接下来我们就要来处理通道里边的一些信息了,那怎么处理呢?那接下来呢,Ni就呢与客户端建立起连接,来生成n I socket channel,这就是与我们客户端连接的这个通道,然后呢,我们把这个通道还注册到我们这个select里边,只不过呢,我们另外的这个select。
08:56
他来感兴趣监听read和write时间相当于我们通道里边数据读准备就绪和数据写准备就绪,读准备就绪相当于就是说我们这个请求发来的数据,哎,我们已经收完了,我们可以来读写读了,而写准备就绪就是呢,我们可以给这个客户端通道里边来写响应了,当这个读写都准备就绪以后呢,我们就来处理这个事件,这个事件呢,比如读准备就就绪了,们要做一个任务,写准备就绪了,我们做一个任务,这些任务呢,都会抛给这些任务队列,我们那呢就来把这个任务队列执行完,包括呢,我们这个监听accept也一样,它呢也会生成这个任务队列,哎,当监听好了,他要去做什么监听啊,就续了去做了什么,整个任务队列呢,运行完成就我们整个native就结束了,但是呢,我们注意这呢有两个,一个叫boss的这个线程组,还有一个叫。
09:56
Worker的这个组boss呢,其实就是用来监听我们成为这个主线程,它来监听我们来自于啊,20880的所有连接准备就绪时间,而我们这个worker呢,就是当我们准备就绪以后,我们要做什么工作,把这个工作呢抛给这个worker,让worker呢慢慢来做,这是我们net的一个基本原理。那么呢,在这先做一个简单的了解,如果大家想要对它有更深入的认识,可以来关注我们上硅谷的鼓励学院相关的native课程。
我来说两句