dubbo采用微内核+插件体系,设计优雅,扩展性很强。微内核+插件体系是如何实现的呢?想必大家都知道SPI(service provider interface)机制。这种机制的原理是假如我们定义了服务接口标准,可以让厂商无实现。在jdk中,使用ServiceLoader类来实现spi机制的服务查找功能。

  接下来我们使用一个简单的例子,通过ServiceLoader来实现spi机制。先定义一个接口:

package com.ysl;public interface Spi {boolean isSupportType(String type);String sayGoodBy();
}

  ServiceLoader会遍历所有的jar去查找META-INF/services/com.ysl.Spi文件

  假设A厂商提供的实现如下:

package com.ysl;public class SpiAImpl implements Spi{@Overridepublic boolean isSupportType(String type) {return "A".equals(type);}@Overridepublic String sayGoodBy() {return "bye bye A";}
}

  在A厂商提供的jar包中的META-INF/services/com.ysl.Spi文件内容为:com.ysl.SpiAImpl(厂商A的spi实现全路径类名)

  假设B厂商提供的实现如下: 

package com.ysl;public class SpiBImpl implements Spi{@Overridepublic boolean isSupportType(String type) {return "B".equals(type);}@Overridepublic String sayGoodBy() {return "bye bye B";}
}

  在B厂商提供的jar包中的META-INF/services/com.ysl.Spi文件内容为:com.ysl.SpiBImpl(厂商B的spi实现全路径类名)

  ServiceLoader.load(Spi.class)读取厂商A、B提供jar包中的文件,ServiceLoader实现了Iterable接口可通过while for循环语句遍历出所有实现。

  一个接口多种实现,就如策略模式一样提供了策略的实现,但是没有提供策略的选择, 使用方可以根据isSupport方法根据业务传入厂商名来选择具体的厂商。

package com.ysl;import java.util.ServiceLoader;public class SpiFactory {private static ServiceLoader spiLoader = ServiceLoader.load(Spi.class);public static Spi getSpi(String name){for(Spi spi : spiLoader){if(spi.isSupportType(name)){return spi;}}return null;}
}

转载于:https://www.cnblogs.com/senlinyang/p/8612458.html

dubbo实现原理之SPI简介相关推荐

  1. Dubbo 源码分析 - SPI 机制

    1.简介 SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以 ...

  2. dubbo源码解析-spi(二)

    前言 上一篇简单的介绍了spi的基本一些概念,在末尾也提到了,dubbo对jdk的spi进行了一些改进,具体改进了什么,来看看文档的描述 JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩 ...

  3. dubbo 自定义路由_高性能可扩展分布式RPC框架Dubbo内核原理揭秘

    一.前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多体应用.在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成;而变为多个应用时,相互之间进行通信的方式就不能简单的 ...

  4. Dubbo过滤器原理解析

    一. 自定义过滤器配置: dubbo filter可能是我们使用dubbo时最经常自定义的.通常用作一些公共处理,比如公共的日志打印让代码更简洁,和如上示例的通用异常结果处理等,配置过程如下: 1. ...

  5. dubbo底层原理解析及安装应用

    0.dubbo安装 1.dubbo简介 2-0.Dubbo标签 2-1.xml方式配置dubbo 2-2.注解方式配置dubbo 2-3.Api方式配置Dubbo 2-4.springboot方式配置 ...

  6. JDK/Dubbo/Spring 三种 SPI 机制,谁更好?

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6950266942875779108 SPI 全称为 Service Provider Interface,是一种服务发现机 ...

  7. RTOS原理及功能简介

    文章目录 1 RTOS原理及功能简介 1.1 RTOS概述 1.2 RTOS工作原理简介 1.3 RTOS如何解决前后台代码结构存在的问题 1 RTOS原理及功能简介 1.1 RTOS概述 百度百科的 ...

  8. DCT算法的原理及实现简介

    DCT算法的原理及实现简介 DCT算法: DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变 ...

  9. JDK/Dubbo/Spring 三种 SPI 机制,谁更好呢?

    JDK/Dubbo/Spring 三种 SPI 机制,谁更好? SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文 ...

最新文章

  1. HarmonyOS Text超出部分末尾显示...
  2. [LeetCode]--160. Intersection of Two Linked Lists
  3. 【LiveVideoStack采访】李备:音视频技术的难点与未来
  4. spring boot 整合web开发之文件上传、静态资源访问、异常处理、返回JSON数据
  5. linux unix域socket_Socket通信原理
  6. 如何将sql server数据库转化成sqlite数据库
  7. JS组件系列——封装自己的JS组件
  8. 排序算法----桶排序(数组)
  9. 算法学习一:排序算法实现与算法性能分析
  10. Julia: 自制的Julia代码排版工具CodeBeautify
  11. 380v pcb 接线端子_220V线圈的接触器改成380V线圈方法
  12. 聊天软件开发_0_开篇
  13. 怎样将tiff格式转成jpg或png?
  14. 留美学子安全手册,这个可以有
  15. 会说话的汤姆猫2 Talking Tom 2(含数据包) v2.0.3
  16. html中div的定位,html中div定位练习
  17. java泛型常用特点_?你必须知道的Java泛型
  18. draco安装与测试
  19. php 炒粉,一碗粉定终身?黄屋屯炒粉还有着这样的浪漫故事,钦州人口口相传...
  20. 一个老外眼中的创新和“微创新”

热门文章

  1. JDBC——实现通用的查询
  2. 解决eclipse刚启动卡死的问题~~~亲测有效~~
  3. 分级调节是调节机制吗_机制砂大热,5种制砂工艺及特点介绍,选对生产工艺,保证高效生产...
  4. ROS配置分布式通信
  5. 微变等效电路法分析放大电路
  6. c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...
  7. ajax success返回 .net,asp.net-mvc-返回JsonResult的ASP.Net MVC Ajax调用
  8. 没有icon_ICON设计干货来啦~
  9. sap 一代增强_在SAP故乡,感受“边缘智能”之变
  10. linux dhcp服务软包,dpkg包管理器详解