目录

1. 环境变量切换

1.1 建立各环境配置文件

1.2 设置环境变量

2. nacos配置中心动态切换

2.1 配置文件

2.2 nacos配置

2.3 启动服务

3. 同一nacos环境下服务不同环境控制

3.1 cloud方式

3.1.1 引入依赖

3.1.2 添加配置

3.1.3 添加环境变量

3.1.4 启动服务

3.1.5 读取数据库配置

4.Maven方式

4.1 创建配置文件

4.2 更改pom文件

4.3 maven打包

总结

常见问题

1.读取不到配置


多环境配置说明:

在项目实际开发过程中,可能会有不同的环境,例如开发环境,测试环境和生产环境。不同的环境,对应的配置信息是不同的,将项目发布到不同的环境,需要去更改对应环境的配置信息,如果每次都是手动去更改环境,非常不友好,且容易漏掉配置,如果能够实现不同环境的自动识别,动态切换,将极大的提高工作效率。下面介绍一下自己在工作中使用到的多环境配置方法。

1. 环境变量切换

SpringBoot打包服务时,一些参数需要从外界获取,可以通过在配置文件中配置环境变量实现

spring:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:table}?useUnicode=true&characterEncoding=UTF-8username: ${DB_USER:root}password: ${DB_PASSWORD:root}

上面案例中,${DB_HOST:localhost} 服务会先在系统环境变量 DB_HOST 中获取值,如果获取不到则使用默认值 localhost

​ 我们可以利用系统环境变量读取机制,在不同环境下给变量配置不同值,通过读取对应变量的值,获取不同的运行配置文件:

1.1 建立各环境配置文件

分别为 application-dev.yml 和 application-prod.yml 分别代表开发环境和生产环境的配置:


# application.yml
spring:profiles:active: ${HUACHUN_PROFILES_ACTIVE:dev}# application-dev.yml
server:port: 9001# application-prod.yml
server:port: 9002

这里只简单的测试环境切换服务端口号

1.2 设置环境变量

网上有示例配置和系统变量后IDEA自动会有环境配置,我的没有所以手动加上(可能是我使用的破解版吧 ,不知道是不是这个原因...)

如果使用的 linux 物理机, 使用 vim /etc/profile 命令,添加上一下配置

  SPRING_PROFILES_ACTIVE=prodexport SPRING_PROFILES_ACTIVE

1.3 启动服务

2. nacos配置中心动态切换

通过环境变量的方式,不同环境的配置可以直接观察到,不太安全(当然可以将关键配置抽离成环境变量)。可以将配置文件全部放置在 nacos 中,然后通过统一的域名访问 nacos 服务器,在不同的环境配置域名对应的host ,指向不同的nacos服务器地址,从而读取对应的配置。

2.1 配置文件

# application.yml
spring:profiles:active: ${HUACHUN_PROFILES_ACTIVE}# application-prod.yml
nacos:config:server-addr: nacos_addr:port    # 这里填写相应环境nacos配置中心地址和端口号bootstrap:enable: truelog-enable: truedata-ids: environment.yamltype: yamlgroup: devauto-refresh: true
#    namespace: 0e1ff256-8d17-4e94-a4dd-d81c06e9b56c   # 如果需要指定环境可以添加namespace属性

2.2 nacos配置

nacos中 environment.yaml 配置如下:

server:port: 9004

2.3 启动服务

服务启动后发现已经从nacos读取到服务端口号

访问服务测试正常

3. 同一nacos环境下服务不同环境控制

上面两种方式都是不同的环境对应不同的配置中心,如果多个环境都是使用的同一个配置中心(使用nacos作为配置中心),那么可以通过 dataId 实现不同环境的隔离。

3.1 cloud方式

3.1.1 引入依赖

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.6.RELEASE</version></dependency><!-- 启动获取配置中心配置 原文链接:https://blog.csdn.net/chy2z/article/details/119464497 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.3</version></dependency>

如果不引用spring-cloud-starter-bootstrap则不会读取nacos配置

3.1.2 添加配置

添加 bootstrap.yml 配置文件

spring:profiles:active: ${HUACHUN_PROFILES_ACTIVE}cloud:nacos:config:server-addr: nacos_addr:port  # nacos服务访问地址和端口enabled: truefile-extension: yamlprefix: environmentgroup: devrefresh-enabled: true

nacos配置三个文件,端口好分别是9904,9908,9909(这里主要是快速简单的测试读取配置)

3.1.3 添加环境变量

3.1.4 启动服务

