1、多环境选择
1.1、场景描述
以下两种场景下需要进行多环境选择:
- 不同环境运行相同代码
在应用开发的过程中,同一套程序通常会在多个不同环境下运行。如:开发、测试、生产环境等。每个环境的数据库地址、服务器端口号等配置都会不同。若根据不同环境,手动地去修改这些配置,就会显得繁琐且易错。此时我们更期望定义出几套不同的配置信息,在不同的环境中选择不同的配置。 - 不同环境执行不同实现类
在应用开发的过程中,有时不同的环境,需要调用的接口的实现类也是不同的。如开发一个具有短信发送功能的接口中的方法send()
:开发环境中,send()
方法仅需调用短信模拟器即可;而生产环境中,send()
则需要调用短信运营商所提供的短信发送接口。此时我们期望能开发两个相关的实现类去实现send()
方法,然后在不同的环境中自动选择不同的实现类去执行。
1.2、场景案例
场景案例1:假设生产环境(pro)与开发环境(dev)使用的上下文根与端口号不同。
场景案例2:假设生产环境发送短信的调用方式与测试环境不同。
2、多配置式多环境选择实现
2.1、解决场景案例1
- 为不同的环境创建不同的配置文件
注意,SpringBoot的yml文件命名有着严格的要求,只能以application[-{}].yml
的方式存在,如application-xxx.yml
。{}
中的内容,如xxx
,其实就是profile信息。
- 根据不同的环境分别为配置文件配置信息
# application-dev.yml server: port: 8081 servlet: context-path: /devpath
# application-pro.yml server: port: 8082 servlet: context-path: /propath
- 在application.yml配置文件中决定具体选择哪一配置
# application.yml,假设默认选择的dev spring: profiles: active: dev
2.2、解决场景案例2
-
创建测试文件
-
定义接口及其实现类
// 定义接口 public interface DemoService { String send(); // 定义接口方法 }
@Service @Profile("pro") // 指定pro环境 public class ProService implements DemoService { @Override public String send() { return "生产环境发送短信方式!"; } }
@Service @Profile("dev") // 指定dev环境 public class DevService implements DemoService { @Override public String send() { return "开发环境发送短信方式!"; } }
-
定义Controller类
@RestController public class DemoController { @Autowired private DemoService service; @GetMapping("/sendMessage") public String sendMessage() { return service.send(); } }
2.3、结果检测
-
启动项目
在启动日志中可以发现,程序如我们所愿,选择的是dev配置。至于pro配置这里就不再重复试验。
-
查看结果
3、单配置式多环境选择实现
若我们不希望配置文件过多存在,则我们可以把这些文件统一存放在application.yml文件内:
spring:
profiles:
active: dev
---
spring:
profiles: dev
server:
port: 8081
servlet:
context-path: /devpath
---
spring:
profiles: pro
server:
port: 8082
servlet:
context-path: /propath
此时就可以去掉之前的application-dev.yml文件与application-pro.yml文件,通过前文所述的方式任意切换环境,此处不再截图赘述。
4、快捷切换多环境配置
多环境配置的情况下,假如我们在做测试的时候,生产环境与测试环境需要切换运行,若每次运行的时候都需要重新打包,这样就会显得特别麻烦,其实我们可以通过启动的时候配置信息即可。
-
选择测试环境配置并打包
(图略) -
启动并运行项目
-
切换环境
此时我们希望在不重新打包的基础下修改成生产配置,基于此,我们可以添加启动参数的方式切换环境(先关闭之前的启动):java -jar xxx.jar --spring.profiles.active=pro
可以看到,此时的运行环境已经切换为生产环境了。