前言
在进行软件开发过程中,一般会将项目分为开发环境,测试环境,生产环境,开发人员在开发环境进行开发,然后将代码合并到测试环境让 测试工程师进行测试,测试完成后,开发人员修改完bug,然后再进行测试,测试工程师测试没有bug后,再将代码合并到生产环境,生产环境 就是最终给用户用的,现在的项目一般都是走CI/CD流水线,整个过程就是一条流水线,而在没有CI/CD之前,开发人员开发完毕后,可能需要将代码 部署上服务器,测试人员再进行测试,还有的直接让测试人员拉代码来自己运行,自己测试,这样效率实在是太低了。那么在这么多环境之间进行切换, 我们应该需要一定的策略,下面我就是用Spring的@Profile注解来实现环境之间的切换。
环境搭建
项目结构
代码语言:javascript复制DruidDataSource
└── src
└── main
└── java
└── com.steakliu.druiddatasource
├── controller
│ └── DataSourceController.java
└── datasource
│ └── DataSourceConfiguration.java
└── DruidDataSourceApplication.java
└── resource
└── application.yml
└── application-dev.yml
└── application-prod.yml
└── application-test.yml
application.yml
application.yml内容如下,里面主要放的是公共的配置,比如项目的名称啊,端口啊这些,使用spring.profiles.active = dev/test/prod切换不同的环境。
代码语言:javascript复制server:
port: 8080
spring:
profiles:
active: dev
application-dev.yml
代码语言:javascript复制spring:
datasource:
druid:
username: root
password: xiaosi520@
url: jdbc:mysql://127.0.0.1:3306/store-dev
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
application-test.yml
代码语言:javascript复制spring:
datasource:
druid:
username: root
password: xiaosi520@
url: jdbc:mysql://127.0.0.1:3306/store-test
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
application-prod.yml
代码语言:javascript复制spring:
datasource:
druid:
username: root
password: xiaosi520@
url: jdbc:mysql://127.0.0.1:3306/store-prod
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
从上面我们知道,三个yaml文件主要配置的是数据库,分为dev,test,prod三个库,我也在数据库创建了三个数据,等一下我们要根据不同的配置获取不同的数据库的数据, 三个数据库如下,其中每个库里面都有一张表,分别放了一条测试数据。
数据源配置DataSourceConfiguration
DataSourceConfiguration
是一个数据源配置类,我们使用alibaba的Druid数据源,使用@Value
注解来获取yaml文件的数据库配置, 定义了三个Bean,并使用@Profile
来进行开发环境,测试环境,生产环境的区分,这里它会识别application.yml
文件中的spring.profiles.active
package com.steakliu.druiddatasource.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
@Value("${spring.datasource.druid.username}")
private String username;
@Value("${spring.datasource.druid.password}")
private String password;
@Value("${spring.datasource.druid.url}")
private String url;
@Value("${spring.datasource.druid.driver-class-name}")
private String driverClassName;
@Profile("dev")
@Bean
public DataSource devDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
@Profile("test")
@Bean
public DataSource testDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
@Profile("prod")
@Bean
public DataSource prodDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
}
DataSourceController测试Controller
创建一个Controller来测试获取数据,这里使用JdbcTemplate
来获取数据
package com.steakliu.druiddatasource.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
public class DataSourceController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("datasource")
public List<Map<String, Object>> datasource(){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM sys_env");
return maps;
}
}
使用Postman进行测试
spring.profiles.active = dev
代码语言:javascript复制spring:
profiles:
active: dev
spring.profiles.active = test
代码语言:javascript复制spring:
profiles:
active: test
spring.profiles.active = prod
代码语言:javascript复制spring:
profiles:
active: test
到这里我们完成了开发环境,测试环境,生产环境的切换,其核心就是spring.profiles.active
和@Profile
注解,那么这时候你可能会觉得,每次打包发布前都需要 去application.yml配置文件中修改spring.profiles.active
,是不是有点麻烦,没错,确实会有点麻烦,那么我们下面对其改造,使用Maven的profile
来改造,实现勾选式
的配置。
使用Maven配置
我们在maven中对dev,test,prod进行定义,如下,使用<profiles>
标签进行包裹,使用<activeByDefault>
标签将dev
作为默认的环境, 在<properties>
中定义环境标识(dev,test,prod),<mvn.profile>
是自定义的,可以任意定义,它和application.yml
那边进行对应。
pom.xml
代码语言:javascript复制<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<mvn.profile>dev</mvn.profile>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<mvn.profile>test</mvn.profile>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<mvn.profile>prod</mvn.profile>
</properties>
</profile>
</profiles>
application.yml
application.yml里面使用@mvn.profile@
这种方式来读取pom.xml中的配置。
spring:
profiles:
active: @mvn.profile@
定义好上面的pom.xml
和application.yml
后,会在我们IDEA编译器右侧的Maven栏下出现Profiles
,就可以 进行选择了,所实现的效果和直接在applicaiton.yml
中修改是一样的。
除了上面的这两种,我们还可以在IDEA里面进行指定,也能达到同样的效果。
后记
关于使用Spring的@Profile
实现环境之间的切换就说到这里,配置多环境有很多种方案,主要是看那种适合我们,今天的分享就到这里,感谢你的观看,下期见。