首先看Extension扩展,相当于dubbo最底层核心
如开发者所述:“Dubbo的扩展点加载从JDK标准的SPI(Service Provider Interface)扩展点发现机制加强而来。" ,基本上与ServiceLoader类似(童鞋们,可以先看ServiceLoader源码再来看这个,比较理解),但功能增强
增强了 Wrapper 包装 ,cachedActivates 自动激活,Adaptive自适应,objectFactory Extension实例的属性获取对象方式,这4类。
下面看源码,整个Extension扩展 ,最主要类就只有一个 : ExtensionLoader
先来看 ExtensionLoader属性:
private static final Logger logger = LoggerFactory.getLogger(ExtensionLoader.class); //loggerFactory是dubbo自己封装 了log4j\jdkLog而来的。找不到log4j就去jdklog
private static final String SERVICES_DIRECTORY = "META-INF/services/";//静态,请看下面的地址,这个地方也可以配,但是如果自己又使用了ServiceLoader,2者会有冲突。
private static final String DUBBO_DIRECTORY = "META-INF/dubbo/";//静态,主要Extension扩展 的地方
private static final Pattern NAME_SEPARATOR = Pattern.compile("\\s*[,]+\\s*");//静态,这个不解释
private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<Class<?>, ExtensionLoader<?>>();//静态,放置所有ExtensionLoader
private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<Class<?>, Object>();//静态,放置所有Extension 实例对象
private final Class<?> type; //ExtensionLoader实例所对应的接口Class
private final ConcurrentMap<Class<?>, String> cachedNames = new ConcurrentHashMap<Class<?>, String>();//用于所有接口实现的Class 查找name,对于多name的取第一个
private final Reference<Map<String, Class<?>>> cachedClasses = new Reference<Map<String,Class<?>>>();//用于所有接口实现的name查找Class,对于多name,会存在 多name 对应一个Class
private final Map<String, Activate> cachedActivates = new ConcurrentHashMap<String, Activate>();//自动激活用
private final ConcurrentMap<String, Reference<Object>> cachedInstances = new ConcurrentHashMap<String, Reference<Object>>();//本接口的实例
private volatile Class<?> cachedAdaptiveClass = null;
private final Reference<Object> cachedAdaptiveInstance = new Reference<Object>();//自适应实例
private volatile Throwable createAdaptiveInstanceError;
private Set<Class<?>> cachedWrapperClasses;//包装类Class
private String cachedDefaultName;//默认使用扩展实例,由SPI注解value指定
private Map<String, IllegalStateException> exceptions = new ConcurrentHashMap<String, IllegalStateException>();
private final ExtensionFactory objectFactory;//扩展实例的属性获取Factory
下面是行为方法:
Public 方法
getExtensionLoader
获取 ExtensionLoader 的唯一方式
然后 会在 方法内部调用构造器 ,构造器中 为每一个ExtensionLoader 生成一个 ExtensionFactory 实例
getAdaptiveExtension
大部分 使用ExtensionLoader 都会调用 AdaptiveClass 来进行选择处理
这个方法 在第一次调用的时候会 载入 SERVICES_DIRECTORY DUBBO_DIRECTORY 文件里面对应 的 ClassName ,所以这里是延迟载入
其余的Public 方法 没什么好说的
private 方法
在 getAdaptiveExtension 中载入的时候 调用过程如下
getAdaptiveExtension --createAdaptiveExtension --getAdaptiveExtensionClass --getExtensionClasses (载入文件ClassName)-----如果没有AdaptiveClass-----就会通过 createAdaptiveExtensionClass 字节码生成AdaptiveClass-------injectExtension
getAdaptiveExtension
public T getAdaptiveExtension() {
Object instance = cachedAdaptiveInstance.get();
if (instance == null) {
if(createAdaptiveInstanceError == null) {
synchronized (cachedAdaptiveInstance) {
instance = cachedAdaptiveInstance.get();
if (instance == null) {
try {
instance = createAdaptiveExtension();
cachedAdaptiveInstance.set(instance);
} catch (Throwable t) {
createAdaptiveInstanceError = t;
rethrowAsRuntime(t, "fail to create adaptive instance: ");
}
}
}
}
else {
rethrowAsRuntime(createAdaptiveInstanceError, "fail to create adaptive instance: ");
}
}
return (T) instance;
}
createAdaptiveExtension -- 创建 AdaptiveExtension
private T createAdaptiveExtension() {
try {
return injectExtension((T) getAdaptiveExtensionClass().newInstance());
} catch (Exception e) {
throw new IllegalStateException("Can not create adaptive extenstion " + type + ", cause: " + e.getMessage(), e);
}
}
getAdaptiveExtensionClass -- 获取 AdaptiveExtension 里面包含了 2中 AdaptiveExtension 来源
private Class<?> getAdaptiveExtensionClass() {
getExtensionClasses();
if (cachedAdaptiveClass != null) {
return cachedAdaptiveClass;
}
return cachedAdaptiveClass = createAdaptiveExtensionClass();
}
getExtensionClasses 方法 装配文件 ,
然后判断 有没有cachedAdaptiveClass
如果没有 createAdaptiveExtensionClass 字节码创建
injectExtension 方法-- 通过 objectFactory 来对 AdaptiveExtension Instance 进行 DI。
下面来说说这个
createAdaptiveExtensionClass 中的
createAdaptiveExtensionClassCode 方法
通过字节码生成 AdaptiveClass
但是
字节码生成的AdaptiveClass 严重依赖URL(主要是依赖URL里面的 protocol)。。看起来不那么优雅。
ExtensionLoader 作为 系统核心Loader模式,不应该过分只为Protocol 服务。
分享到:
相关推荐
《MyDubbo:Dubbo源码学习笔记》 在Java开发领域,Dubbo是一个非常知名的分布式服务框架,它由阿里巴巴开源并广泛应用于大型企业系统。本篇笔记将深入探讨Dubbo的核心概念、工作原理以及源码解析,帮助开发者更好地...
通过阅读和分析源码,我们可以更深入地理解其内部机制,以便更好地应用和扩展Dubbo,满足各种复杂的分布式系统需求。在实际项目中,结合注册中心、监控系统以及服务治理策略,Dubbo能够帮助开发者构建高可用、可扩展...
Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java服务框架,广泛应用于分布式系统中。本文将深入剖析Dubbo服务的注册、发布以及消费的源码流程,帮助读者理解其核心机制。 一、服务注册 在Dubbo中,服务注册是...
Apache Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了服务治理的全套解决方案。在服务治理中,服务注册与服务消费是两个核心概念。本文将深入探讨这两个过程的源码分析,以及涉及到的重要概念——Invoker...
此文档是从学习 dubbo 源码过程中的笔记中整理出来的,由于时间及能力 原因,理解有误之处还请谅解,希望对大家学习使用 dubbo 有所帮助。 dubbo 是阿里基于开源思想 java 实现的服务治理中间件, 目前除了阿里之 外...
打包好的dubbo-2.8.4.jar 记录笔记 一般可直接下载用
而Zookeeper是Apache的一个开源项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是集群的必备组件,常被用来作为服务注册中心。 【描述】"dubbo+zookeeper入门资源,可直接使用,适合新手练习使用"意味...
Dubbo,一款由阿里巴巴开源的高性能Java RPC框架,是服务治理的典型代表,广泛应用于分布式系统中。本资源包包含了几个关键的学习示例,旨在帮助开发者深入理解并掌握Dubbo的核心概念和技术。 1. **Dubbo核心组件**...
【Dubbo】是阿里巴巴开源的一款高性能、轻量级的服务治理框架,主要应用于微服务架构中。它提供服务注册、服务发现、负载均衡、容错机制等核心功能,极大地简化了分布式系统开发和运维的复杂性。 在【Java】平台上...
### Dubbo常用配置文件分析及核心源码阅读 #### 多版本支持 在微服务架构中,服务的迭代更新不可避免,而如何确保新旧版本之间的兼容性成为一个关键问题。Dubbo通过多版本支持机制,有效地解决了这一问题。具体...
6. **文档**:可能包含使用指南、API文档或开发者笔记,帮助用户理解和使用Dubbo Admin。 7. **构建脚本**:如Maven的`pom.xml`或Gradle的`build.gradle`,用于自动化构建过程。 总结来说,"dubbo_admin2.5.4"是一...
2. **Zookeeper**:Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。在这里,Zookeeper作为Dubbo的服务...
学习Dubbo源码有助于理解其核心的RPC(远程过程调用)机制,包括服务发现、负载均衡、故障转移等。通过源码分析,我们可以了解到如何实现高效的服务注册与发现,以及如何设计高可用的服务调用流程。 2. **Spring**...
接下来,深入到5.3-Dubbo核心源码分析-笔记.pdf,这份文档可能详细解读了Dubbo的关键组件和其工作原理: 1. **Protocol组件**:Dubbo的协议层负责序列化、反序列化以及网络通信,例如Dubbo协议、RMI协议、Hessian2...
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、...
java实现校园一卡通源码 1、分布式基础 1.1 什么是分布式系统 《分布式系统原理与范型》定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统。分布式系统(distributed system)是建立...
源码中可能包含了 Dubbo 服务的创建、消费以及与 Spring Cloud 的整合。 4. **Seata**:Seata 是一个分布式事务解决方案,提供 AT、TCC、SAGA 和 XA 事务模式。在课程源码中,学习者可以学习到如何在微服务环境中...
java系统源码 SpringCloud笔记 1、前言 1.1、回顾 回顾之前的知识 JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot Dubbo、Zookeeper、分布式基础 Maven、Git Ajax、Json ... 串一下自己会的...
总结,这个课程笔记涵盖的IT知识广泛,包括基础编程、数据结构、面试策略、求职平台、热门技术和职业规划,对于准备面试的Java开发者来说是一份宝贵的资源。学习和掌握这些内容将有助于提升面试成功率,并在IT行业中...