Dubbo源码分析(一)Dubbo的扩展点机制
写在前面的话
自己用Dubbo也有几年时间,一直没有读过Dubbo的源码,现在来读一读Dubbo的源码,分析一下Dubbo的几个核心,并写一个Dubbo的源码专题来记录一下学习过程,供大家参考,写的不好的地方,欢迎拍砖
专题分为以下几个部分:
- Dubbo源码分析(一)Dubbo的扩展点机制
- Dubbo源码分析(二)Dubbo服务发布Export
- Dubbo源码分析(三)Dubbo的服务引用Refer
- Dubbo源码分析(四)Dubbo调用链-消费端(集群容错机制)
- Dubbo源码分析(五)Dubbo调用链-服务端
- Dubbo源码分析(六)Dubbo通信的编码解码机制
- Dubbo框架的设计细节 (未完,待续)
PS:读源码前先掌握以下基础
- JDK的SPI
- Java多线程/线程池基础
- Javasissit基础(动态编译)
- Netty基础
- Zookeeper基础,zkClient客户端API
- 工厂模式,装饰模式,模板模式,单例模式,动态代理模式
- Spring的schema自定义扩展
- 序列化
PS:读源码前的建议
- 代码量很大,各个地方都有关联,慢慢读,不要着急,一遍不行就两遍,两遍不行就三遍,总有看懂的时候
- 带着问题去看,先想想这段代码的目的是什么,解决了什么问题
- 沿着一条主线读,不影响流程走向的代码可以略过
Dubbo的扩展点
为什么先读扩展点
之所以选择先从Dubbo的扩展点机制入手,因为Dubbo的整体架构设计上,都是通过扩展点去实现,先了解清楚这块内容,才能读懂代码。
Dubbo扩展点规范
- 如果要扩展自定义的SPI,可以在resources目录下配置三种目录,分别是:META-INF/dubbo/ 或者 META-INF/services/ 或者 META-INF/dubbo/internal/
- 文件名称和接口名称保持一致,文件内容为key=vaule的形式xxx=com.alibaba.xxx.XxxProtocol
- 举个栗子:如果我们要扩展Dubbo的一个协议,在META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol这个文件里面增加一行自己的扩展:xxx=com.alibaba.xxx.XxxProtocol,在Dubbo的配置文件<dubbo:protocol name="xxx" />,这样就可以实现自定义的Dubbo协议
Dubbo的扩展点和JDK的SPI的区别
Dubbo的扩展点(Extension)在JDK的SPI思想的基础上做了一些改进:
- Dubbo的设计中用到了大量的全局缓存,所有的Extension都缓存在cachedInstances中,该对象类型为ConcurrentMap<String, Holder