☕【Java】Maven Profile管理Spring cloud多环境配置

一、前言

一般环境分为三种:开发环境、测试环境、部署环境。
举个简单的例子,当完成开发,向服务器部署时,就要更改项目配置文件里的内容。这对于小的单体项目来说尚可接受,但对于微服务这样的项目可是麻烦死了。
有没有一种可以一键切换开发环境的按钮

二、Spring Boot Profile

Spring Boot已经提供了配置管理的功能,如下:

spring:
  profiles:
  active: prod
---
spring:
  profiles: dev
  cloud:
    config:
      name: consumer
      profile: dev
      label: master
      uri: http://127.0.0.1:8888
---
spring:
  profiles: prod
  cloud:
    config:
      name: consumer
      profile: prod
      label: master
      uri: http://*.*.*.*:8888

使用spring.profiles.active来指定配置,不同的配置之间使用—分隔,以及使用spring.profiles来指定当前配置的名字。
对于单体应用来说已经很方便了,无非就是多写几个配置,到时候手动的将spring.profiles.active的值一改就行了。
但是对于微服务来说,手动的改依然很麻烦,毕竟那么多服务呢。尽管用了配置管理中心,我们可以将不同环境的配置文件托管到git上让配置管理中心读取,但是每个服务仍然需要有一个配置文件与配置管理中心打交道,就是上面举的例子的代码。这就需要我们依然要去管理这些配置未见的profiles了。

三、Maven Profile

Maven也提供了Profile切换功能,而且Idea支持的也很好,将微服务的所有module的pom文件里添加如下代码:

<profiles>
    <profile>
        <id>devid>
        <activation>
            <activeByDefault>trueactiveByDefault>
        activation>
        <properties>
            <profile.active>devprofile.active>
        properties>
    profile>
    <profile>
        <id>prodid>
        <properties>
            <profile.active>prodprofile.active>
        properties>
    profile>
    <profile>
        <id>remoid>
        <properties>
            <profile.active>remoprofile.active>
        properties>
    profile>
profiles>
    

就可以看到Idea右侧的Maven工具栏里多出了Profiles选项,里面是上面代码定义的环境名。
☕【Java】Maven Profile管理Spring cloud多环境配置_第1张图片
但是此时任然不能使用。

四、@profile.active@

用Maven的@profile.active@替换掉Spring Profile,如下:

spring:
  profiles:
    active: @profile.active@

一把情况下这样已经可以使用了,无论是Idea运行还是Maven打包,都会遵从你选的环境将@profile.active@替换掉。
但Spring cloud比较特殊,使用配置中心后不会在使用application.yml,而是使用bootstrap.yml。但是Maven只认application.yml,bootstrap.yml里的@profile.active@不会被替换掉。
如果将bootstrap.yml改名为application.yml,那么由于两者加载优先级不一样,会导致程序只按照默认环境执行。
那么只剩一种办法了,在pom文件的build标签里添加如下代码,用于过滤yml文件:

<resources>
    <resource>
        <directory>src/main/resourcesdirectory>
        
        <includes>
            <include>**/*.ymlinclude>
        includes>
        
        <filtering>truefiltering>
    resource>
resources>

这样一来就能替换成功了

你可能感兴趣的:(Java)