说说 Spring Boot 插件化开发?

本文介绍了Spring Boot插件化开发的好处,如模块解耦、提升扩展性和开放性,以及方便第三方接入。文章详细讲解了Java中常用的插件实现方案,包括Serviceloader方式、自定义配置约定和Spring Boot的Spring Factories机制,并通过案例实战展示了如何在Spring Boot中实现插件化。最后,作者强调插件化机制在现代软件开发中的重要性。
摘要由CSDN通过智能技术生成

一、前言

插件化开发模式正在很多编程语言或技术框架中得以广泛的应用实践,比如大家熟悉的jenkins,docker可视化管理平台rancher,以及日常编码使用的编辑器idea,vscode等,随处可见的带有热插拔功能的插件,让系统像插了翅膀一样,大大提升了系统的扩展性和伸缩性,也拓展了系统整体的使用价值,那么为什么要使用插件呢?

1.1 使用插件的好处

1.1.1 模块解耦

实现服务模块之间解耦的方式有很多,但是插件来说,其解耦的程度似乎更高,而且更灵活,可定制化、个性化更好。

举例来说,代码中可以使用设计模式来选择使用哪种方式发送短信给下单完成的客户,问题是各个短信服务商并不一定能保证在任何情况下都能发送成功,怎么办呢?这时候设计模式也没法帮你解决这个问题,如果使用定制化插件的方式,结合外部配置参数,假设系统中某种短信发送不出去了,这时候就可以利用插件动态植入,切换为不同的厂商发短信了。

1.1.2 提升扩展性和开放性

以spring来说,之所以具备如此广泛的生态,与其自身内置的各种可扩展的插件机制是分不开的,试想为什么使用了spring框架之后可以很方便的对接其他中间件,那就是spring框架提供了很多基于插件化的扩展点。

插件化机制让系统的扩展性得以提升,从而可以丰富系统的周边应用生态。

1.1.3 方便第三方接入

有了插件之后,第三方应用或系统如果要对接自身的系统,直接基于系统预留的插件接口完成一套适合自己业务的实现即可,而且对自身系统的侵入性很小,甚至可以实现基于配置参数的热加载,方便灵活,开箱即用。

微信搜索公众号:架构师指南,回复:架构师 领取资料 。

1.2 插件化常用实现思路

以java为例,这里结合实际经验,整理一些常用的插件化实现思路:

  • spi机制;

  • 约定配置和目录,利用反射配合实现;

  • springboot中的Factories机制;

  • java agent(探针)技术;

  • spring内置扩展点;

  • 第三方插件包,例如:spring-plugin-core;

  • spring aop技术;

二、Java常用插件实现方案

2.1 serviceloader方式

serviceloader是java提供的spi模式的实现。按照接口开发实现类,而后配置,java通过ServiceLoader来实现统一接口不同实现的依次调用。而java中最经典的serviceloader的使用就是Java的spi机制。

2.1.1 java spi

SPI全称 Service Provider Interface ,是JDK内置的一种服务发现机制,SPI是一种动态替换扩展机制,比如有个接口,你想在运行时动态给他添加实现,你只需按照规范给他添加一个实现类即可。比如大家熟悉的jdbc中的Driver接口,不同的厂商可以提供不同的实现,有mysql的,也有oracle的,而Java的SPI机制就可以为某个接口寻找服务的实现。

下面用一张简图说明下SPI机制的原理

图片

2.1.2 java spi 简单案例

如下工程目录,在某个应用工程中定义一个插件接口,而其他应用工程为了实现这个接口,只需要引入当前工程的jar包依赖进行实现即可,这里为了演示我就将不同的实现直接放在同一个工程下;

图片

定义接口

public interface MessagePlugin {
 
    public String sendMsg(Map msgMap);
 
}

定义两个不同的实现

public class AliyunMsg implements MessagePlugin {
 
    @Override
    public String sendMsg(Map msgMap) {
        System.out.println("aliyun sendMsg");
        return "aliyun sendMsg";
    }
}
public class TencentMsg implements MessagePlugin {
 
    @Override
    public String sendMsg(Map msgMap) {
        System.out.println("tencent sendMsg");
        return "tencent sendMsg";
    }
}

在resources目录按照规范要求创建文件目录,并填写实现类的全类名

图片

自定义服务加载类

 public static void main(String[] args) {
        ServiceLoader<MessagePlugin> serviceLoader = ServiceLoader.load(MessagePlugin.class);
        Iterator<MessagePlugin> iterator = serviceLoader.iterator();
        Map map = new HashMap();
        while (iterator.hasNext()){
            MessagePlugin messagePlugin = iterator.next();
            messagePlugin.sendMsg(map);
        }
    }

运行上面的程序后,可以看到下面的效果,这就是说,使用ServiceLoader的方式可以加载到不同接口的实现,业务中只需要根据自身的需求,结合配置参数的方式就可以灵活的控制具体使用哪一个实现。

图片

2.2 自定义配置约定方式

serviceloader其实是有缺陷的,在使用中必须在META-INF里定义接口名称的文件,在文件中才能写上实现类的类名,如果一个项目里插件化的东西比较多,那很可能会出现越来越多配置文件的情况。所以在结合实际项目使用时,可以考虑下面这种实现思路:

  • A应用定义接口;

  • B,C,D等其他应用定义服务实现;

  • B,C,D应用实现后达成SDK的jar;

  • A应用引用SDK或者将SDK放到某个可以读取到的目录下;

  • A应用读取并解析SDK中的实现类;

在上文中案例基础上,我们做如下调整;

2.2.1 添加配置文件

在配置文件中,将具体的实现类配置进去

server :
  port : 8081
impl:
  name : com.congge.plugins.spi.MessagePlugin
  clazz :
    - com.congge.plugins.impl.TencentMsg
    - com.congge.plugins.impl.AliyunMsg
2.2.2 自定义配置文件加载类

通过这个类,将上述配置文件中的实现类封装到类对象中,方便后续使用;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("impl")
@ToString
public class ClassImpl {
    @Getter
    @Setter
    String name;
 
    @Getter
    @Setter
    String[] clazz;
}
2.2.3 自定义测试接口

使

Spring Boot插件是指在Spring Boot项目中使用插件机制来实现功能的扩展和灵活性的增强。 首先,Spring Boot提供了许多可扩展的接口和抽象类,如Starter、AutoConfiguration、CommandLineRunner等,通过这些接口和抽象类,我们可以定义自己的插件,并将其集成到Spring Boot应用中。 其次,Spring Boot插件机制可以通过依赖注入和自动配置实现。插件的依赖可以通过在pom.xml文件中添加特定的依赖来实现。而自动配置则是通过在META-INF/spring.factories文件中注册相应的自动配置类来实现。当Spring Boot启动时,会根据这些自动配置类来进行相应的自动配置。 此外,Spring Boot还支持外部配置,也就是可以将插件的配置信息以外部的方式进行配置,如application.properties或application.yml文件。这样使得插件的配置更加灵活和可扩展。 最后,Spring Boot插件还可以通过注解、AOP等方式来实现。通过在插件中使用注解或AOP,可以将插件的功能与Spring Boot应用的功能进行解耦,提高代码的可维护性和可测试性。 总之,Spring Boot插件通过提供可扩展的接口和抽象类、依赖注入和自动配置、外部配置以及注解、AOP等方式,使得插件可以轻松地集成到Spring Boot应用中,实现对功能的扩展和灵活的增强。这种插件的机制提高了Spring Boot应用的可扩展性和可维护性,使得开发人员可以更加方便地开发和管理插件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值