企业产品化,以半开源的形式部署jar包到客户的服务器上,客户往往会有定制化的需求,为了不暴露所有的代码,或者以极小的代价满足客户的个性需求,如页面上增加一个按钮 在不修改标准产品代码的基础上,我们只要对产品做一次增强即可。也就是将定制化的jar包部署到指定目录上,达到覆盖原有的http接口,或者是改写原有的java service的内部代码。
1,标品库为定型了的产品,定制化库为用户二次开发。 比如标准产品库使用的rabbit-mq,用户需要将rabbit-mq替换为rocket-mq客户端。在不破坏标品库代码的情况下,用户只要根据相关Spring的规范,实现相关代码逻辑即可。
2,比如标品库的某个接口,用户需要二次开发,增强原有的接口功能,不更改标品库的代码,只需要引入wise-devops-spring-boot-starter,做好相关配置即可,在定制化库中 实现原有接口的增强逻辑。
#####整体架构 我们就是基于Classloader定制化,实现了不同硬盘路径同一classpath的jar加载,从而给标准产品增加了二次开发的可能。
在Spring Boot项目中pom.xml引入如下配置
<dependency>
<groupId>io.github.zhukovaskychina</groupId>
<artifactId>wise-devops-spring-boot-starter</artifactId>
<version>0.0.4</version>
</dependency>
在启动类中,将
SpringApplication.run(HrmsApplication.class,args);
替换为:
SpringBootDevOpsApplication.run(HrmsApplication.class,args);
;
在启动类上增加如下配置, basePackage一定要配置正确,必须要和定制化库里的包名前缀要一致。
@SpringBootApplication
@ComponentScan(basePackages ="com.zhukovasky",
excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {CustomerRestControllerFilter.class})
}
)
最终效果如下:
@SpringBootApplication
@ComponentScan(basePackages ="com.zhukovasky",
excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {CustomerRestControllerFilter.class})
}
)
public class HrmsApplication {
public static void main(String[] args) {
SpringBootDevOpsApplication.run(HrmsApplication.class,args);
}
}
application.yaml
# devops相关配置
devops:
# 开启devops模式
enableDevopsMode: true
# 开启bean过滤模式,用于过滤掉标品库不需要的restcontroller
enableBeanFilter: true
# 开启bean交换,用于交换service的实现类,让定制化库的service实例优先加载,相当于@Primary注解修饰
enableBeanSwap: true
# customDir 定制化的
customDir: D:/ideaprojects/hrms/hrms-ext-libs/
# scanPackge 标品化库需要热替换的bean,以“;”为分隔符,写多个
scanPackage: com.zhukovasky.hrms.serviceimpl
#
restFilterScanPackage: com.zhukovasky.hrms.rest.IndexRest;com.zhukovasky.hrms.rest.ChildIndexRest
loginServiceImpl=loginExtServiceImpl
authCheckServiceImpl=authCheckExtServiceImpl
其他部分正常开发。
- 支持不同硬盘路径,同一ClassPath路径
- 支持定制化库定制service接口开发
- 增加对Nacos和Apollo的支持
- 增加对微服务的支持测试
- 热部署