文档章节

初识分布式服务管理框架-Dubbo

l
 liuqqq
发布于 2016/05/13 01:47
字数 2297
阅读 268
收藏 0
点赞 2
评论 2

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. 注册中心的职责:

    (1)负责接受提供者服务注册的请求

    (2)负责将消费者订阅的服务地址返回给消费者

    (3)负责服务变更了,通知消费者

    (4)管理注册中心内部的服务
  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几个重要的属性结构。

<!-- lang:java -->
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扩展点申明如下:

<!-- lang:java -->
@SPI
public 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来解决,比如SpringExtensionFactorySpiExtensionFactory,不同扩展点之间肯定存在依赖,那么其扩展点从哪里获取,就全部交给ExtensionFactory来实现,通过上面ExtensionFactory代码可以了解,要获取某个个具体的扩展点实现需要知道两个参数,第一个是扩展点类型,用于得到是哪个类型的扩展点,第二个是该扩展实现的名称,用于在某一类型的扩展中找到对应的实现。注意:在dubbo中ExtensionFactory也被当作是一个扩展,那么就更说明在dubbo中无处不是扩展,另一个注意点是:只有ExtensionFactory扩展的ExtensionLoaderobjectFactory是null,其他的扩展的都必须有一个ExtensionFactory实现赋值给objectFactory属性。通过下面代码可以得知:

<!-- lang:java -->
 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扩展点的适配器:

<!-- lang:java -->
@Adaptive
public 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了解的一个开始吧。欢迎大家进行交流分享。

核心技术:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx 
1.     项目核心代码结构截图

分布式框架介绍 - kafkaee - kafkaee的博客

   项目模块依赖分布式框架介绍 - kafkaee - kafkaee的博客

特别提醒:开发人员在开发的时候可以将自己的业务REST服务化或者Dubbo服务化

2.    项目依赖介绍

   2.1 后台管理系统、Rest服务系统、Scheculer定时调度系统依赖如下图:
 

分布式框架介绍 - kafkaee - kafkaee的博客

       2.2 Dubbo独立服务项目依赖如下图:

 分布式框架介绍 - kafkaee - kafkaee的博客

3.  项目功能部分截图:

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客
 

zookeeper、dubbo服务启动 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客
 

dubbo管控台 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 REST服务平台

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

 

分布式框架介绍 - kafkaee - kafkaee的博客

© 著作权归作者所有

共有 人打赏支持
l
粉丝 2
博文 11
码字总数 42714
作品 0
东城
加载中

评论(2)

l
liuqqq
核心技术:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx
l
liuqqq
核心技术:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx
Dubbo学习之旅一-初识Dubbo

1.Dubbo是什么 Dubbo是一个分布式服务框架, 是SOA面向服务的架构的一种很好的实现,致力于提高性能和透明化的RPC(Remote Procedure Call Protocol)远程服务调用方案, dubbo就是一个服务框架,...

陈小扁 ⋅ 2016/04/27 ⋅ 0

Dubbo学习(一)

Dubbo心得之what,why 一.概述 个人觉得学习新技术首先就要知道它是做什么的?有什么样的作用?我们为什么要使用它,它对于我们开发来说有什么好处,所以这就是要说的what?why? 二.Dubbo是什...

清风傲剑 ⋅ 2014/11/13 ⋅ 0

分布式模块化 Java 开发平台--Castle-Platform

Castle-Platform是一个分布式、模块化的开发平台,目标是打造高性能、高扩展性的开发平台,完成通用的管理功能。采用了后台管理集中部署,会员业务系统可分离部署等特点,可独立区分后台管理...

tunsi ⋅ 2016/10/21 ⋅ 6

分布式服务框架

转公司wiki博客. 分布式服务框架是面向服务架构的基石,是解耦子系统的利刃。核心实现是RPC(远程过程调用),但又不仅限于RPC,因为一个系统的高效、稳定、可靠的运行还需要依赖于服务管理发...

郭恩洲_OSC博客 ⋅ 2015/09/11 ⋅ 0

(一)构建dubbo分布式平台-平台导语简介

导语: 怎么搭建一套满足企业未来发展的通用架构平台?现在分布式、微服务、云平台的口号是如此的响亮,技术更新是如此的迅速,很多架构师选择使用dubbo、spring cloud的方案去帮助企业搭建分...

park ⋅ 2017/11/27 ⋅ 0

JEESZ分布式框架--技术介绍文档

摘要: 1.Eclipse IDE:采用Maven项目管理,模块化。 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码如果不需...

qq592fbb5b34ad7 ⋅ 2017/06/05 ⋅ 0

JEESZ分布式框架--技术介绍文档

摘要: 1.Eclipse IDE:采用Maven项目管理,模块化。 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码如果不需...

qq592fbb5b34ad7 ⋅ 2017/06/01 ⋅ 0

PussInBoots/Morning

猫宁Morning公益商城系统 但行好事,莫问前程。(基于SSM框架的公益B2C网上商城的设计与实现) QQ群:558243903 紧急求助 本人大四马上毕业了,专业电子商务,非科班生,大三自学Java,急需一...

PussInBoots ⋅ 2016/11/17 ⋅ 0

dubbo学习记录(一)dubbo简介

作为阿里开源的项目,dubbo出现也有段时间了,之前接触过一点,但是没细研究,这次抽出时间来具体学习一下。 一、什么是Dubbo? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远...

zq17865815296 ⋅ 01/06 ⋅ 0

teacher kwan/JeeRTD

JeeRTD简介 JeeRTD基于SpringBoot+SrpingCloud+Spring+SpringMVC+Mybatis+Redis+阿里巴巴dubbo+Javax.ws微服务分布式代码生成的敏捷开发系统架构。项目代码简洁,注释丰富,上手容易,还同时集中...

teacher kwan ⋅ 2017/06/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 15分钟前 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部