Dubbo的扩展点的背景与实现
来源:互联网 发布:sql sum函数 编辑:程序博客网 时间:2024/06/07 06:04
Java有以下几个常用扩展点加载的实现:
标准的Java Service(sun.misc.Service/java.util.ServiceLoader)
Spring classpath*
OSGi
都可以做到新加入一个Extension的Jar在启动时甚至是运行时发现新的扩展点。
Dubbo的扩展点实现方式采用了标准Java Service,使用相同的配置文件,在此之上结合Dubbo的使用方式作一些加强
一、关于Java中的SPI(Service Provider Interface)介绍
原始定义可以参见链接如下: http://download.oracle.com/javase/1.5.0/docs/guide/jar/jar.html#Service Provider
那么这个东西是用来做什么的呢?一般来说,一个比较大的系统里的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。
为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。
这种实现方式,感觉和我们通常的开发方式差不多,都是定义一个接口,然后子类实现父类中定义的方法,为什么要搞这么一套标准以及单独搞一个配置文件?这种方式主要是针对不同的服务提供厂商,对不同场景的提供不同的解决方案制定的一套标准,举个简单的例子,如现在的JDK中有支持音乐播放,假设只支持mp3的播放,有些厂商想在这个基础之上支持mp4的播放,有的想支持mp5,而这些厂商都是第三方厂商,如果没有提供SPI这种实现标准,那就只有修改JAVA的源代码了,那这个弊端也是显而易见的,也就是不能够随着JDK的升级而升级现在的应用了,而有了SPI标准,SUN公司只需要提供一个播放接口,在实现播放的功能上通过ServiceLoad的方式加载服务,那么第三方只需要实现这个播放接口,再按SPI标准进行打包成jar,再放到classpath下面就OK了,没有一点代码的侵入性。
二、Dubbo的实现
由于Dubbo是开源框架,必须要提供很多的可扩展点。Dubbo是通过扩展SPI机制来实现可扩展的。
(1)在META-INF目录下,放置文件名为接口全称,文件中为key、value键值对,value为具体实现类的全类名,key为标志值。
(2)通过ExtensionLoader把对应的设置文件装入,查看ExtensionLoader的源码,可以看到Dubbo对SPI做了三个方面的扩展:
* SPI仅仅通过接口类名获取所有实现,而ExtensionLoader则通过接口类名和key值获取一个实现;
* Adaptive实现,就是生成一个代理类,这样就可以根据实际调用时的一些参数动态决定要调用的类了。
* 自动包装实现,这种实现的类一般是自动激活的,常用于包装类,比如Protocol的两个实现类:ProtocolFilterWrapper、ProtocolListenerWrapper。
- Dubbo的扩展点的背景与实现
- 对于Dubbo的扩展点加载机制的一些想法
- Dubbo/Dubbox的服务暴露(二)-扩展点机制
- 深入dubbo之ExtensionLoader,灵活的扩展点加载机制
- Dubbo架构出现的背景
- dubbo扩展点
- Dubbo源码分析系列-扩展机制的实现
- Dubbo源码分析 ---- 基于SPI的扩展实现机制
- dubbo的SPI扩展实现原理简解
- Dubbo 超时与重试的实现分析
- dubbo extension扩展点 源代码
- 初识Dubbo 系列之前传1-Dubbo产生的背景
- Dubbo远程服务框架的背景
- 史上最牛的扩展点
- Dubbo的SPI实现
- 基于dubbo扩展系统的调试实践
- zookeeper集群与Dubbo的实现与整合
- 扩展ListView的实现重点(ExpandableListView的强调点)
- Linux学习笔记3
- Android利用ViewPager实现滑动广告板
- IDF实验室:百密一疏--凯撒加密
- 实现自己的gen.engine和gen.Task
- 显示动画基本属性
- Dubbo的扩展点的背景与实现
- 反爬虫
- 因为有了因为,所以有了所以。既然已成既然,何必再说何必。
- MVC传递Model之TempData、ViewData、ViewBag区别及用途
- android 基于java的Socket通信的多人聊天分析
- 第十九篇 Java语句中的循环介绍
- Seagate Central 2014.0410.0026-F Remote Root Exploit
- Mybatis与Hibernate
- gradle入门