初识分布式服务管理框架-Dubbo
来源:互联网 发布:淘宝上好吃的零食推荐 编辑:程序博客网 时间:2024/05/02 01:27
Dubbo是阿里下面的一个开源分布式服务管理框架。它的产生是因为分布式的产生而产生的。下面将几点分享一下我对Dubbo的初步认识。通过dubbo的官方文档可以了解一下怎么使用以及基本的设计思想。http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm下面分享一下我对Dubbo的理解,可能其中存在误导,还望指正。
一、Dubbo的第一感受
当我看到上面这张图片,我一直在回忆我之前的开发经历。这张图很好的总结了J2EE发展至今的整个架构变更历程。再来一张图:
看到这个图,让我想起我大学时候接触的服务注册与发现,当时的服务是Web service服务,服务提供方是通过axis2(当然也可以用cxf,关于cxf可以看看@黄勇的Web Service 那点事儿 —— 使用 CXF 开发 SOAP 服务这里面有对CXF的详细介绍),服务注册和发现是通过JUDDI来实现的。当时是将Web service服务全部注册到JUDDI,然后调用服务,通过JUDDI提供的发现服务接口,查找服务,发现服务接口,可以分析服务的服务质量来给出最好的服务(当然,这种情况下同一种服务,有多个提供者)。瞬间让我怀念起大学的时代。所以看到这张图让我有一种很熟悉的感觉,于是也瞬间理解了这张图的意思。
这张图的大致意思可以理解为:
- 注册中心的职责:
(1)负责接受提供者服务注册的请求
(2)负责将消费者订阅的服务地址返回给消费者
(3)负责服务变更了,通知消费者
(4)管理注册中心内部的服务 - 消费者:这将自己需要的服务,想注册中心发起订阅,以及当服务存在变更,进行调整。
- 服务提供者:将自己的服务发布到注册中心,以及提供具体服务给消费者。
- 监控中心:负责监听服务的请求次数以及处理时间,方便服务的治理。
上面是我第一次看到Dubbo的感觉。关于如何使用,以及怎么使用,我这里就不做过多的介绍,相信大家去看看官方文档都能理解,里面讲的已经非常清楚了。
二、Dubbo初步深入
由于我是一个比较心急的人,到dubbo的github网站把源码下载到本地进行了初步的阅读和分析。查看dubbo的源码,看上去非常的庞大,但是深入去看,里面真正的核心内容很小,就是dubbo-common这个才是整个dubbo的核心内容。
要说dubbo的核心,它的扩展点的实现非常的赞!基本上Dubbo的所有东西都是在扩展点的基础上实现的。比如dubbo支持netty,mima或者zookeeper,这些东西都是dubbo中的一个扩展点。所以理解了dubbo的扩展点的思想,那么dubbo的其他每个扩展点怎么实现,那么就相对容易点了。
扩展点是Dubbo的核心,而扩展点的核心则是ExtensionLoader
,这个类有点类似ClassLoader
,但是ExtensionLoader
是加载Dubbo的扩展点的。下面列出ExtensionLoader
几个重要的属性结构。
public class ExtensionLoader<T> {private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<Class<?>, ExtensionLoader<?>>();private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<Class<?>, Object>();private final Class<?> type;private final ExtensionFactory objectFactory;private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<Map<String,Class<?>>>();private final Holder<Object> cachedAdaptiveInstance = new Holder<Object>();}
1、可以看到EXTENSION_LOADERS
属性是一个static final的,那么说明应该是一个常量,这个就是用来装载dubbo的所有扩展点的ExtensionLoader
,在Dubbo中,每种类型的扩展点都会有一个与其对应的ExtensionLoader
,类似jvm中每个Class
都会有一个ClassLoader
,每个ExtensionLoader
会包含多个该扩展点的实现,类似一个ClassLoader
可以加载多个具体的类,但是不同的ExtensionLoader
之间是隔离的,这点也和ClassLoader
类似。那么理解dubbo的ExtensionLoader
可以拿ClassLoader
来进行类比,这样会加快自己对它的理解。
2、另一个常量属性是EXTENSION_INSTANCES
,他是一个具体扩展类的实体,用于缓存,防止由于扩展点比较重,导致会浪费没必要的资源,所以在实现扩展点的时候,一定要确保扩展点可单例化,否则可能会出现问题。
3、另一个重要的属性是type,这里的type一般是接口,用于制定扩展点的类型,因为dubbo的扩展点申明是SPI的方式,所以某一个类型扩展点,就需要申明一个扩展点接口。比如ExtensionFactory
扩展点申明如下:
@SPIpublic interface ExtensionFactory {/** * Get extension. * * @param type object type. * @param name object name. * @return object instance. */<T> T getExtension(Class<T> type, String name);}
dubbo加载某个类型的扩展点是会遍历三个目录(META-INF/services/
,META-INF/dubbo/
,META-INF/dubbo/internal/
)下面查找type.getName的文件,里面的内容格式是extendName=classFullName
,所以说type是告诉dubbo扩展点的类型,以及查找该类型扩展点的方式。
4、扩展点相互依赖注入,dubbo通过ExtensionFactory
来解决,比如SpringExtensionFactory
和SpiExtensionFactory
,不同扩展点之间肯定存在依赖,那么其扩展点从哪里获取,就全部交给ExtensionFactory
来实现,通过上面ExtensionFactory
代码可以了解,要获取某个个具体的扩展点实现需要知道两个参数,第一个是扩展点类型,用于得到是哪个类型的扩展点,第二个是该扩展实现的名称,用于在某一类型的扩展中找到对应的实现。注意:在dubbo中ExtensionFactory
也被当作是一个扩展,那么就更说明在dubbo中无处不是扩展,另一个注意点是:只有ExtensionFactory
扩展的ExtensionLoader
的objectFactory
是null,其他的扩展的都必须有一个ExtensionFactory
实现赋值给objectFactory
属性。通过下面代码可以得知:
private ExtensionLoader(Class<?> type) { this.type = type; objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());}
5、上面的代码又告诉我们一个信息,在ExtensionLoader.getExtensionLoader(ExtensionFactory.class)
之后,不是直接返回某个扩展点,而是调用getAdaptiveExtension
来获取一个扩展的适配器,这是为什么呢?因为一个扩展点有多个具体扩展的实现,那么直接通过ExtensionLoader
直接返回一个扩展是不可靠的,需要一个适配器来根据实际情况返回具体的扩展实现。所以这里就有了cachedAdaptiveInstance
属性的存在,dubbo里面的每个扩展的ExtensionLoader
都有一个cachedAdaptiveInstance
,这个属性的类型必须实现ExtensionLoader.type
接口,这就是设计模式中的适配器模式。比如ExtensionFactory
扩展点就有AdaptiveExtensionFactory
适配器。扩展点的适配器可以是自己通过@Adaptive
,也可以不提供实现,由dubbo通过动态生成Adaptive来提供一个适配器类。此处需要注意:Adaptive也是扩展点的某个实现,下面例举出ExtensionFactory
扩展点的适配器:
@Adaptivepublic class AdaptiveExtensionFactory implements ExtensionFactory {private final List<ExtensionFactory> factories;public AdaptiveExtensionFactory() { ExtensionLoader<ExtensionFactory> loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class); List<ExtensionFactory> list = new ArrayList<ExtensionFactory>(); for (String name : loader.getSupportedExtensions()) { list.add(loader.getExtension(name)); } factories = Collections.unmodifiableList(list);}public <T> T getExtension(Class<T> type, String name) { for (ExtensionFactory factory : factories) { T extension = factory.getExtension(type, name); if (extension != null) { return extension; } } return null;}}
6、关于dubbo扩展点最后一个重要的属性就是cachedClasses
,这个就是存储当前ExtensionLoader
有哪些扩展点实现,从而可以实例化出某个具体的扩展点实体,cachedClasses
声明为Holder<Map<String, Class<?>>>
类型,其实可以理解为是Map<String, Class<?>>
类型,Map的key是在type.getName文件中的=
之前的内容,value这是这个扩展点实现的类对象了。
三、总结
通过上面分析,已经知道了dubbo可以做什么,以及dubbo的扩展点实现有了基本的了解。那么总结一下dubbo扩展点几个要点
1、一个扩展点类型一定是一个接口
2、一个扩展点一定对应一个ExtensionLoader
3、一个ExtensionLoader
一定有一个Adapter
4、一个扩展点可以有多个实现,并且都是用一个ExtensionLoader
进行加载
5、一个ExtensionLoader
(除去ExtensionFactory
扩展)都要有一个ExtensionFactory
到此,已经完成了一个dubbo的简单的分享,也算是对dubbo了解的一个开始吧。欢迎大家进行交流分享。
- 初识分布式服务管理框架-Dubbo
- 初识分布式服务管理框架-Dubbo
- 初识分布式服务管理框架-Dubbo
- 初识分布式服务管理框架-Dubbo
- 初识分布式服务框架dubbo
- 初识dubbo(阿里巴巴分布式服务框架)
- Dubbo分布式服务框架
- dubbo分布式服务框架
- 分布式服务框架DUBBO
- Dubbo分布式服务框架
- Dubbo分布式服务框架
- 分布式服务框架 Dubbo
- 分布式服务框架--Dubbo
- 分布式服务框架Dubbo
- Dubbo 分布式服务框架
- dubbo分布式服务框架
- 分布式服务框架(dubbo)
- dubbo分布式服务框架
- HDU 1301:Jungle Roads【Prim】
- 中文版、免费的项目管理工具:teambition worktile
- java邮件发送和短信发送(二)
- javax.mail 调用企业邮箱发送邮件,调用个人邮箱发送邮件
- 大数据时代:内存数据网格逐步成为主流
- 初识分布式服务管理框架-Dubbo
- 使用Apache Solr对数据库建立索引(包括处理CLOB、CLOB)
- 侧滑删除进阶(二)
- 彩色TabBar切换动画实现
- Android Service绑定与跨进程通信
- .NET平台和C#编程基础知识复习
- HDU1162
- 大家对华为的评价
- MQ JMS发送消息并接收客户端回复