借助pf4j实现基于spring-boot的插件化开发
- 背景
- 场景
- 项目地址&结构
- Demo运行
背景
Jenkins
、SonarQube
等Java实现的Web应用都有插件体系,一般来说都是先从插件市场下载一个插件,然后系统要求重启(某些功能可以不用重启),插件功能就能在页面上出现,并且还能实时禁用、启用、删除插件。
在某些工具型Web应用中,也需要类似的插件扩展和管理功能,OSGI定义了一套Java应用模块化的规范,Apache和Eclipse都有相应的实现,但是都太重了,PF4J是一个非常好的工具,不管是集成还是功能都有较好的表现,核心原理是通过自定义ClassLoader动态加载和卸载插件,并且提供了插件管理工具。
场景
有一个spring-boot
实现的web应用,在某一个业务功能上提供扩展点,用户可以基于SDK实现功能扩展,要求可以管理插件,并且能够在业务功能扩展点出动态加载功能。
项目地址&结构
项目地址:clyoudu/pf4j-spring
pf4j-spring
├── demo
│ ├── manager
│ ├── plugins
│ │ ├── greeting-button-plugin
│ │ ├── system-button-plugin
│ │ └── whether-button-plugin
│ └── sdk
├── pf4j-manager-spring-boot-starter
└── pf4j-spring-core
- pf4j-spring-core:PF4J有spring版本pf4j-spring,但是没有和
spring-boot
集成,并且部分实现想要修改,因此新建了pf4j-spring-core模块,和pf4j-spring几乎一致,修改了部分实现; - pf4j-manager-spring-boot-starter:提供了spring-boot配置类和配置项
- demo:一个使用pf4j-manager-spring-boot-starter的完整例子
- manager:主应用,spring boot web
- sdk:插件扩展点定义
- plugins:3个插件4个扩展功能
Demo运行
git clone https://github.com/clyoudu/pf4j-spring.git
编辑pf4j-spring/demo/manager/src/main/resources/application.yml
, 重新指定spring.pf4j.path,该路径为插件保存位置
cd pf4j-spring
mvn clean package
cd demo/manager/target
java -jar manager-1.0.0-SNAPSHOT.jar
浏览器访问http://localhost:8080
Plugin Management:
- 上传插件,插件位置:demo/plugins//target/.jar
- 点击’Reload’按钮, 插件列表会自动刷新
- Load/Unload/Start/Stop/Enable/Disable/Delete等操作会根据不同的插件状态变化
Business Feature:
- 插件状态变化,扩展功能列表也会变化
- 点击插件按钮,弹出的消息和插件实现预期一致