在软件开发过程中会经历开发,测试,部署等多个阶段,每个阶段的配置不同,比如本地的开发环境所依赖的数据库是本地的MySQL,而测试环境的数据库依赖的是阿里云服务器中的云数据库,到了部署阶段可能依赖的数据库又是自己公司部署的物理机上的数据库,像这种只是一个数据库的差异不同,还能通过手动修改配置文件完成数据库的依赖,但是实际上的情况是现在的项目不再是单一的单体服务,而是复杂的分布式服务,一个完整的项目可能有几个或者更多个小的的服务组成,服务间通过通络通信,为了保证服务运行的稳定性以及功能的需要就会引入一大堆的组件和工具,比如涉及到缓存会引入redis,涉及到服务间的通信会引入消息队列,kafka或者mq,如果项目更复杂就会引入更多的工具和组件这个时候项目的配置就变得复杂起来了,如果在各个阶段都需要通过手动修改配置文件来完成项目的配置,这对于开发者来说是极其的不友好,开发者应该把更多的事情放在开发上面,而不是在不停的复制粘贴的修改配置文件,有没有一种简单办法呢?spring的profile功能进行配置参数的切换非常好的解决了这个问题
目前spring的profile提供了两种激活方式如下
1.通过设置spring.profiles.default和spring.profiles.active这两个属性来激活和使用对应的配置文件。default为默认,如果没有通过active来指定,那么就默认使用default定义的环境
激活需要的环境变量
在profile.activce没有选择需要激活的配置的情况下,spring会去加载默认的配置,如果就连默认的也没有,我以前遇到一次忘记写需要激活的配置,spring会把需要的配置从上到下进行加载,多数情况下会导致项目不能加载成功,这里建议大家进行本地开发的时候不要去使用这种修改配置文件的形式进行修改,遇到任何本地需要修改配置文件,但是仅仅只是本地开发需要修改配置文件,比如测试环境和部署环境的配置不需要改动的这种情况请通过idea提供的带参数启动来修改,避免污染配置文件导致后续步骤失败
关于带参数启动这里也有多种写法,这里不再讲解,有兴趣的可以自行百度
2.在程序中,也可以通过 @Profile("...") 对某些资源进行注解,这样只有当选择对应的环境时,才会产生对应的bean
对于以上的两种方式个人其实建议第一种,原因有以下几点
1.通过注解虽然没有修改配置文件,但是等同于修改了配置文件
2.通过环境来选择创建bean可能会导致在某一个环境下某一个bean出现NPE
3.通过修改注解形式不利于团队协作开发,一旦git提交忘记忽略注解所在的文件会给其他的同事带来不必要的影响
4.这种注解形式相对于注解形式来说分布比较松散,难以修改到位
目前许多的服务的部署都是通过Jenkins或者docker部署,默认环境变量只能默认一个,比如我的默认环境只是适合测试环境通过Jenkins部署,如果我的正式环境是docker部署的这个怎么办呢?难道还需要去修改配置文件的默认吗?其实不用,jdk启动过程中可以携带参数启动
比如运行jar包时指定端口:java -jar xxx.jar --server.port=8088
带参数启动如果只是一两个还好,可以直接写在脚本文件里面,如果参数太多了这种方式就太过于复杂,而且对于docker部署的服务来说部署情况完全不一样,那么带参数启动就适用了,这个时候还有一种就是通过在maven打包的过程中在节点中添加节点信息,maven会自动依据打包时候附带的节点启动信息去打出对应环境的jar,具体操作请参考https://blog.csdn.net/hjiacheng/article/details/57413933