Web项目为什么要动态部署

因为我们测试环境与生产环境的很多配置不尽相同,比如FTP上传或下载路径等。我们通过动态部署就可以根据不同环境发布不同的配置。

动态部署如何实现

步骤一:如下图所示,spring启动时,applicationContext.xml里面的propertyConfigurer复制加载文件配置,比如这里先到/WEB-INF目录下以键值对的形式加载application.properties的内容到内存,比如此处ip.ftp.proxyFtpConfig是key,/proxy/是value。然后以同样的方式加载/WEB-INF目录下的application-env.properties,后者覆盖前者。

java的动态端口就怎么配置 java动态部署_目标路径


java的动态端口就怎么配置 java动态部署_java的动态端口就怎么配置_02


步骤二:配置好不同环境的元配置文件的目录,以及目标路径。这样deploy里面的application-env.properties就会覆盖到目标路径。实际运用经常是覆盖步骤一的application-env.properties文件。

java的动态端口就怎么配置 java动态部署_生产环境_03


步骤三:如下图所示,这是一个FTP的配置文件,这里的value没有写死,而是根据key(如框中的ip.ftp.proxyFtpConfig)采用占位符的方式动态获取内存中的值。

java的动态端口就怎么配置 java动态部署_动态部署_04

案例分析

最近系统上线出现一个问题:日志显示此时生产环境使用的是测试环境的配置,导致部分功能不可用。初步分析是动态部署,首先定位到application-env.properties文件,配置内容如下:

java的动态端口就怎么配置 java动态部署_目标路径_05


按照配置先找WEB-INF里面的application.properties,然后class全局搜application-env.properties,由于我们的生产环境参数是配置在deploy里面,并且其目标路径是WEB-INF,所以生产环境参数也打在WEB-INF下面,但没有放入classes,所以实际获取的还是测试环境的参数。下图是war包架构,maven打包是这样的,web项目里面的WEB-INF下面的文件打包到war包对应的WEB-INF下面,web项目的src和resource下面的文件打包到war包的classes下面。

java的动态端口就怎么配置 java动态部署_spring_06


思考了下解决方案:1、修改扫描路径; 2、修改deploy目标路径。

这里采取第一种方案,将扫描路径改为WEB-INF,最终加载到了生产环境参数。

java的动态端口就怎么配置 java动态部署_生产环境_07