dubbo源码实践-总结

alf_cee alf_cee     2023-01-12     370

关键词:

自己大概花了一个月的时间,断断续续的看了一遍dubbo源码,之前的文章从实践出发搭建了dubbo各层的例子!

Dubbo源码的学习也暂时告一段落。这篇就谈谈自己对dubbo源码学习个人感受!

1 dubbo是什么?

dubbo是一个RPC框架,用来实现程序间通信的。

可以看看官方的入门文档:https://cn.dubbo.apache.org/zh/docsv2.7/user/preface/

2 dubbo架构图

架构图原地址:https://cn.dubbo.apache.org/zh/docsv2.7/dev/design/

图中的每个类都要知道干什么的,解决什么问题的。

3 学到了什么?

3.1 dubbo基本设计原则

采用 Microkernel + Plugin 模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的,也就是 Dubbo 的所有功能点都可被用户自定义扩展所替换。

采用 URL 作为配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息。

“Microkernel + Plugin” 模式把流程和具体的实现细节分开,dubbo的整体流程相对固定,实现细节确是多样的。如:底层的通信框架可以用netty也可以用mina。这里其实就是指SPI。

“URL 作为配置信息的统一格式”这个比较奇怪,URL设置参数时就像一个MAP,之前的观念对MAP作为方法的入参比较排斥,一直认为MAP类型不应做入参。看了观念要改改了。

3.2 dubbo架构分层

在dubbo架构图中可以看出,dubbo把自己内部分了好多层,每个层都抽象了一些功能。之前做业务比较喜欢分模块,以后也要想到分层(以前不想的原因可能是Spring的应用,默认就3、4层)。

之前看dubbo源码,直接看服务的发布流程和调用流程比较懵,但是当按层搭建了实例并且分析了每层完成的任务后,再看服务的发布流程和调用流程就比较轻松了。

想了解流程可以参考官方说明文档:

服务导出: https://cn.dubbo.apache.org/zh/docsv2.7/dev/source/export-service/

服务引用: https://cn.dubbo.apache.org/zh/docsv2.7/dev/source/refer-service/

3.3 Invoker接口抽象

Invoker接口抽象的比较惊艳,消费端用Invoker封装了远程调用、集群调用(路由、负载均衡),服务提供端用Invoker封装了业务服务的调用,同时还提供了Invoker的异步转同步实现类(参见AsyncToSyncInvoker类)。

Invoker还支持互相嵌套。

Filter接口也有可以看看,也实现了对Invoker的包装,类似web应用中的Filter。

3.4 jdk动态代理、反射和javassist的学习

dubbo在消费端使用了jdk动态代理或者javassist来生成接口的实现类,服务提供端使用反射或者javassist来完成对相应业务服务类的调用。可以参考JdkProxyFactory、JavassistProxyFactory。

3.5 CompletableFuture类

dubbo的异步使用了 jdk1.8 提供的CompletableFuture类,需要了解和使用一下。

3.6 dubbo中的时间轮和线程池实现

dubbo中的时间轮和线程池实现,有空需要了解一下。

4 和面试官怎么聊?

1)Microkernel + Plugin 模式(SPI) + URL参数。

2)架构分层,每一层的功能。架构图要牢记。

3)dubbo的各个功能需要看一看:

A. 推荐用法 https://cn.dubbo.apache.org/zh/docsv2.7/user/recommend/

B. 参考手册 https://cn.dubbo.apache.org/zh/docsv2.7/user/references/

4)在结合项目聊聊

dubbo源码实践-开篇

最近有点时间,想学习一下dubbo2.7的源码。推荐源码的学习资料:00开篇词深入掌握Dubbo原理与实现,提升你的职场竞争力-打工人技术合集该资料在Bilibili站上还有对应的学习视频。比较赞!!!网上的很多... 查看详情

源码分析dubbo专栏

本系列文章主要针对Dubbo2.6.2(dubbox2.8.4)版本,从源码的角度分析Dubbo内部的实现细节,加深对Dubbo的各配置参数底层实现原理的理解,更好的指导Dubbo实践,其目录如下:1、源码分析Dubbo前置篇-寻找注册中心、... 查看详情

dubbo源码实践-protocol层例子(代码片段)

...讨论服务提供者和服务消费者的概念了。参考上一篇dubbo源码实践-protocol层-invoker理解,本文理解起来应该不难。2例子2.1项目 查看详情

dubbo源码实践-config层例子(代码片段)

1概述本文主要参考官方例子:https://cn.dubbo.apache.org/zh/docsv2.7/user/configuration/api/今天例子我们总要使用Config层的API来搭建dubbo调用的例子。通过图可以看到,主要是两个类:ReferenceConfig类(客户端使用该类)、Se... 查看详情

