10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论

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

堡垒机高可用主备模式部署定义以及优势讲解!

行云管家

等保 堡垒机 堡垒机品牌

一年同行:我的TiDB社区之旅 

TiDB 社区干货传送门

人物访谈

亚信安慧AntDB数据库入选《2024年中国信创产业发展白皮书》,并获“中国信创数据库卓越品牌”奖

亚信AntDB数据库

AntDB 企业号 8 月 PK 榜

45 天备考!一次通过软考高级架构师考试的秘诀!

可信AI进展

人工智能

操作ArkTS页面跳转及路由相关心得

OpenTiny社区

开源 前端 OpenTiny ArkTS

从原理到实践,GraphRAG 如何提升 LLM 的摘要总结能力?

可信AI进展

记录一起非数据热点引起的TiKV负载不均衡

TiDB 社区干货传送门

故障排查/诊断

GC异常导致空间不释放,如何通过 tikv-ctl recover-mvcc 修复

TiDB 社区干货传送门

故障排查/诊断

ERP需要MES的五个理由

万界星空科技

系统集成 ERP 生产管理系统 mes 万界星空科技

解锁未来财富密码:AI自动化副业创收班——终身财富加速器

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

测试

解锁未来财富密码:AI自动化副业创收班-终身财富加速器

测试人

人工智能 软件测试

AI2021矢量图形软件:Illustrator 2021 Win/Mac 直装版

你的猪会飞吗

mac软件下载 AI2021软件下载

TiKV 事务介绍

TiDB 社区干货传送门

TiKV 源码解读

思迈特发布全新AI应用,Smartbi AIChat白泽来了!

ToB行业头条

GPT-4o新版本突然上线!更强更便宜!阿里云推出首个域名AI应用!|AI日报

可信AI进展

人工智能

2024快应用开发者大会举行,OPPO携手行业共探AI时代智慧服务新生态

科技热闻

花2小时成tidb专家--云上资源特别贵kv业务的节省

TiDB 社区干货传送门

8.x 实践

与高质量发展同行,华大北斗获评“广东知名品牌”

江湖老铁

万界星空科技低代码云MES系统

万界星空科技

低代码平台 mes 云mes 万界星空科技 低代码云MES

解锁未来财富密码:AI自动化副业创收班——终身财富加速器

霍格沃兹测试开发学社

INAIR 发布新款 AR 空间计算机 INAIR 2 ,定位移动大屏生产力工具

新消费日报

花第1小时成tidb专家--云上资源特别,贵公司让我省钱ap篇

TiDB 社区干货传送门

8.x 实践

为什么前端越来越难学?聊聊 JavaScript 框架

秃头小帅oi

OpenTiny HUICharts开源发布,带你了解一个简单、易上手的图表组件库

华为云开发者联盟

前端 组件库 OpenTiny 企业号 8 月 PK 榜 2024企业号8月pk

包头等保测评中心电话是多少?在哪里?

行云管家

等保测评 包头 等保测评机构

巴黎同款,六自由度技术还原赛场决定性瞬间!

快手技术

视频 渲染

解决tiup‘ssh: unable to authenticate’报错

TiDB 社区干货传送门

集群管理 管理与运维 故障排查/诊断 扩/缩容

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