自己大概花了一个月的时间,断断续续的看了一遍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)在结合项目聊聊