开发者学堂课程【阿里巴巴分布式服务框架 Dubbo 快速入门:RPC&Netty 原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/624/detail/9476
RPC&Netty 原理
内容介绍:
一、RPC 原理
二、netty 原理
一、RPC原理
1.rpc 的原理
rpc 就是完成一次远程过程调用
比如:
computer01的某一个客户端,想要调用 computer02服务端的某处代码,首先发起一个远程调用请求,接下来有一个代理对象,把想要调用的这些信息,通过网络传输给我们服务端,服务端收到想要调哪个方法以及参数以后,服务端去调用本地的方法。
这个方法调用完成以后,服务端代理把调用后的结果又通过网络传输出来,然后客户端代理收到结果以后,就把这个结果返回。
2.一次完整的 RPC 调用流程(同步调用,异步另说)
(1)服务消费方(就是客户端)调用以本地调用方式调用服务,(就像写 double 一样,调一个接口,调一个方法就行);
(2)Client stub(认为这是一个客户端的代理)接收到调用后负责将方法、参数等组装成能够进行网络传输的信息体(比如要调用什么方法,包括的方法用的参数等等是什么,要将这些信息组装成能在网络间传输的这些消息。);
(3)Client stub 找到服务地址,并将信息发送到服务端(消息包含要哪个方法,方法的参数等);
(4)Server stub 收到消息后,进行解码;(有可能传的是一个对象,需要在网络中传输,它就要反序列化等)
(5)Server stub 根据解码结果调用本地的服务(解码得到参数的信息等,根据这些再来调用本地的方法)
(6)本地服务执行并将结果返回给 Server stub(本地方法会传出相应的方法返回的数据,把返回数据传给服务端的代理)
(7)Server stub 将返回结果打包成消息并发送至消费方(客户端收到,代理将这个数据重新序列化,称为把这个数据重新打包成消息通过网络又发送出来)
(8)Client stub 接收到消息,并进行解码(客户端收到内容以后,把这些内容进行解码得到要用的返回值,比如把序列化过来的数据,
反序列化成想要的对象,)
(9)服务消费方得到远程调用服务端代码的反馈最终结果
3.dubbo
(1)用 dubbo 只有两步,第一步,就是面向接口的方式调一个远程方法,第二步直接拿到结果。
(2)中间的整个过程是透明的,rpc 框架,它的作用就是想要把中间的过程封装起来。它要做一个对象,代理对象要来发送编解码数据,包括要连上网络等。
这一系列环节都是应该有 rpc 框架来做的,这是 rpc 的一个简单流程,
(3)Dubbo 也是一个 rpc 框架,也会遵循这几个步骤,在调试源码时注意当前到底在哪一个环节。
包括 double 底层进行通信的时候,ab 两个服务器要通信,它是使用一个框架叫90媒体是基于 Java 的 NIO 进行通信。
二、netty 原理
1.IO
简单来说,习惯性把 nio 称为 Non-blocking IO,也就是非阻塞 IO,BIO 就是 Bocking IO 阻塞式的 IO。
所谓的 IO 就是指无论是网络间的数据传输叫网络 IO还是本地磁盘的数据传输,叫本地的 IO,他们都算是 IO
2.BIO 就是 Bocking IO 阻塞式的 IO。
假设这是一个服务器,用 BIO 的模式
每一个请求进来,要接收传来的数据,开一个 socket 的开线程来处理数据。来读取 socket 传来的数据,获取到流入在这读取等等,
包括读到数据以后,进行业务逻辑,操作完以后再返回,与此同时服务器可能会收到很多的请求,同时在这操作。而且此时,在业务逻辑没完成之前,这个线程都是不能得到释放的,那这样服务器就不能同时处理大量的请求,因为有大量的线程在这阻塞在这等待业务逻辑的完成。
3.NIO
测试可以采用的 NIO 的方式,NIO 多了一些概念
(1)channel 是通道;还有一个 buffer 来进行数据传输,selector 称为选择器,也称为多路复用。
(2)原理
select 注册了很多的通道,相当于每一个请求进来,传递数据或者其它都可以弄成通道。
selector 过来监听多个通道,当发现某一个通道的数据准备好了,比如某一个连接过来了,可以 selector 连接
比如 contact,连接成功; accept 接收数据准备就绪;read 读取就绪;right 就绪了怎么办?
通过一个 select 来监听多个通道的方式,
某一个通报的任何一个状态准备好了,可以额外的开一个线程来做。这就是多路复用的模型。
它就不像 BIO 一样,每一个请求进来就直接开一个线程慢慢执行在这阻塞,NIO 使用 selector 来进行多个通道的各种事件,感兴趣的事件就绪了以后,再开一个线程去执行相关的工作。
4.netty 原理
netty 是基于 NIO 的多路复用模型来做的
(1)netty 过程
首先 netty 服务器启动,绑定监听某一个端口,比如 dubbo 的20880,所有给20880端口发的数据,netty 服务器都能收到。
启动以后它会初始化服务器的通道,这个通道初始化好以后注册到 selector 中,就是多路复用器,负责监听一个事件,如图监听 stepl 的事件:当通道已经准备就绪,接下来就要处理通道里边的信息。
与客户端建立起连接,来生成 NioSocketChannel,这就是与客户端连接的通道,然后把这个通道注册到 selector 里边,selector 监听 READ 和 WRITE 事件,相当于通道里数据读准备就绪和数据写准备就绪。读准备就绪,相当于请求发来的数据已经收完,可以读了;写准备就绪,就是可以给客户端通道写响应了。
(2)读写都准备就绪以后,处理事件,比如读准备就绪,要做的任务也准备就绪,做一个任务,这时任务都会抛给任务队列,ANT 把这个任务队列执行完。包括我们监听 accept 也一样,也会生成任务队列,当监听好要去做什么,整个任务队列运行完成,整个 netty 就结束了。
(3)这有两个线程组,一个叫 boss,一个叫 worker。
Boss 其实就是用来监听主线程,来自于20880的所有连接准备就绪事件,这个worker 就是当准备就绪以后,要做什么工作,把这个工作抛给 worker,让 worker 慢慢来做。