AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

Dubbo 源码解析之 SPI(一):扩展类的加载过程(上)

  • 2020-02-06
  • 本文字数:1354 字

    阅读完需:约 4 分钟

Dubbo源码解析之SPI(一):扩展类的加载过程(上)

Dubbo 是一款开源的、高性能且轻量级的 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。


Dubbo 最早是阿里公司内部的 RPC 框架,于 2011 年开源,之后迅速成为国内该类开源项目的佼佼者,2018 年 2 月,通过投票正式成为 Apache 基金会孵化项目。目前宜信公司内部也有不少项目在使用 Dubbo。


本系列文章通过拆解 Dubbo 源码,帮助大家了解 Dubbo,做到知其然,并且知其所以然。

一、JDK SPI

1.1 什么是 SPI?

SPI(Service Provider Interface),即服务提供方接口,是 JDK 内置的一种服务提供机制。在写程序的时候,一般都推荐面向接口编程,这样做的好处是:降低了程序的耦合性,有利于程序的扩展。


SPI 也秉承这种理念,提供了统一的服务接口,服务提供商可以各自提供自己的具体实现。大家都熟知的 JDBC 中用的就是基于这种机制来发现驱动提供商,不管是 Oracle 也好,MySQL 也罢,在编写代码时都一样,只不过引用的 jar 包不同而已。后来这种理念也被运用于各种架构之中,比如 Dubbo、Eleasticsearch。

1.2 JDK SPI 的小栗子

SPI 的实现方式是将接口实现类的全限定名配置在文件中,由服务加载器读取配置文件,加载实现类。


了解了概念后,来看一个具体的例子。


1)定义一个接口


public interface Operation {        int operate(int num1, int num2);}
复制代码


2)写两个简单的实现


public class DivisionOperation implements Operation {        public int operate(int num1, int num2) {            System.out.println("run division operation");            return num1/num2;        }}
复制代码


3)添加一个配置文件


在 ClassPath 路径下添加一个配置文件,文件名字是接口的全限定类名,内容是实现类的全限定类名,多个实现类用换行符分隔。


目录结构


1578290509268050916.png


文件内容


com.api.impl.DivisionOperationcom.api.impl.PlusOperation
复制代码


4)测试程序


public class JavaSpiTest {    @Test    public void testOperation() throws Exception {        ServiceLoader operations = ServiceLoader.load(Operation.class);        operations.forEach(item->System.out.println("result: " + item.operate(2, 2)));    } }
复制代码


5)测试结果


run division operationresult:1run plus operationresult:4
复制代码

1.3 JDK SPI 的源码分析

例子很简单,实现的话,可以大胆猜测一下,看名字“ServiceLoader”应该就是用类加载器根据接口的类型加上配置文件里的具体实现名字将实现加载了进来。


接下来通过分析源码进一步了解其实现原理。

1.3.1 ServiceLoader 类

PREFIX 定义了加载路径,reload 方法初始化了 LazyIterator,LazyIterator 是加载的核心,真正实现了加载。加载的模式从名字上就可以看出,是懒加载的模式,只有当真正调用迭代时才会加载。


1578290519778011984.png

1.3.2 hasNextService 方法

LazyIterator 中的 hasNextService 方法负责加载配置文件和解析具体的实现类名。


1578290528891044303.png

1.3.3 nextService 方法

LazyIterator 中的 nextService 方法负责用反射加载实现类。


1578290536263070478.png


看完了源码,感觉这个代码是有优化空间的,实例化所有实现其实没啥必要,一来比较耗时,二来浪费资源。Dubbo 就没有使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好地满足需求。


本文转载自宜信技术学院公众号。


原文链接:http://college.creditease.cn/detail/345


2020-02-06 10:311375

评论

发布
暂无评论
发现更多内容

从芯片到云全链路高效设计 一文了解YoC基础软件平台

Roy夹馍

物联网 risc-v 嵌入式开发

天津赛誉食品有限公司与小王庄黄金梨携手 助推文旅产业化联盟销售

InfoQ 天津

Paxos理论介绍(3): Master选举

OpenIM

一款神器自助帮你换背景,超强实时人像扣图算法开源啦!

百度开发者中心

最佳实践 图像处理 开源技术

有道词典 Flutter 架构与应用

有道技术团队

大前端 客户端 网易有道

springboot elementui vue商城微信小程序源码(毕设)

清风

小程序 Vue 毕业设计 毕设

托管班用什么管理系统?染书CRMA,自带营销工具提升续班率

亿欧之

在线考试系统有哪些?快考题|企考云,高频互动的培训功能免费用

亿欧之

平头哥剑池CDK 更新重磅来袭!三大亮点速看!

Roy夹馍

物联网 risc-v 嵌入式开发 软件模拟

RVB2601开发板用户指南

Roy夹馍

IoT risc-v 嵌入式开发

RVB2601开发板快速上手教程

Roy夹馍

MCU risc-v 嵌入式开发

数字人民币与智能合约

CECBC

Vector向量计算技术与SIMD技术的对比

Roy夹馍

cpu IoT 芯片 risc-v

ipfs最新官网通知?ipfs是一场技术革命?

区块链 分布式存储 IPFS Filecoin ipfs挖矿

1-7中HashMap死循环分析,透彻解析

欢喜学安卓

Java 程序员 后端

2021年1月8号,这些新技术你们都知道吗

欢喜学安卓

Java 程序员 后端

人工智能是下一个“新生代农民工”吗?

澳鹏Appen

人工智能 大数据 AI 数据标注 训练数据

如何创建网上试卷?快考题|企考云,专项练习降低人工阅卷失误率

亿欧之

如何建立微信考试?快考题|企考云,轻松拥有HR在线测评系统

亿欧之

平头哥玄铁CPU调试系统介绍

Roy夹馍

cpu risc-v 嵌入式开发 调试系统

filecoin全网有效算力突破10EiB?Filecoin挖矿现在还有机会入场吗?

区块链 分布式存储 IPFS filecoin挖矿 filecoin矿机

澳鹏Appen收购Quadrant:移动定位数据业务进一步增强

澳鹏Appen

人工智能 大数据 企业 收购

EMQ X VS RabbitMQ:两大消息服务器 MQTT 性能对比全解(上)

EMQ映云科技

RabbitMQ 物联网 IoT mqtt emq

低代码和无代码的区别

低代码小观

低代码 开发工具 无代码 低代码与无代码区别

2020年五面蚂蚁,分布式架构+RPC+kafka+多线程

欢喜学安卓

Java 程序员 后端

2021 Java开发 最全笔记 建议收藏!,搞定kafka看这一篇就够了

欢喜学安卓

Java 程序员 后端

服务网格在百度核心业务大规模落地实践

百度开发者中心

最佳实践 方法论 Service Mesh 服务网格

解析金融服务如何在区块链中建立信任?

CECBC

财经大课:看懂价格信号

石云升

财经思维 9月日更

2020全网最新SQL优化面试专题及答案,一步搞定你疑惑的数据结构与算法系列

欢喜学安卓

Java 程序员 后端

30G上亿数据的超大文件,如何快速导入生产环境,全网疯传

Geek_f90455

Java 程序员 后端

Dubbo源码解析之SPI(一):扩展类的加载过程(上)_区块链_郑祥斌_InfoQ精选文章