`
A牛哥哥
  • 浏览: 149491 次
社区版块
存档分类
最新评论

开发环境-测试环境-生产环境-配置自动切换N种办法

 
阅读更多
开发环境-测试环境-生产环境,各种环境的配置都不一样,比如数据库url,第三方支付url,还有一些其他的配置等等,还有代码的逻辑也是和环境有关,比如发短信和校验验证码在线下就没有必要,那么就要判断项目所处的环境,如果放到项目里面,每次发布到不同的环境都要改,改来改去挺麻烦,而且改掉一个项目就有问题,我总结了几种办法供大家参考,个个好使.

一, 如果只有数据库的配置需要改,那么可以使用JNDI,即在tomcat中配置DataSource, spring可以从JNDI中获取DataSource, 具体怎么配置就不说了,网上有很多.


二, 如果不只有数据库的配置,那就要用到下面说的办法了.
2.1, 使用环境变量
比如上面说的数据的配置, 我们一般是定义一个properties文件,内容基本都是这样:
jdbc.driverClass = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://xxx/xxx?useUnicode=true&characterEncoding=utf8
jdbc.user = xxx
jdbc.password = xxx
jdbc.maxPoolSize=50
jdbc.minPoolSize=10
jdbc.maxStatements=100
jdbc.testConnection=true


然后在spring的配置文件中指定这个文件,方式如下:
<context:property-placeholder location="classpath:config*.properties"/>


解决这种配置, 用环境变量比较好,改动很小.
只需要定义一个环境变量,比如变量名叫MY_CNF, 值为 D:/myconf, windows需要重启电脑才能获取到这个新增的环境变量,linux 执行一下source 命令就行了,能不能获取到可以用main方法打印一下System.getEnv("MY_CNF");试试看.
Eclipse中可以直接针对tomcat设置环境变量,不必重启电脑,设置方式:
services窗口中双击服务器-->open launch configuration -->Environment-->New 即可新增环境变量.

然后把properties文件复制到D:/myconf下,
spring中指定方式就不是classpath了,改成这样指定:
<context:property-placeholder location="file:${MY_CNF}/config.properties"/>


多个配置文件用逗号隔开,不支持*这种通配符
<context:property-placeholder location="file:${MY_CNF}/config.properties,file:${MY_CNF}/config-redis.properties"/>

项目中的配置文件就可以独立出去了


2.2 更暴力的办法
把配置文件放到某个目录下,比如D:/abc, 项目启动的时候,用脚本直接将D:/abc目录下的配置复制到tomcat/webapps/你的项目/WEB-INF/classes/对应配置文件目录 中, 替换项目中原有的配置文件.
怎么在启动前复制?直接改一下tomcat的startup.bat 或者startup.sh 即可, 在开头增加
cp -f D:/abc/xxx.propertiets /opt/tomcat/webapps/.....

项目中的配置文件就留本机开发的配置就行,这样本机开发不受影响.




上面几种办法已经可以解决问题了, 下面是些比较折腾的办法, 没搞过的可能看起来比较费劲.
2.3 使用maven中profile 标签和-P
如果项目是maven的,可以用这种方式.
在pom.xml中可以配置<profile>, 这个标签可以自己定义一些key 和value的属性,比如:
<profiles>
		<profile>
			<id>linux</id>
			<properties>
				<jrepath>${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/jre/lib/jce.jar</jrepath>
			</properties>
		</profile>
		
		
		<profile>
			<id>win</id>
			<properties>
				<jrepath>${JAVA_HOME}/jre/lib/rt.jar;${JAVA_HOME}/jre/lib/jce.jar</jrepath>
			</properties>
		</profile>
		
	</profiles>


其中<profiles> ,<profile>, <id>, <properties> 这几个标签的标签名是不能改的,
<properties> 下的 <jrepath> 这个标签就是自己写的, 标签名就是参数名, 标签体就是值.
上面代码的意思就是定义了两套名称叫<jrepath>的值, 一个id叫linux,一个id叫win,
然后在pom.xml的其他地方可以使用${jrepath}获取这个值,但是具体的是获取liunx下的值还是win下的值呢?这就要在执行maven命令时用-P参数指定<id>,
如: mvn package -Plinux


2.4 使用spring 的profile标签.
类似maven的profile标签,可以自己去看看,也是比较折腾,不爱用


2.5 redis方式
适合非项目启动参数和变动较少的常量数据
把参数通过后台编辑的方式(做一个管理页面)存到redis中.
简单点的,可以每次都从redis获取配置
优化点的, 就是避免每次都从redis获取,用redis的发布订阅模式, 项目启动时(Listener或者Filter或者spring的@PostConstrutor都行)把配置从redis中获取到缓存到本地内存中(如集合,常量等), 如果改动了redis数据, 项目订阅了此channel的消息, 然后从新从redis获取更新本机缓存,并且适合集群环境哦。


2.6 用System.setProperty的方式
用System.setProperty("key","value")的方式设置的值,在spring的配置文件或其他配置文件中都可以用${key}的方式获取值.
这样可以把配置文件全部放到自定义的环境变量对应的目录中,然后项目启动时读取配置文件,将配置信息通过System.setProperty的方式缓存起来, 然后spring配置中直接用${key}的方式.事例:
public class SysInitListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        String path = System.getenv("MY_CNF");
        try {
            InputStream in = new BufferedInputStream(new FileInputStream(path + "/xxx.properties"));
            Properties p = new Properties();
            p.load(in);

            /* //数据库
            System.setProperty("jdbc.driverClass", p.getProperty("jdbc.driverClass", "com.mysql.jdbc.Driver"));
            System.setProperty("jdbc.url", p.getProperty("jdbc.url", "线上地址"));
            System.setProperty("jdbc.user", p.getProperty("jdbc.user", "线上用户名"));
            System.setProperty("jdbc.password", p.getProperty("jdbc.password", "线上密码"));
                      
            //环境,默认生产环境
            SYSConstant.MS_ENV = EnvEnum.getByFlag(p.getProperty("env", "product"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}




spring 配置文件中用${key}的方式可以获取到值
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClass}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>


上述Listener中还有
 SYSConstant.MS_ENV = EnvEnum.getByFlag(p.getProperty("env", "product"));

这句就是从配置文件中获取一个叫env的值,赋值给项目中的一个常量, 这样在代码中判断这个常量就知道项目所处的环境了,有什么用?比如发短信或者校验短信验证码等在线下是没有必要的,那么就可以通过这个常量来判断业务逻辑


分享到:
评论

相关推荐

    jquery-i18n-properties-1.0.9

    "jquery.i18n.properties.min.js"是压缩后的版本,适用于生产环境,以减少文件大小,提高页面加载速度。"compress.py"可能是一个Python脚本,用于自动化压缩过程。"bundle"和"css"目录可能包含与插件相关的样式文件...

    前端开源库-koa-i18n

    Koa-i18n 是一个专为 Koa 框架设计的轻量级国际化中间件,它基于 i18n-2 库,旨在帮助开发者快速、方便地在前端应用中实现多语言支持。在开发面向全球用户的 web 应用时,提供多种语言版本是非常重要的,Koa-i18n ...

    ADI_Int-N_Setup_v7_4_

    这款ADI_Int-N_Setup_v7_4_3.msi文件是一个安装程序,用于在用户的计算机上安装ADI的集成开发环境。在安装过程中,它会将必要的库、驱动、API和用户界面组件部署到系统中,以便用户能够通过友好的图形用户界面与ADI...

    anaconda配置pytorch环境手册

    通过以上步骤,您就可以在Anaconda环境下成功配置好PyTorch开发环境了。此外,文档中还提到了一些注意事项,比如如何处理下载过程中的问题以及如何解决可能出现的错误等。希望这份详细指南对您有所帮助!

    《Anaconda安装指南:适用于初学者的Python环境配置》

    ### Anaconda安装与配置详解 #### 一、安装Anaconda **1.... ...对于大多数用户来说,推荐下载最新版本的...通过这些步骤,即使是初学者也能快速地在本地或服务器上搭建出适合数据分析、科学计算和机器学习的开发环境。

    Vue-ElementPlus-i18n

    - **开发环境调试**:在开发过程中,可以快速切换语言环境测试不同语言的显示效果。 - **部署配置**:在生产环境中,可以根据用户浏览器的本地设置自动选择合适语言,或者让用户手动选择。 - **多语言维护**:...

    jquery.i18n.properties在asp.net里的应用

    **jQuery.i18n.properties 在 ASP.NET 中的应用详解** 在多语言网站开发中,提供不同地区的用户以他们本地语言查看内容是一项重要的需求。jQuery.i18n.properties 是一个用于 jQuery 的插件,它使得在 JavaScript ...

    Laravel开发-locale-route

    - **特性**:可能包括自动化处理语言切换,以及测试本地化路由的功能,提高开发效率。 - **使用**:通常需要安装依赖(`composer require`),然后在服务提供者中注册,最后在路由文件中应用。 - **测试**:扩展...

    Laravel开发-platform-pages-lang-cs

    8. **单元测试**:为了确保翻译的准确性和完整性,开发者可能会编写单元测试来检查不同语言环境下的页面显示。 9. **持续集成/持续部署 (CI/CD)**:项目的开发可能集成了 Git 版本控制,通过 CI/CD 工具如 Jenkins ...

    新版Android开发教程.rar

    � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、制造商、独立软件生产商都可以获得不错的利 益 。 将移动终端的评价标准从硬件向软件转变,极大的激发了软件开发者的热情。 � Android 的源代码遵循 Apache...

    软件测试笔试题-----经典版本

    15. **递归计算数组之和**:在C/C++中,可以写成`return sum(a+1,n-1) + a[0];`和`return 0;`。 16. **排序算法**:常见的有冒泡排序、快速排序、归并排序等,每种算法有不同的效率和适用场景。 17. **兼容性测试*...

    ios-中英文语言切换.zip

    在iOS应用开发中,实现中英文语言切换是十分常见的需求,尤其对于面向全球用户的软件来说。这个"ios-中英文语言切换.zip"压缩包提供的Demo就是一种实现方式,旨在帮助开发者理解和实施应用的国际化...

    vscode配置C++配置教程-windows.pdf

    ### VSCode+C++ 开发环境配置教程 - Windows 平台 #### 一、VSCode 安装及语言包配置 1. **下载与安装**: - 下载最新版的 Visual Studio Code 安装包,并按照提示将其安装到默认路径(通常为 C:\Users\[用户名]\...

    接口自动化测试基础02-思维梳理及Requests库应用

    可配置是指框架需要做到可配置,便于切换,调用不同的配置文件可以在不同的环境执行。 九、日志 日志包含执行的具体执行接口、请求方式、请求参数、返回值、校验接口、请求时间、耗时等关键信息。日志的好处一来是...

    jenkins搭建android自动打包环境

    ### Jenkins 搭建 Android 自动打包环境...总结来说,通过 Jenkins 搭建 Android 自动打包环境不仅提高了开发效率,还简化了测试和发布流程。此外,结合 fir.im 实现自动化测试和发布,使得整个 CI/CD 流水线更加完善。

    nServer-v2.1023[FTP + MYSQL + HTTP + PHP(FCGI)]

    说明: xServer是业内首家通过CMD界面管理所有服务并实现标准管理接口的集成化WEB开发环境。 支持php54/3/2版本切换或多版本同时运行,支持为独立站点配置独立php进程,保证站点安全。 支持Zend/eAccelerator/...

    开源项目-dre1080-i18n.zip

    在这个项目中,`i18n-master`可能包含了源代码、资源文件以及相关的配置,用于帮助开发者实现在他们的Go应用中添加多语言支持。 1. **TOML I18N**:TOML文件用于存储I18n的语言包,其中包含了各种语言的文本字符串...

    Springboot开发-springboot的国际化配置.zip

    在Spring Boot应用中,国际化配置...总之,Spring Boot的国际化配置使得为多语言环境的应用开发变得简单而有效。通过合理配置和使用`MessageSource`,开发者可以轻松地管理和提供各种语言的界面与文本,提升用户体验。

    Commons-logg测试代码

    Commons-Logging是Apache软件基金会开发的一个Java日志抽象层,它为各种日志框架提供了一个统一的接口,包括Log4j、Java内置的日志API(java.util.logging)以及Simple Logging Facade for Java (SLF4J)。...

Global site tag (gtag.js) - Google Analytics