Spring Boot 多环境部署

Spring Boot 允许准备多个配置文件,可以在系统部署的时候,指定使用哪个配置文件覆盖默认的application.properties,从而完成多环境部署。

需要在resource下创建application-{profile}.properties 的配置文件,其中profile可以是任意名字,比如:

profile 说明
test 表示测试环境
prod 表示线上环境
pre-prod 表示预发布环境
demo1.0 1.0版本演示环境

这些配置文件可以添加或覆盖application.properties文件的属性。

在环境变量中,spring.profile.active指定使用哪个profile,比如:

java -jar -Dspring.profiles.active=prod target/demo-0.0.1.jar
java -jar -Dspring.profiles.active=prod target/demo-0.0.1.jar --server.port=8080
​java -jar target/demo-0.0.1.jar --spring.profiles.active=prod --server.port=8080
#后台运行​
nohup java -jar target/demo-0.0.1.jar --spring.profiles.active=prod > /dev/null 2>&1 &

以上配置成功后,Spring Boot 将读取resource/application-prod.properties配置文件,覆盖默认的application.properties选项。

application.properties的内容如下:

server.port=8080
...

application-prod.properties的内容如下:

server.port=9000
...

如果使用war方式部署,添加系统属性是比较好的方式,下面以Tomcat为例进行说明。

编辑catalina.sh,在sh文件的开头部分添加如下内容:

JAVA_OPTS="-Dspring.profiles.active=prod"

在多环境部署中,通常resource目录下可能没有目标环境的配置文件,这主要是为了安全考虑,开发环境不应该有线上环境的各种配置信息。可以将配置文件放到特定的目录中,并用spring.config.location指定配置文件的目录:

java -jar -Dspring.config.location=file:env/ -Dspring.profiles.active=test target/demo-0.0.1.jar

配置文件位于当前目录的env目录下,profile是test,因此读取的是application-test.properties配置文件。

注意:无论用上面那种多环境配置方法,总是会覆盖已有的application.properties。

Spring Boot 如何找到配置文件:

Spring Boot应用默认读取了application.properties文件,实际上,Spring Boot会自动搜索以下目录下的文件,优先级由低到高,file:config/的优先级最高。

文件目录
classpath:
classpath:/config
file:
file:config/ 

这是系统属性spring.config.location默认的配置。spring.config.name表示配置文件的名称,默认是application。

@Profile注解

系统属性spring.profiles.active可以指定使用哪种配置文件,如果指定test,则application-test.properties会覆盖默认的application.properties。

@Profile注解可以结合@Configuration和@Component使用,以决定配置类会否生效。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;

@Configuration
public class DataSourceConf {
    
    @Bean(name="dataSource")
    @Profile("test")
    public DataSource testDataSource(Environment env) {
    	HikariDataSource test = getDataSource(env);
    	test.setMaximumPoolSize(10);
    	return test;
    }

    @Bean(name="dataSource")
    @Profile("prod")
    public DataSource testDataSource(Environment env) {
        HikariDataSource test = getDataSource(env);
        test.setMaximumPoolSize(200);
        return test;
    }
    
    private HikariDataSource getDataSource(Environment env) {
        HikariDataSource ds = new HikariDataSource();
        // 省略初始化代码
        return ds;
    }
    
}

@Profile注解可以支持使用多种profile,也可以使用“!”来排除特定profile。

@Profile({"test", "prod"}) 测试环境和线上环境生效

@Profile({"test", "!prod"}) 测试环境和非线上环境生效

猜你喜欢

转载自my.oschina.net/u/3777515/blog/1785207
今日推荐