3.1.5 读取数据库配置

1. 配置如下

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: ${env.project.db.username}password: ${env.project.db.password}url: jdbc:mysql://${env.project.db.adrr}:${env.project.db.port}/hhmt_cpa?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=truetype: com.alibaba.druid.pool.DruidDataSource

2. nacos配置

访问正常

4.Maven方式

4.1 创建配置文件

application-dev.yml 和 application-prod.yml 分别代表开发环境和生产环境的配置

# application.yml
spring:profiles:active: ${HUACHUN_PROFILES_ACTIVE:dev}# application-dev.yml
server:port: 9001# application-prod.yml
server:port: 9002

4.2 更改pom文件

 <profiles><profile><id>dev</id><properties><profileActive>dev</profileActive></properties><!--默认开发环境--><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>test</id><properties><profileActive>test</profileActive></properties></profile><profile><id>pro</id><properties><profileActive>pro</profileActive></properties></profile></profiles>

4.3 maven打包

maven  -P dev

原文链接:https://blog.csdn.net/qq_41863849/article/details/122145312

5.配置加密

5.1 服务配置文件中加密

通常在连接数据库时候明文信息不太安全,所以需要加密,这里展示数据库连接用户名密码加解密,其他参数同理

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: JAS(sNhUs2TnBigaKiBTIeobYA==)password: JAS(BaqtsIAiaTrZx84TJaMWAq2ryBPvvKbl)

5.1.1 引入依赖

        <!-- web应用依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- cloud整合nacos依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.6.RELEASE</version></dependency><!-- cloud启动依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.3</version></dependency><!-- mybatis-plus依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- mysql依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector.version}</version></dependency><!-- 数据库连接池依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid-spring.version}</version></dependency><!-- lombok依赖 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 加解密依赖 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency>

5.1.2 加解密工具类

package com.huachun.utils;import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;public class JasyptUtil {/*** 加密方法** @param password jasypt所需要的加密密码配置* @param value    需要加密的密码*/public static String encyptPwd(String password, String value) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(password);config.setAlgorithm("PBEWithMD5AndDES");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);String result = encryptor.encrypt(value);return result;}/*** 解密** @param password jasypt所需要的加密密码配置* @param value    需要解密的密码*/public static String decyptPwd(String password, String value) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(password);config.setAlgorithm("PBEWithMD5AndDES");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);String realV = getValue(value);String result = encryptor.decrypt(realV);return result;}public static String getValue(String value) {if (value.contains("JAS")) {return value.substring(4, value.length() - 1);}return value;}}

5.1.3 添加监听

package com.huachun.listener;import com.huachun.utils.JasyptUtil;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.env.OriginTrackedMapPropertySource;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class EnvironmentPreparedListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment env = event.getEnvironment();MutablePropertySources pss = env.getPropertySources();List<PropertySource> list = new ArrayList<>();for (PropertySource ps : pss) {Map<String, Object> map = new HashMap<>();if (ps instanceof OriginTrackedMapPropertySource) {OriginTrackedMapPropertySource propertySource = new OriginTrackedMapPropertySource(ps.getName(), map);Map<String, Object> src = (Map<String, Object>) ps.getSource();src.forEach((k, v) -> {String strValue = String.valueOf(v);if (strValue.startsWith("JAS(") && strValue.endsWith(")")) {v = JasyptUtil.decyptPwd(k, v.toString());}map.put(k, v);});list.add(propertySource);}}/**此处是删除原来的 OriginTrackedMapPropertySource 对象,把解密后新生成的放入到 Environment,为什么不直接修改原来的OriginTrackedMapPropertySource 对象,此处不做过多解释不懂的可以去看看它对应的源码,也算是留一个悬念,也是希望大家能够没事多看一看源码。*/list.forEach(ps -> {pss.remove(ps.getName());pss.addLast(ps);});}
}

5.1.4 添加控制类

package com.huachun.controller;import com.huachun.model.HcTest;
import com.huachun.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/env")
public class EnvCdDbController {@Autowiredprivate TestService testService;@GetMapping("/{id}")public HcTest env(@PathVariable("id") String id) {return testService.getData(id);}
}

5.1.5 访问测试

访问成功,查询数据库没有问题,说明解密成功。也可以打断点进去看

5.2 SpringCloud读取Nacos中加密参数

虽然在服务配置文件中可以正常加解密,但是并不灵活,通常还是需要将参数信息放到nacos配置中心管理。

总结

1.springboot方式使用application.yml配置

