写点什么

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:311497

评论

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

C#使用Socket实现分布式事件总线,不依赖第三方MQ

沙漠尽头的狼

智慧环保系统(源码+文档+部署+讲解)

深圳亥时科技

《智能文档处理“百宝箱”:数字化时代文档处理的必备利器》

袁袁袁袁满

人工智能 AI 图像识别 大模型

携手火山引擎,易点天下AI布局加速拓展

新消费日报

CST软件发展历程—完备的技术

思茂信息

求解器 cst cst仿真软件

又是一年双11,火山引擎数据飞轮助力品牌激活“老客”、拉来“新客”

字节跳动数据平台

HyperWorks的RT功能及使用技巧

智造软件

模型 教程 hyperworks

商场LED透明屏选择参考分析

Dylan

商业 品牌 LED显示屏 全彩LED显示屏 led显示屏厂家

实时监控商品信息api接口,加速迭代优化:助力商家产品持续精进之路

代码忍者

API 接口 pinduoduo API

BY林子的“软件质量与测试”赋能体系

BY林子

质量管理 软件测试 软件质量 质量赋能

试验协同管理平台(源码+文档+部署+讲解)

深圳亥时科技

结合AI的低代码平台:提升生产力与创新力的双重利器

天津汇柏科技有限公司

低代码 AI 人工智能

VictoriaMetrics 中文教程(10)集群版介绍

巴辉特

Victoriametrics VictoriaMetrics教程

深度解读RDS for MySQL 审计日志功能和原理

华为云开发者联盟

MySQL 数据库 华为云RDS for MySQL 审计日志

百度智能云千帆 AppBuilder 大模型应用开发解读

百度Geek说

保障IT资产安全的四个小妙招!

行云管家

IT资产 IT 运维

人工智能 | 语音识别模型

测试人

人工智能 软件测试

手把手系列丨在Kubernetes部署Milvus开源向量数据库

Zilliz

Kubernetes Embedding Milvus 向量数据库 rag

CNCC2024:网易伏羲主题分论坛圆满落幕,专家共论推动产学研深度融合

网易伏羲

人工智能 网易伏羲 cncc

《使用Gin框架构建分布式应用》阅读笔记:p234-p250

codists

golang gin 编程人 codists

F5搭载NVIDIA BlueField-3 DPU赋能加速 AI 应用交付

科技热闻

AI赋能,中国企业管理软件崛起正当时

人称T客

时尚零售企业商品计划管理的数字化之旅

第七在线

面向 Data+AI 的统一数据目录探索 | Data Infra NO.22 回顾(含资料发布)

Databend

人工智能 | 语音识别模型

测吧(北京)科技有限公司

测试

审计考核系统(源码+文档+部署+讲解)

深圳亥时科技

日喀则等保测评机构有哪些?电话多少?

行云管家

网络安全 等保 日喀则

如何使用OPA(开放策略代理)管理您的API策略

Gingxing

kong API网关 Kong 网关 消息网关 Kong Gateway

数字身份发展趋势前瞻:无密码认证

芯盾时代

数字身份 身份安全 iam 统一身份认证

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