dubbo源码实践-protocol层例子

...讨论服务提供者和服务消费者的概念了。参考上一篇dubbo源码实践-protocol层-invoker理解,本文理解起来应该不难。2例子2.1项目截图ProtocolClientTest服务消费者(即客户端)、ProtocolServerTest服务提供者(即提供者)。业务服务IAlfService... 查看详情

dubbo源码实践-config层例子

1概述本文主要参考官方例子:https://cn.dubbo.apache.org/zh/docsv2.7/user/configuration/api/今天例子我们总要使用Config层的API来搭建dubbo调用的例子。通过图可以看到,主要是两个类:ReferenceConfig类(客户端使用该类)、Se... 查看详情

dubbo源码实践-spi扩展(代码片段)

1概述SPI的官方文档说明:DubboSPI|ApacheDubboSPI全称为ServiceProviderInterface,是一种服务发现机制。SPI的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时... 查看详情

dubbo源码实践-spi扩展-自适应扩展机制(代码片段)

...口,扩展等价于实现类。3自适应扩展机制的特点看过源码后,想自己总结关于自适应扩展机制的特点:1自适应扩展点,一个接口只能对应一个自适应扩展,其他的扩展都是实现业务功能的扩展,该类只会... 查看详情

dubbo源码实践-serialize层的例子(代码片段)

...serialize层概述2序列化的简单例子2.1项目截图 2.2三个类的源码2.2.1 ABC是实体类2.2.2 TestSeriarsWrite把ABC对象序列化到文件中2.2.3 TestSeriarsRead从文件中读取ABC对象2.2.4运行结果 3展示一个通过URL属性动态切换序列化实现类的例子3.1原... 查看详情

dubbo源码实践-spi扩展-自适应扩展机制(代码片段)

目录1前提必备知识2术语定义3自适应扩展机制的特点4扩展点实践4.1用户自定义自适应扩展4.2dubbo生成自适应扩展4自适应扩展类的用途1前提必备知识具体的使用和原理就不说了,网上有人写的挺好的了。可以参考:DubboSPI... 查看详情

dubbo源码实践-exchange信息交换层例子(代码片段)

1Exchange层概述官方定义:exchange信息交换层:封装请求响应模式,同步转异步,以Request,Response为中心,扩展接口为Exchanger,ExchangeChannel,ExchangeClient,ExchangeServer。其中Exchanger是SPI扩展点,是该层的入口。其中... 查看详情

dubbo源码实践-protocol层-invoker理解(代码片段)

...远程的实现,也可能一个集群实现。1.1Invoker接口通过源码可知Invo 查看详情

撸完dubbo源码,冰河总结了这些阅读源码的技巧,赶快收藏

...,大部分都是在询问如何快速掌握一个框架的原理和源码,比如:Spring、Dubbo、MyBatis等。针对这个问题,周末我简单总结了下,今天,就为小伙伴们分享下我是如何利用不到一个月的业余时间(每天不... 查看详情

源码分析dubbo专栏

本系列文章主要针对Dubbo2.6.2(dubbox2.8.4)版本,从源码的角度分析Dubbo内部的实现细节,加深对Dubbo的各配置参数底层实现原理的理解,更好的指导Dubbo实践,其目录如下:1、源码分析Dubbo前置篇-寻找注册中心、... 查看详情

dubbo源码实践-protocol层-invoker理解

...远程的实现,也可能一个集群实现。1.1Invoker接口通过源码可知Invoker接口不是SPI。可以调用invoke方法执行调用。Invocation是参数,如:调用那个方法名称、参数的类型、参数的值是什么等信息。1.2Invoker的实现类从下图... 查看详情

dubbo原理应用与面经总结(代码片段)

  研读dubbo源码已经有一段时间了,dubbo中有非常多优秀的设计模式和示例代码值得学习,但是dubbo的调用层级和方法链都较为繁杂,如果不对源码思路进行梳理则很容易忘却,因此总结一篇研读心得,从阅读源码的思路、... 查看详情

dubbo源码实践-transport网络传输层的例子

1Transporter层概述Transporter层位于第2层,已经实现了完整的TCP通信,定义了一套Dubbo自己的API接口,支持Netty、Mina等框架。官方定义:transport网络传输层:抽象mina和netty为统一接口,以Message为中心,扩展... 查看详情

dubbo源码实践-transport网络传输层的例子(代码片段)

1Transporter层概述Transporter层位于第2层,已经实现了完整的TCP通信,定义了一套Dubbo自己的API接口,支持Netty、Mina等框架。官方定义:transport网络传输层:抽象mina和netty为统一接口,以Message为中心,扩展... 查看详情