dbaplus社群 2024年11月01日
架构设计原则:选择 SPI 还是 API ?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章探讨了SPI和API接口的相关内容,包括其定义、使用场景、优点及如何选择等。从面向接口编程说起,分析了接口在不同位置的情况,还提到了需要注意的事项。

🎈SPI接口:是一种服务提供者接口,允许运行时加载不同服务实现。适用于高度模块化、可插拔架构等场景,具有增加系统灵活性和可扩展性等优点。

📄API接口:是一组预定义的函数、协议和工具,用于构建软件应用。适用于客户端和服务器交互、库和框架等场景,具有提供清晰接口文档等优点。

🤔如何选择:考虑扩展性、交互性、动态性、安全性和稳定性、版本控制和兼容性等因素。SPI在不修改代码扩展功能时更合适,API适合定义稳定交互接口等。

2024-11-01 07:15 广东

架构是“取舍”,而非“银弹”。



分享概要


一、背景


第一次听说 SPI 是阅读《软件框架设计的艺术》,以后陆续在 JDBC 和 SpringBoot 中发现了以这种形式组织代码的方式,本位给出为什么要区分 SPI 和 API 的一个思考过程。


二、从面向接口编程说起



我们在“调用方”和“实现方”之间引入了“接口”,上图没有给出“接口”应该位于哪个“包”中,从纯粹的可能性上考虑,我们有三种选择:



下面让我们依次分析这三种可能性,如果现实中确实有这种可能性,不如我们就为其起个名字以方便交流。


三、“接口”位于“调用方”所在的“包”中


我们先想象一个场景,以仓储的接口为例:



我们将“仓储接口”放置于“领域层”这个“包”中,实现放在一个独立的“包”中,我们看DDD大师的实现都是这样子,现在来思考一下为什么这么做。


“领域层”的“领域服务”会依赖“仓储接口”,“仓储接口”也会依赖“聚合根”,这两者都是除了“实现依赖”之外的依赖关系,如果将“接口”放到“仓储实现”中就丧失了面向接口编程的意义(编译也不会通过),如果放到“独立层”中呢?会编译不通过,出现双向依赖了。


对于类似这种情况下接口,我们将其称为“SPI”,全程为:service provider interface,“SPI”的规则如下:



四、“接口”位于“实现方”所在的“包”中


我们先想象一个场景,以Unity提供的IUnityContainer接口为例,除了维护这个框架的团队之外,我们没有发现谁实现了这个接口,虽然理论上是可以实现这个接口的(如果能实现的话,我们何不自己弄额Ioc容器呢?)。


对于类似这种情况下的接口,我们将其称作为“API”,“API”的规则如下:



五、“接口”位于独立的“包”中


这里就不说场景了,如果一个“接口”在一个上下文是“API”,在另一个上下文是“SPI”,那么你就可以这么组织。

六、需要注意的事项


不管是 SPI 或 API,接口都是可以组织到独立的“包”中,这么做是否有意义,自己来做出决定了。


SPI 和 API 也不一定是接口,我这里都是指狭义的具体的接口。


七、场景图



每一次思考都伴随着收获,也离不开和朋友们的交流,天更蓝了。


1、SPI 接口


1)定义 :SPI 是一种服务提供者接口,它允许在运行时加载不同的服务实现。


2)使用场景 :



3)优点 :



2、API 接口


1)定义 :API 是一组预定义的函数、协议和工具,用于构建软件应用,它定义了软件组件之间交互的契约。


2)使用场景 :



3)优点 :



3、如何选择?


选择使用 SPI 还是 API 的考虑因素:



架构是“取舍”,而非“银弹”。



作者丨幸福框架

来源丨网址:www.cnblogs.com/happyframework/p/3325560.html

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn


跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

SPI接口 API接口 接口选择 架构取舍
相关文章