Dubbo源码解析-Dubbo架构的实现

Dubbo源码解析-Dubbo架构的实现,第1张

Dubbo源码解析-Dubbo架构的实现 前言:

在经过前面的学习之后,我们对Dubbo consumer、provider处理请求的过程有了一个基本了解。

从本文开始,我们就要对Dubbo框架进行拆解,讲解每一个具体的技术点了。这样从使用到每层的技术点分析,可以完整的掌握整个Dubbo框架。

本文就先从框架的整体面貌讲起,逐层来分析,后续针对每一个层次都会有专门的文章来说明。

1.Dubbo架构图

Dubbo的相关架构比较复杂,主要是分层次比较多。每层之间基本都是通过SPI的方式来生成调用的。

通过SPI方式的调用,具有高度的灵活性、可扩展性。也比较容易开发出用户特定的功能。

下面这张图就是从Dubbo官网上拷贝下来的(来自:框架设计 | Apache Dubbo)

 

2.Service/Config层

API接口层,我们的服务发布通过ServiceConfig来完成;服务消费则通过ReferenceConfig来完成。

在创建ServiceConfig、ReferenceConfig的过程中,我们还可以通过创建ProtocolConfig来指定协议,MethodConfig来指定方法相关参数等。

3.Proxy层

对服务消费者而言,Proxy作为消费者代理,将本地调用转换为远程调用;

对服务提供者而言,Proxy对服务实现类进行代理,把服务实现类转换为Wrapper类。

该层所使用接口为ProxyFactory,而其实现类主要有以下两种,而JavassistProxyFactory是默认实现类。

 

 

4.Registry层

服务注册中心层。

服务提供者在启动时将服务的URL注册到服务注册中心去;

而消费者在启动时也会将当前的URL注册到服务注册中心去。当消费者需要获取特定服务时,则会去注册中心上找对应的服务提供者,获取到以后即可发起(远程)调用。

下图便是Dubbo提供的一些主要的注册中心实现

 

5.Cluster层

正如在自定义一个简单的RPC 博客中说到的那样,当一个服务有多个提供者时,消费者在选择服务进行消费时,需要有一定的路由、负载均衡、集群容错的考量。

而Dubbo中的Cluster层正是为了完成这些功能而实现的。

目前Cluster层的实现类有如下几种(后续会专门博客来介绍下相关Cluster的不同作用)

 

6.Monitor层

有关于该层之前基本没有介绍过。Monitor层主要是用来统计RPC调用次数和调用耗时事件的。扩展接口为MonitorFactory,对应实现类为DubboMonitorFactory。

用户也可以自定义监控统计策略。

7.Protocol层

Protocol在整个框架而言,就是重点模块了。

在Protocol层中,主要封装了RPC调用逻辑。该层次起到了承上启下的作用,通过Exporter、Invoker的创建,完成服务的发布和引用。

主要的实现类如下:

 

默认实现则是DubboProtocol,该协议是使用Dubbo自定义的一种协议方式,将请求和响应按照该协议格式来完成请求(响应)体发送和接收。后续会专门来介绍该协议实现。

8.Exchange层

Exchange层的相关代码和实现都比较简单。其主要作用就是:封装请求响应模式,同步转异步。

扩展接口为Exchanger,相关实现只有一个HeaderExchanger。

9.Transport层

该层次相对而言,已经比较底层了。

它的主要作用就是发起网络传输。网络传输主要采用集成框架的方式来实现,比如Netty、Mina等。

主要实现如下图所示:

 

有关于这块知识点,需要读者了解Netty(默认实现)的相关API

10.Serialize层

序列化层,这个层次比较容易理解。

所有需要远程传输的对象,都需要序列化为字节数组后才能发起传输,所以Dubbo框架提供了多种序列化对象的方式。如下:

 

以上序列化方式,都各有其优势,Dubbo默认使用的是Hessian2。后续会专门对这些序列化方式进行分析。

总结:

在对Dubbo框架分层有一个大概的认识之后,后面我们就要对这些层次进行详细介绍了。

其中,重点层次是Cluster、Protocol、Serialize这些层次。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5635465.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存