一、前言
笔者在工作中遇到经常更改服务层的代码,就只是更改一小部分,但是就需要重启整个程序才能完成编译,既费时又费力。想寻求一种方法,能够在不重新编译整个应用程序的情况下更新服务层代码。想到的第一个方法是通过动态加载jar文件来更新,但是SpringBoot应用上下文还没搞太清楚,后续可以按照这个思路走下去;第二个方法是把需要更新的服务层以插件的方式运行,就是今天所要介绍的SBP框架,它能够将使得主程序模块加载其它模块的控制器、服务层、数据访问层的代码,完成插件式的编程,实现插件的动态的启动、停止以及删除。
二、背景
项目sbp是基于springboot做的封装框架,已经初步成熟,可以投入到项目中使用。如何快速理解sbp项目,没有比跑通更为直接的了,就像玩游戏先玩后摸索。
由于sbp项目没有清晰地叙述构建插件编程的流程,因此又查询基于sbp的使用仓库,于是查找到sbp-test用来测试sbp的使用。
而sbp-test项目又引入了很多杂项,因此我就精简了该项目,用于新手快速上手跑通sbp项目。代码我也上托管到了Git仓库,传送门在此,可以直接下载享用。
三、项目简介
整个项目的目录结构如下所示。主模块是application,是一个springboot-web应用。
主程序的资源文件内容如下。
server.port: 8071 spring: mvc: static-path-pattern: /** resources: add-mappings: true cache: period: 3600 sbp: runtime-mode: development # runtime-mode: deployment plugins-root: plugins enabled: true lib-directories: - "libs" # auto-start-plugin: false classes-directories: - "target/classes" # - "out/production/classes" # - "out/production/resources" # controller: # base-path: "fr/trouillet"
其中plugins文件夹里包含两个插件a、b。
在这两个插件里分别实现了两个控制器。其中a插件的控制器代码如下。
@RestController @RequestMapping(value = "/aplugin") public class APluginController { @RequestMapping(value = "/name") public String name() { return "aplugin"; } }
b插件的控制器代码如下。
@RestController @RequestMapping(value = "/bplugin") public class BPluginController { @RequestMapping(value = "/name") public String name() { return "bplugin"; } }
四 、看效果
4.1 测试主程序接口
接口地址为:http://127.0.0.1:8071/plugins/id
测试结果:
4.2 测试A插件程序接口
接口地址为:http://127.0.0.1:8071/aplugin/name
测试结果:
4.3 测试B插件程序接口
接口地址为:http://127.0.0.1:8071/bplugin/name
测试结果:
五 、展望
现在依旧不是需要的结果,这是直接运行起来的结果,不是动态的加载。后续再进一步研究。