`
LoveLZY
  • 浏览: 57344 次
  • 性别: Icon_minigender_1
博客专栏
Group-logo
从零编写RPC框架
浏览量:0
社区版块
存档分类
最新评论

dubbo源码研究之extension模块

阅读更多
   dubbo的扩展采用spi机制实现,spi(Service Provider Interface)是指一些提供给你继承、扩展,完成自定义功能的类、接口或者方法。spi把控制权利交个调用方,调用方来决定使用该spi的哪个实现。
   dubbo扩展机制的核心类是ExtensionLoader,该类通过静态方法getExtensionLoader获取一个指定接口的ExtensionLoader实例。
 
    @SuppressWarnings("unchecked")
    public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
        if (type == null)
            throw new IllegalArgumentException("Extension type == null");
        if(!type.isInterface()) {
            throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");
        }
        if(!withExtensionAnnotation(type)) {
            throw new IllegalArgumentException("Extension type(" + type + 
                    ") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!");
        }
        
        ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
        if (loader == null) {
            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));
            loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
        }
        return loader;
    }


   该方法要求通过spi实现的接口上必须包含@spi注解,并且一个接口的ExtensionLoader是唯一的,保存在静态容器EXTENSION_LOADERS(ConcurrentHashMap)中。
   ExtensionLoader提供实例方法getExtension获取该接口的具体实现。
 
  	public T getExtension(String name) {
		if (name == null || name.length() == 0)
		    throw new IllegalArgumentException("Extension name == null");
		if ("true".equals(name)) {
		    return getDefaultExtension();
		}
		Holder<Object> holder = cachedInstances.get(name);
		if (holder == null) {
		    cachedInstances.putIfAbsent(name, new Holder<Object>());
		    holder = cachedInstances.get(name);
		}
		Object instance = holder.get();
		if (instance == null) {
		    synchronized (holder) {
	            instance = holder.get();
	            if (instance == null) {
	                instance = createExtension(name);
	                holder.set(instance);
	            }
	        }
		}
		return (T) instance;
	}


  具体流程如下



  该方法通过大量缓存容器来优化性能,并且每个扩展点都是单例存在,所以扩展dubbo框架的时候要注意该扩展点的线程安全性。
  ExtensionFactory为spi接口实现实例在注入属性(injectExtension)时提供注入的属性.

  该工厂有三个实现,分别支持从spring ,spi,Adaptive里面获取对象,注入Extension对象中。

 

   

  • 大小: 36.6 KB
  • 大小: 174.5 KB
分享到:
评论

相关推荐

    dubbo源码分析pdf.zip

    2. **源码解读**:针对Dubbo的关键模块,如Proxy、Filter、Monitor等,进行源码级别的分析,帮助读者深入理解代码实现细节。 3. **性能优化技巧**:分享Dubbo的性能调优策略,包括参数调整、服务治理策略优化等,以...

    dubbo源码分析系列

    《Dubbo源码分析系列》是一份深入探讨Java开源框架Dubbo核心原理和技术细节的资料。Dubbo,作为阿里巴巴的一款高性能、轻量级的服务治理框架,它为分布式系统提供了服务发现、调用、负载均衡、容错等关键功能。这份...

    dubbo源码解析2

    4. **Java RPC机制**:理解RPC(远程过程调用)的概念是学习Dubbo的关键之一。可以先从RMI、Hessian、Thrift等RPC框架入手,了解它们的工作原理及其与Dubbo之间的联系。 5. **Java其他内容**:除了以上提及的知识点...

    dubbo源码解析

    本文对dubbo源码进行了深入的解析,涵盖了dubbo的架构、核心机制分析、扩展点加载流程、代理机制、远程调用流程、集群和容错处理、监控机制等多个方面。通过阅读和理解这些内容,可以更好地掌握dubbo的内部工作机制...

    dubbo源码解析2.0.7z

    源码解析将介绍`META-INF/services`目录下的配置文件以及`com.alibaba.dubbo.common.extension.ExtensionLoader`类的作用。 通过阅读《Dubbo源码解析2.0》文档,开发者不仅可以深入了解Dubbo的设计理念,还能掌握其...

    dubbo源码解析 1 pdf2.0

    在阅读Dubbo源码时,作者建议从简单的例子和模块入手,逐步深入到更复杂的机制和原理中去。在分析过程中,应不断地回顾和联系前面提到的预备知识点,这样才能在理解源码的同时,也能够学习到更广泛的知识和技能。 ...

    Dubbo 源码 阿里巴巴

    Dubbo 源码 阿里巴巴 这是最新的 源码大家学习一下!

    Dubbo源码分析之SPI

    SPI,全称Service Provider Interface,是Java提供的...在深入研究`dubbo-spi`和`java-spi`这两个文件夹中的源码,我们可以更深入地了解这两套SPI机制的实现细节和差异,这对于提升我们的Java和Dubbo开发技能大有裨益。

    dubbo源码解析2.01.pdf

    ### Dubbo源码解析知识点概览 #### 一、Dubbo简介与背景 - **背景**:Apache Dubbo是一款高性能、轻量级的开源服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。Dubbo版本2.01在...

    dubbo源码分享,可打包创建可视页面

    dubbo源码,打成war包后,将此war放入本地tomcat&gt;webapps目录下,启动tomcat(/bin/startup.bat) 为了防止端口占用,可以再/conf/server.xml 修改tomcat端口,我的是8088 tomcat自解压 如图这里写图片描述 打开...

    dubbo入门学习框架源码

    《Dubbo框架源码解析深度探索》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,已经成为Java世界中分布式服务的重要选择。本文将深入探讨Dubbo的核心概念、设计模式以及源码实现,旨在帮助读者理解...

    dubbo2.0源码解读

    了解Dubbo源码通常从其主要模块入手,如服务提供者(Provider)、服务消费者(Consumer)、注册中心(Registry)、协议层(Protocol)等。通过跟踪调用流程,理解服务发布、订阅、调用过程。 2. **Dubbo诞生的背景*...

    dubbo 源码解析

    dubbo源码一览

    apache dubbo 3.0.7源码

    通过对Apache Dubbo 3.0.7源码的阅读和分析,开发者可以学习到如何设计高性能的RPC框架,理解服务治理的核心原理,以及如何通过SPI机制实现系统的高度可扩展性。这对于构建大型分布式系统或微服务架构具有极大的价值...

    dubbo源码包

    《Dubbo源码解析:深度探索高性能服务框架》 Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,其源码的深入理解和分析对于Java开发者来说,具有极高的学习价值。本文将针对提供的dubbo-2.4.3-sources....

    Dubbo源码+jar包

    总之,通过深入学习和研究Dubbo的源码,我们可以提升对分布式服务治理的理解,从而更好地应用和优化微服务架构。这不仅有助于我们在实际开发中遇到问题时能迅速定位和解决,还能提升我们的技术水平和解决问题的能力...

Global site tag (gtag.js) - Google Analytics