`
ncs123
  • 浏览: 101891 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Dubbo之扩展点ExtensionLoader

阅读更多
一、扩展点简介
    Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。   
    Dubbo 改进了 JDK 标准的 SPI 的以下问题:
  • JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。
  • 如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过 getName() 获取脚本类型的名称,但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败原因被吃掉了,和 ruby 对应不起来,当用户执行 ruby 脚本时,会报不支持 ruby,而不是真正失败的原因。
  • 增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。

    约定:
        在扩展类的 jar 包内 1,放置扩展点配置文件 META-INF/dubbo/接口全限定名或者META-INF/dubbo/internal/接口全限定名或者META-INF/services/接口全限定名,内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔。



二、扩展点源码解析


  • SPI :Annotation,扩展点接口的标识,value指定缺省扩展点名。
  • Adaptive:Annotation,在ExtensionLoader生成Extension的Adaptive Instance时,为ExtensionLoader提供信息。value:在URL上找key的Value作为要Adapt成的Extension名。
  • Activate:Annotation,对于可以被框架中自动激活加载扩展,此Annotation用于配置扩展被自动激活加载条件。比如,过滤扩展,有多个实现,使用Activate Annotation的扩展可以根据条件被自动加载。
  • ExtensionFactory:interface,是一个扩展点,有@SPI注解,有三个实现:SpringExtensionFactory,AdaptiveExtensionFactory,SpiExtensionFactory
  • AdaptiveExtensionFactory:是ExtensionFactory的扩展点Adaptive Instance。有@Adaptive注解。
  • SpiExtensionFactory:会从ExtensionLoader中获取扩展点。
  • SpringExtensionFactory:会从spring的ApplicationContext中获取扩展点。
  • ExtensionLoader:扩展点加载器,Dubbo使用它获取扩展点。


跟代码

private static final Protocol refprotocol = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("registry");
private static final Protocol refprotocol2 = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

    代码1 getExtension:
    1. getExtensionLoader()会new 一个ExtensionLoader,存入本地缓存。


    2. getExtension()会调用createExtension(),getExtensionClasses()会加载META-INF/dubbo/接口全限定名,META-INF/dubbo/internal/接口全限定名,META-INF/services/接口全限定名的扩展点配置,如果有wrapperClasses,wrapperClasses包装原instance,生成一个新的instance。


    3. cachedWrapperClasses是在loadFile()加载扩展点配置时,如果扩展点实现类有clazz.getConstructor(type)带类型的构造方法。以com.alibaba.dubbo.rpc.Protocol为例,ProtocolFilterWrapper,ProtocolListenerWrapper,QosProtocolWrapper就会包装原Protocol实例。




    代码2 getAdaptiveExtension():

    1. getAdaptiveExtension()就是返回有@Adaptive注解的实现类,在loadFile()加载扩展点配置时,会扫描@Adaptive注解。


    2. 如果所有实现类都没有@Adaptive注解,就会调用createAdaptiveExtensionClass()动态生成一个扩展点的实现类。以com.alibaba.dubbo.rpc.Protocol为例,会生成一个名为“Protocol$Adaptive”的动态类。@SPI的value指定了默认扩展点名,@Adaptive的value指定了扩展点名从URL中的哪个属性的值,如果@Adaptive的value未指定则默认取接口名protocol。最终调用指定的扩展点名的扩展点实现类。



  • 大小: 42.6 KB
  • 大小: 175.5 KB
  • 大小: 112.1 KB
  • 大小: 100.1 KB
  • 大小: 93.4 KB
  • 大小: 95.6 KB
  • 大小: 93.3 KB
  • 大小: 136.8 KB
  • 大小: 154.6 KB
分享到:
评论

相关推荐

    仿Dubbo的ExtensionLoader

    在这样的工程中,开发者通常会复用和理解Dubbo源码中的ExtensionLoader工作原理,通过编写自己的代码来实现类似的功能,以支持自定义的扩展点和插件。 ExtensionLoader在Dubbo中的主要功能包括: 1. **加载器机制*...

    深度解析Dubbo的可扩展机制SPI源码:从理论到实践,打造高效、稳定的分布式服务框架.rar

    2. **ExtensionLoader**:Dubbo的核心SPI类,负责加载、缓存和管理扩展点。它提供了动态获取扩展点实例的方法,支持懒加载和线程安全。 3. **Adaptive Extension**:适应性扩展是Dubbo SPI的一个特色,它允许在运行...

    深度解析Dubbo的可扩展机制SPI源码:从理论到实践,打造高效、稳定的分布式服务框架

    ExtensionLoader是接口的扩展点加载器,负责加载和管理特定接口的实现。ExtensionFactory则用于创建和获取扩展点实例,它可以是Dubbo内置的,也可以是从Spring容器中获取的。 在Dubbo SPI的实现中,`...

    dubbo-spi_mouse1oc_dubbospi_

    3. **初始化与加载**:Dubbo SPI使用`ExtensionLoader`类来加载和管理扩展点。它会根据配置文件查找、加载、实例化和管理服务实现。当需要使用某个服务时,`ExtensionLoader`会根据接口名找到相应的实现,并返回一个...

    服务治理中间件dubbo原理解析

    这种方式不仅使得Dubbo能够轻松地添加新的扩展点,也确保了核心代码的简洁性。 ##### 三:动态编译 除了SPI之外,Dubbo还利用动态编译技术来提高性能和灵活性。在某些情况下,Dubbo会在运行时动态生成一些类,比如...

    Dubbo源码分析之SPI

    6. **@Activate注解**:用于标记一个类作为激活的扩展点,可以根据条件(如group、value等)自动激活或选择合适的实现。 通过以上机制,Dubbo能够实现对服务提供者、消费者、协议、注册中心等组件的动态扩展。这种...

    dubbo源码解析

    这意味着,如果用户不显式指定扩展点的名字,那么系统将会使用名为`dubbo`的扩展点。 **Dubbo**会在以下位置查找扩展点的实现: 1. `META-INF/dubbo/internal/` —— dubbo内部实现的各种扩展都放在这里。 2. `...

    Dubbo源码解析

    这里的`refprotocol`是一个`Protocol`扩展点,具体来说是`Protocol$Adaptive`类的实例,它是Dubbo SPI机制动态创建的自适应扩展点。我们进一步关注`refer`方法的实现: ```java public Invoker refer(Class arg0, ...

    dubbo-2.6.0

    Dubbo的SPI机制是其强大之处,允许用户自定义扩展点。`com.alibaba.dubbo.common.extension.ExtensionLoader`类是SPI的核心实现,通过它可以加载和管理所有的扩展类。 9. **配置管理** 配置管理是Dubbo的重要组成...

    dubbo源码解析2.0.7z

    7. **SPI扩展机制**:Dubbo采用Java的SPI(Service Provider Interface)来实现插件化,允许用户自定义实现各种扩展点。源码解析将介绍`META-INF/services`目录下的配置文件以及`...

    dubbo 源码

    Dubbo采用了SPI(Service Provider Interface)设计模式,允许用户自定义实现并动态加载扩展点。`ExtensionLoader`是Dubbo实现SPI的关键组件,它使得Dubbo具有良好的可扩展性和灵活性。 总结,Dubbo的源码学习不仅...

    Dubbo源码(注释版)

    Dubbo采用SPI(Service Provider Interface)机制,允许用户自定义实现各种扩展点。`ExtensionLoader`类是SPI的核心,负责加载和管理扩展。开发者可以根据需要扩展`Protocol`、`Registry`、`Filter`等接口。 总结,...

    dubbo 配置 loadbalance 不生效?撸一把源码(csdn)————程序.pdf

    总结来说,当遇到Dubbo的`loadbalance`配置不生效时,应检查以下几点: 1. 避免XML配置和Spring Boot的`application.properties`配置冲突,确保只有一个地方定义`consumer`配置。 2. 确认配置的`loadbalance`名称与...

    【课后笔记】Apache Dubbo服务注册及服务消费源码分析

    ProxyFactory是一个自适应扩展点,它可以根据配置或环境自动选择合适的代理实现,如JavassistProxyFactory。自适应机制是Dubbo的一大特色,它允许在运行时动态选择合适的扩展实现,以提高系统的灵活性和可扩展性。 ...

    学习dubbo config

    3. ExtensionLoader类:这是Dubbo中用于加载和管理各种扩展点(Extension)实例的工具类。它根据扩展点的名称获取相应的扩展实现,它是Dubbo灵活性和可扩展性的基础。 4. @SPI("dubbo"):这是Dubbo中用于标记扩展点...

    dubbo第四节1

    总之,Dubbo 的这些特性使得它成为一个强大且灵活的分布式服务框架,能够有效地支持高并发、高可用的服务调用和扩展。通过深入理解这些核心机制,我们可以更好地利用 Dubbo 构建和维护大规模分布式系统。

    Apache Dubbo:Dubbo服务注册与发现机制详解

    服务提供者启动后,通过 **Protocol** 扩展点的 `export` 方法导出服务。此时,服务信息会被封装成 **Invoker** 对象,并通过 **Exporter** 接口导出至网络。同时,Protocol 会调用 **Directory** 的 `register` ...

    基于dubbo中Listener的实现方法

    在dubbo中,ExtensionLoader是一个重要的组件,负责加载和管理扩展点。ExtensionLoader使用了工厂模式,提供了一个统一的接口来管理扩展点。在ProtocolListenerWrapper的实现中,我们可以看到ExtensionLoader被用于...

    36_SPI是啥思想?dubbo的SPI机制是怎么玩儿的?.zip

    1. 扩展点自动发现:Dubbo会扫描指定包路径下的所有类,找到符合注解`@SPI`的接口,这些接口即为扩展点。 2. 基于注解的元数据:Dubbo允许在实现类上添加`@Adaptive`注解来声明适应性扩展,这意味着可以根据特定条件...

    dubbo-spiDemo:精神病

    Dubbo的SPI允许开发者自定义服务消费者、服务提供者、协议、序列化方式等组件,只需在相应的扩展点定义自己的实现,然后在`META-INF/dubbo`目录下创建对应的配置文件。这样,Dubbo在运行时会自动加载这些扩展,使得...

Global site tag (gtag.js) - Google Analytics