2.springcloud方式使用bootstrap.yml配置

常见问题

1.读取不到配置

参考原文:spring-cloud使用nacos配置中心的坑_黑暗行动的博客-CSDN博客

SpringBoot多环境动态环境切换(nacos)相关推荐

  1. SpringBoot 优雅实现动态数据源切换配置

    点击关注公众号,利用碎片时间学习 前言 随着应用用户数量的增加,相应的并发请求的数量也会跟着不断增加,慢慢地,单个数据库已经没有办法满足我们频繁的数据库操作请求了,在某些场景下,我们可能会需要配置多个 ...

  2. SpringBoot+Mybatis 实现动态数据源切换方案

    背景 最近让我做一个大数据的系统,分析了一下,麻烦的地方就是多数据源切换抽取数据.考虑到可以跨服务器跨数据库抽数,再整理数据,就配置了这个动态数据源的解决方案.在此分享给大家. 实现方案 数据库配置文 ...

  3. springBoot学习(二)配置环境动态切换和部分注解的运用

    springBoot配置环境动态切换 建立第一个配置文件(springBoot默认读取的文件)application.properties test.name=default test.default ...

  4. 06 SpringBoot企业实战多环境切换之Profile

    SpringBoot企业实战多环境切换之Profile 扫盲 server.port=8080表示springboot启动内置tomcat容器使用8080端口 1.多profile文件形式(常见) [ ...

  5. 动态环境下的SLAM:DynaSLAM 论文学习笔记

    动态环境下的SLAM:DynaSLAM 论文学习笔记 这篇文章 论文摘要 系统流程 相关环节的实现方法 神经网络检测图中动态物体(Mask R-CNN) Low-Cost Tracking 使用多视图 ...

  6. 面向动态环境基于点的语义SLAM系统

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L | 来源:知乎 https://zhuanlan.zhihu.com/p/133 ...

  7. 面向动态环境基于面元的RGB-D SLAM系统

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L https://zhuanlan.zhihu.com/p/142175916 本 ...

  8. python鱼眼图像识别_一种融合鱼眼图像与深度图像的动态环境视觉里程计方法与流程...

    本发明涉及移动机器人同步定位与地图构建(SLAM)技术领域,尤其是适用于动态环境的基于鱼眼图像与深度图像的视觉里程计方法. 背景技术: 定位技术是移动机器人实现各项复杂任务的技术基础.里程计便是一类简 ...

  9. 演示:混合配置基于Linux winows cisco环境动态路由

    演示:混合配置基于Linux winows cisco环境动态路由 (使用GNS3+VM完全可以一台物理计算机上完成所有实验) 配套演示录像:http://edu.51cto.com/course/c ...

最新文章

  1. Directx教程(24) 简单的光照模型(3)
  2. python在线-python+在线
  3. [转]C++/CLI与C#常用语法对比
  4. cacti监控一览无余
  5. C++ Primer 5th笔记(3)字符串、向量和数组:字符串
  6. 为工厂分配用于公司间Invoice的销售范围
  7. 使用TestContainers进行数据库测试
  8. [SDOI2016]排列计数
  9. (王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)
  10. Windows中命令提示符被禁用的解决方法
  11. java图形界面关键字_怎样用Java编写一个图形界面,要求可以利用关键词查询txt中的内容...
  12. C#之float数组转字节流
  13. 综合能源系统通用建模及规划方法研究—笔记
  14. iconfont图标
  15. 成长就是不断升级自己的认知
  16. 安装CDH6.3版本的时候遇到 ‘ERROR main:com.cloudera.server.cmf.Main: Server failed’的解决方案
  17. 高斯过程动态模型(GPDM)简析
  18. when I want to have a rest
  19. 7-2 高精度求累加和 分数 25作者 胡伟平单位 广西科技大学
  20. 考试科目C语言缩写,全国计算机专业统考 考试科目都有什么

热门文章

  1. 拒绝服务攻击的常见类型
  2. 软件工程课程设计“作业管理系统”的总结和期望
  3. 【机器学习】深度学习的三个概念:Epoch, Batch, Iteration
  4. 视频直播LiveGo测试环境搭建
  5. C#测量程序设计中导线坐标推算
  6. c++中[Error] cin was not declared in this scope 是什么意思
  7. 计算机图形与几何书籍清单
  8. 计算:单纯形法求解线性规划问题
  9. 一文看懂三星的中国AI战略 依靠Bixby和平台攻城拔寨
  10. 《你被色到了吗》色彩理论大集结