dubbo源码实践-总结

Posted alf_cee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo源码实践-总结相关的知识,希望对你有一定的参考价值。

自己大概花了一个月的时间,断断续续的看了一遍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源码实践-总结的主要内容,如果未能解决你的问题,请参考以下文章

dubbo源码实践-serialize层的例子

dubbo源码实践-serialize层的例子

dubbo源码实践-开篇

合集DUBBO源码解析及最佳实践合集二十四篇

dubbo源码实践-protocol层例子

dubbo源码实践-protocol层例子