Web项目为什么要动态部署
因为我们测试环境与生产环境的很多配置不尽相同,比如FTP上传或下载路径等。我们通过动态部署就可以根据不同环境发布不同的配置。
动态部署如何实现
步骤一:如下图所示,spring启动时,applicationContext.xml里面的propertyConfigurer复制加载文件配置,比如这里先到/WEB-INF目录下以键值对的形式加载application.properties的内容到内存,比如此处ip.ftp.proxyFtpConfig是key,/proxy/是value。然后以同样的方式加载/WEB-INF目录下的application-env.properties,后者覆盖前者。
步骤二:配置好不同环境的元配置文件的目录,以及目标路径。这样deploy里面的application-env.properties就会覆盖到目标路径。实际运用经常是覆盖步骤一的application-env.properties文件。
步骤三:如下图所示,这是一个FTP的配置文件,这里的value没有写死,而是根据key(如框中的ip.ftp.proxyFtpConfig)采用占位符的方式动态获取内存中的值。
案例分析
最近系统上线出现一个问题:日志显示此时生产环境使用的是测试环境的配置,导致部分功能不可用。初步分析是动态部署,首先定位到application-env.properties文件,配置内容如下:
按照配置先找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下面。
思考了下解决方案:1、修改扫描路径; 2、修改deploy目标路径。
这里采取第一种方案,将扫描路径改为WEB-INF,最终加载到了生产环境参数。