Dubbo笔记
## 初步认为Dubbo是一个分布式调用其他服务的框架,在没有使用dubbo框架的时候,我们调用其他网站的接口时需要使用http发送一个请求到指定的服务接口上。而dubbo的主要功能就是将其他网站的服务透明化,即可以像调用一个本地方法一样调用远程服务。
通过资料得知Dubbo是基于RPC框架,RPC框架带来的几个问题,关于RPC的具体内容可以参考这篇https://www.jianshu.com/p/b0343bfd216e
1. Call ID映射
我们需要调用一个方法,在本地环境中方法可以通过指针来指定,而在远程方法调用时,两台机器的进程寻址地址是不同的。所以在RPC框架中,每个方法都有一个ID,这个ID在进程中都是唯一确定的。客户端在调用远程方法时需要带上ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <--> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的方法对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的方法,然后执行相应方法的代码
2. 序列化和反序列化
客户端怎么把参数值传给远程的方法呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。
3. 网络传输
远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。
Dubbo的流程图
通过这张流程图可以清晰看到dubbo是消费者和提供者的关系,程序运行时服务提供者将服务在注册中心注册,消费者在注册中心订阅服务。这样消费者就可以看到有哪些服务是可以调用的,最后有一个监控模块来监控服务的数量。
以上便是个人对dubbo的理解,如有错误,请指出!