通常服务端应用开发需要经过以下几个流程:
开发 -> 测试 -> RC验证 -> 上线
这就涉及到四个不同的环境,开发环境、测试环境、RC环境以及生产环境,为了避免不同环境之间相互干扰,通常需要独立部署数据库、缓存服务器等,那么应用配置也要做相应的调整。
为了解决不同环境配置切换问题,很多人的做法是:把配置文件根据不同的环境,放到不同的目录或文件中,打包时通过gradle或maven,通过命令行参数指定要打哪个环境的包。这样就可以针对不同的环境生成不同的包。但这样的做法有以下几个问题:
gradle或maven打包脚本文件需要重复编写“选择文件”打包的逻辑,增加很多重复劳动的成功;在jenkins等集成环境中,需要针对每个应用,不同的环境做相应的设置;需要管理不同环境的包,带来的成本;部署时,需要注意包与运行环境是否一致;如果运行在docker中时,因为包不同所以要针对不同的环境,构建相应的镜像。
这时也许有人会说,把配置都从包里剥离出来,放到配置中心就可以了,但是不同环境对应的配置中心地址也是不一样的。
Spring中的Profile 是什么?
Spring中的Profile功能其实早在Spring 3.1的版本就已经出来,它可以理解为我们在Spring容器中所定义的Bean的逻辑组名称,只有当这些Profile被激活的时候,才会将Profile中所对应的Bean注册到Spring容器中。
举个更具体的例子,我们以前所定义的Bean,当Spring容器一启动的时候,就会一股脑的全部加载这些信息完成对Bean的创建;而使用了Profile之后,它会将Bean的定义进行更细粒度的划分,将这些定义的Bean划分为几个不同的组,当Spring容器加载配置信息的时候,首先查找激活的Profile,然后只会去加载被激活的组中所定义的Bean信息,而不被激活的Profile中所定义的Bean定义信息是不会加载用于创建Bean的。
为了使用不同的环境,我们首先对不同的环境,定义相应的profile名称。
比如,开发环境的profile为:dev;测试环境的profile为:test;RC环境的profile为:rc;生产环境的profile为:prod。
下面举个dubbo不同环境下,使用不同配置的方法:
上