SPI 简介
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,
通过一个简单例子来说明SPI是如何使用的。 首先通过一张图来看看,用SPI需要遵循哪些规范,因为spi毕竟是JDK的一种标准。
而后,把新加的实现,描述给JDK知道就行啦(通过改一个文本文件即可)公司内部,目前Dubbo框架就基于SPI机制提供扩展功能。
我们首先需要一个目录,META-INF\services 如下,最终的目录路径就像这样:
文件名字为 接口/抽象类: 全名 文件内容: 接口/抽象类 实现类
就像这样:com.spi.impl.TextHellocom.chaochao.spi.impl.ImageHello
实现类:
最后,来看看,如果使用SPI机制,客户端代码:
最后的输出:Text Hello.Image Hello。
dubbo的扩展机制和java的SPI机制非常相似,但是又增加了如下功能:
1 可以方便的获取某一个想要的扩展实现,java的SPI机制就没有提供这样的功能
2 对于扩展实现IOC依赖注入功能:
举例来说:接口A,实现者A1、A2。接口B,实现者B1、B2。
现在实现者A1含有setB()方法,会自动注入一个接口B的实现者,此时注入B1还是B2呢?都不是,而是注入一个动态生成的接口B的实现者B$Adpative,该实现者能够根据参数的不同,自动引用B1或者B2来完成相应的功能
3 对扩展采用装饰器模式进行功能增强,类似AOP实现的功能
以下面的例子为例来分析下:
其中Protocol接口定义如下:
对应的实现者如下:
ExtensionLoader中含有一个静态属性:
ConcurrentMap, ExtensionLoader>EXTENSION_LOADERS = new ConcurrentHashMap, ExtensionLoader>();
用于缓存所有的扩展加载实例,这里加载Protocol.class,就以Protocol.class为key,创建的ExtensionLoader为value存储到上述EXTENSION_LOADERS中
这里没有进行任何的加载操作。
我们来看下,ExtensionLoader实例是如何来加载Protocol的实现类的:
1 先解析Protocol上的Extension注解的name,存至String cachedDefaultName属性中,作为默认的实现
2 到类路径下的加载 META-INF/services/com.alibaba.dubbo.rpc.Protocol文件
相关推荐
总的来说,Dubbo的SPI机制是其强大功能背后的关键技术之一,它不仅提供了类似Java SPI的服务发现能力,还通过一系列的增强,使得服务的扩展和管理变得更加高效和便捷。在深入研究`dubbo-spi`和`java-spi`这两个...
Java SPI 机制详解 Java SPI 机制,全称 Service Provider Interface,是 Java 内置的服务发现机制。SPI 机制的主要思想是解耦,通过提供一个标准接口,允许第三方提供实现类,而无需在程序中硬编码。SPI 机制广泛...
Dubbo SPI(Service Provider Interface)是阿里巴巴开源的Dubbo框架中的一个重要特性,它提供了一种动态发现服务提供者和加载实现类的机制,使得服务消费者无需关心服务提供者的具体实现,增强了系统的可扩展性和...
Java类加载机制和SPI(ServiceProviderInterface)机制是Java平台中极其重要的两个概念,它们对于Java程序的灵活性和可扩展性起到关键作用。下面详细解释这两个机制的概念、原理和应用场景。 类加载机制是Java...
Dubbo作为一款高性能的Java RPC框架,也引入了类似的SPI机制,但相对于Java内置的SPI,Dubbo的SPI机制更为强大和灵活。Dubbo的SPI机制主要由`dubbo-common`模块中的`ExtensionLoader`类实现,它支持以下特性: 1. ...
在分布式系统中,Dubbo是一个广泛使用的高性能Java RPC框架,由阿里巴巴开源。它提供了一种服务治理、远程调用、集群容错、监控等全面功能,使得开发者可以方便地构建可扩展的服务架构。本篇文章将深入讲解如何使用...
- SPI(Service Provider Interface)机制:Dubbo如何利用Java的SPI实现插件化设计,允许开发者灵活扩展和替换组件。 - 过滤器链:了解过滤器在Dubbo中的作用,以及如何编写自定义过滤器实现特定功能。 通过对...
通过SPI机制,Dubbo可以灵活地扩展其功能,使得开发者能够按照自己的需求定制服务行为。在本文中,我们将深入探讨Dubbo SPI的工作原理及其相关知识点。 首先,我们需要理解什么是SPI。SPI(Service Provider ...
#### 三、Dubbo SPI改进之处 针对原始JDK SPI的这些不足,Dubbo在其基础上进行了扩展和优化: 1. **增加缓存机制**: - Dubbo设计了一个缓存对象`cachedInstances`,用于存储SPI的key与value。`cachedInstances`...
### Apache Dubbo 进阶之内核剖析:深入SPI机制 #### 一、引言 Apache Dubbo是一款高性能、轻量级的开源微服务框架,它提供了面向接口的远程方法调用设计,使得开发者能够像调用本地方法一样调用远程方法。Dubbo...
Dubbo则在其之上构建了自己的SPI机制,以满足更高级别的服务治理需求。 Dubbo的SPI机制主要由以下几个关键组件构成: 1. **配置文件**:Dubbo的扩展点配置通常保存在`META-INF/dubbo.properties`或`META-INF/...
dubbo的核心思想就是SPI思想,想读懂dubbo源码应该认真的看下,详细的讲解了dubbo的SPI思想,从为什么,是什么,怎么做的来分析了dubbo的spi思想
【JAVA分布式系列】dubbo 在Java开发领域,分布式服务框架是实现大型系统高可用、可扩展的关键技术。阿里巴巴的Dubbo是一个卓越的开源框架,它致力于提供高性能、透明化的RPC(远程过程调用)服务,使开发者能够...
Dubbo的可扩展机制SPI(Service Provider Interface)是其核心特性之一,允许开发者根据需要动态扩展服务。SPI机制使得Dubbo作为一个高度可定制化的RPC框架,可以轻松地添加新的服务协议、序列化方式等组件。下面...
Dubbo SPI是阿里巴巴开源的高性能RPC框架Dubbo中的服务发现机制,它在Java SPI的基础上进行了扩展和优化,以适应微服务架构中的服务治理需求。 在Java SPI中,服务接口定义在`META-INF/services`目录下的一个以接口...
《Java 1.8与Dubbo Admin:深入理解与应用》 在当今的软件开发领域,Java 1.8作为一款强大的编程语言,其稳定性和性能优化能力深受开发者喜爱。而Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,更是...
本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、负载均衡、灰度发布、集群容错、服务降级等核心概念的讲解及...
在IT行业中,分布式服务框架是构建大型复杂系统的关键技术之一,Dubbo作为阿里巴巴开源的一款高性能、轻量级的Java RPC框架,广泛应用于微服务架构之中。Zookeeper,则是Apache的一个分布式服务协调框架,常用于服务...