SpringBoot中根据环境加载不同的配置的方案

时间:2021-09-30 17:23:39

SpringBoot中根据环境加载不同的配置的方案

前言

我们的一个应用,开发上线,需要一定的流程,比如需要先在测试环境中进行测试,测试环境中有它的一整套配置,如MySQL、Redis、MQ等。

测试环境测试完毕,我们会在预发环境再度测试,最后再上线,即线上环境。每个环境都有他们自己独有的一套配置,而代码逻辑都是一样,就是环境配置不一样而已。

如何低耦合地分离各个环境的配置,就是我们所追求的,下面阐述下SpringBoot中的方案。

方案

我写了个demo,下面是它的代码结构:

SpringBoot中根据环境加载不同的配置的方案

1.业务代码

下面假定以下是业务代码,主要就是从配置文件中读取env的值,并返回出去:

  1. package com.example.configenv.controller; 
  2.  
  3. import org.springframework.beans.factory.annotation.Value; 
  4. import org.springframework.web.bind.annotation.GetMapping; 
  5. import org.springframework.web.bind.annotation.RequestMapping; 
  6. import org.springframework.web.bind.annotation.RestController; 
  7.  
  8. @RestController 
  9. @RequestMapping("/"
  10. public class EnvController { 
  11.  
  12.     @Value("${env}"
  13.     private String env; 
  14.  
  15.     @GetMapping("/env"
  16.     public String showEnvValue() { 
  17.         return env; 
  18.     } 
  19.  

2.配置文件

配置文件中,application.yml是一个主配置,即无论如何,都会被加载的,类似SSM时代的spring-config.xml。里边的逻辑,就一个active,就是指定配置环境:

  1. spring: 
  2.   profiles: 
  3.     active: dev 

对应其他其他环境的配置,它们有2个点,一个是环境名称on-profile,一个对应环境下的值env。

  1. SpringBoot中根据环境加载不同的配置的方案 
  2. 原创2021-07-26 17:31·IT小村 
  3. 前言 
  4.  
  5. 我们的一个应用,开发上线,需要一定的流程,比如需要先在测试环境中进行测试,测试环境中有它的一整套配置,如MySQL、Redis、MQ等。 
  6.  
  7. 测试环境测试完毕,我们会在预发环境再度测试,最后再上线,即线上环境。每个环境都有他们自己独有的一套配置,而代码逻辑都是一样,就是环境配置不一样而已。 
  8.  
  9. 如何低耦合地分离各个环境的配置,就是我们所追求的,下面阐述下SpringBoot中的方案。 
  10.  
  11. 方案 
  12.  
  13. 我写了个demo,下面是它的代码结构: 
  14.  
  15. SpringBoot中根据环境加载不同的配置的方案 
  16.  
  17.  
  18. 1.业务代码 
  19.  
  20. 下面假定以下是业务代码,主要就是从配置文件中读取env的值,并返回出去: 
  21.  
  22. package com.example.configenv.controller; 
  23.  
  24. import org.springframework.beans.factory.annotation.Value; 
  25. import org.springframework.web.bind.annotation.GetMapping; 
  26. import org.springframework.web.bind.annotation.RequestMapping; 
  27. import org.springframework.web.bind.annotation.RestController; 
  28.  
  29. @RestController 
  30. @RequestMapping("/"
  31. public class EnvController { 
  32.  
  33.     @Value("${env}"
  34.     private String env; 
  35.  
  36.     @GetMapping("/env"
  37.     public String showEnvValue() { 
  38.         return env; 
  39.     } 
  40.  
  41. 2.配置文件 
  42.  
  43. 配置文件中,application.yml是一个主配置,即无论如何,都会被加载的,类似SSM时代的spring-config.xml。里边的逻辑,就一个active,就是指定配置环境: 
  44.  
  45. spring: 
  46.   profiles: 
  47.     active: dev 
  48. 对应其他其他环境的配置,它们有2个点,一个是环境名称on-profile,一个对应环境下的值env。 
  49.  
  50. application-dev.yml 
  51.  
  52. spring: 
  53.   config: 
  54.     activate: 
  55.       on-profile: dev 
  56.  
  57. env: '测试环境' 

application-online.yml

  1. spring: 
  2.   config: 
  3.     activate: 
  4.       on-profile: pre 
  5.  
  6. env: '预发环境' 

application-online.yml

  1. spring: 
  2.   config: 
  3.     activate: 
  4.       on-profile: online 
  5.  
  6. env: '线上环境' 

3.验证效果

当我的主配置文件为如下时,即指定环境为dev测试环境

  1. spring: 
  2.   profiles: 
  3.     active: dev 

SpringBoot中根据环境加载不同的配置的方案

http://localhost:8080/env

可以看到,加载的是application-dev.yml的配置

而当我的主配置文件是如下时,即加载的是online线上环境

  1. spring: 
  2.   profiles: 
  3.     active: online 

SpringBoot中根据环境加载不同的配置的方案

http://localhost:8080/env

可以看到,加载的是application-online.yml的配置。

其他

部署应用的时候,我们只需要覆盖application.yml即可,就可以在测试环境、预发环境、线上环境等环境,加载他们对应的配置。

原文链接:https://www.toutiao.com/i6989159134088233484/