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

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

[[413405]]

前言

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

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

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

方案

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

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 

http://localhost:8080/env

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

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

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

http://localhost:8080/env

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

其他

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

责任编辑:武晓燕 来源: 今日头条
相关推荐

2012-08-29 09:51:01

iPhone苹果专利

2010-03-04 15:06:39

Python CGI环

2009-12-15 16:41:17

路由器设置

2021-09-13 10:31:02

Java原子

2024-04-23 14:13:38

开发配置文件

2009-12-17 16:47:01

Linux桌面环境

2020-07-15 10:00:45

springbootbeanJava

2011-06-20 14:00:26

Qt qmake

2009-07-01 10:12:40

JSP环境配置JSP引擎

2010-11-25 16:48:20

HadoopHbase

2022-03-23 07:31:34

SpringBoot加载配置

2009-06-29 15:06:23

环境变量配置Java

2010-07-21 15:07:30

telnet服务

2009-12-14 10:08:31

路由器配置

2010-03-12 17:23:38

Python脚本

2017-06-27 05:08:46

存储虚拟化服务器

2011-03-17 17:59:33

云环境中开发

2010-03-30 15:54:27

Oracle date

2022-07-07 09:27:26

Syslinux加载程序

2021-04-22 07:43:24

后端技术SpringBootdevtools
点赞
收藏

51CTO技术栈公众号