SpringBoot中的多环境配置管理
SpringBoot中的多环境配置管理
文章目录
- SpringBoot中的多环境配置管理
- SpringBoot中的多环境配置管理
- 多环境配置的概述
- 1. 为什么需要多环境配置?
- 2. Spring Boot 中如何实现多环境配置?
- 3. 多环境配置的应用场景
- 4. 如何实现配置隔离?
- Spring Boot 中的配置文件管理
- 1. 配置文件的类型
- 2. 配置文件的基本结构
- 3. 配置文件的优先级与加载顺序
- 4. Profile 和配置文件的切换
- 5. 配置文件的外部化
- 6. 敏感信息的管理
- 7. 多环境配置的最佳实践
- 使用 Profiles 管理不同环境配置
- 1. 什么是 Profile?
- 2. 如何使用 Profiles 管理环境配置?
- 2.1 定义和激活 Profile
- 2.2 根据 Profile 加载配置文件
- 3. 使用 @Profile 注解在代码中区分不同环境
- 4. 配置文件的优先级与覆盖
- 5. Spring Boot Profile 的常见实践
- Spring Boot 配置的外部化
- 1. 外部化配置的概念
- 2. 外部化配置的常见方式
- 2.1 使用外部配置文件
- 2.2 使用环境变量
- 2.3 通过命令行参数
- 2.4 使用 Spring Cloud Config
- 3. 优先级与加载顺序
- 4. 敏感信息的外部化
- 5. 配置文件的分层管理
- 不同环境配置的实现
- 1. Spring Boot 配置文件的多环境管理
- 1.1 Profile 的概念
- 1.2 不同环境的配置文件
- 1.3 Profile 的激活
- 1.4 配置文件的加载顺序
- 2. 环境特定配置的管理
- 2.1 开发环境配置 (application-dev.properties)
- 2.2 生产环境配置 (application-prod.properties)
- 2.3 测试环境配置 (application-test.properties)
- 3. 配置的外部化
- 配置文件加密与敏感数据保护
- 1. 敏感数据保护的需求
- 2. 配置文件加密的策略
- 3. Spring Boot 配置文件的加密
- 4. Jasypt 配置文件加密
- 4.1 引入 Jasypt 依赖
- 4.2 加密配置属性
- 4.3 在配置文件中使用加密后的数据
- 4.4 配置解密
- 5. 使用 Spring Cloud Config 与 Vault 保护敏感数据
- 5.1 配置 Vault
- 5.2 Spring Cloud Config 集成 Vault
- 5.3 从 Vault 获取配置
- 6. 环境变量加密配置
SpringBoot中的多环境配置管理
在开发实际的 Java 应用时,通常会遇到不同的运行环境,比如开发环境、测试环境和生产环境。每个环境都有不同的配置需求,例如数据库连接信息、服务端口、日志级别等。如果我们没有一个灵活的机制来区分和管理这些不同环境下的配置,代码中的配置就会变得混乱且不易维护。

Spring Boot 提供了强大的多环境配置管理功能,能够帮助我们根据不同的环境加载不同的配置文件,从而让应用在不同的环境下能保持一致性和灵活性。通过合理使用 Spring Boot 的 Profile 功能,我们可以在开发、测试和生产等不同环境中,动态地切换配置,避免了硬编码配置的麻烦,提高了系统的可维护性。
多环境配置的概述
在开发和部署应用程序时,通常会遇到多个不同的运行环境,例如开发环境、测试环境和生产环境。这些环境之间的差异主要体现在配置上,包括数据库连接、服务端口、日志级别、API 密钥等。为了更好地管理这些差异,Spring Boot 提供了多环境配置的机制,允许在不同的环境下加载不同的配置文件,从而使应用在各个环境中保持灵活性和一致性。

1. 为什么需要多环境配置?
多环境配置的需求来源于应用在不同阶段和环境中可能需要不同的设置。比如:
● 开发环境:我们通常使用本地的数据库、较低的日志级别、调试信息等。
● 测试环境:需要连接到测试数据库,执行一些集成测试,可能会使用一些测试专用的配置。
● 生产环境:生产环境中的数据库通常需要更高的安全性和性能,日志级别也可能需要调整为较低的日志记录级别,以提高系统性能。
通过将这些配置分开,我们能够更好地管理应用程序,并确保它在不同环境下的表现符合预期。
2. Spring Boot 中如何实现多环境配置?
Spring Boot 通过 Profiles 来支持多环境配置,允许在不同环境中加载不同的配置文件。每个配置文件可以针对不同的环境做出定制,比如:
● application.properties 或 application.yml:这是 Spring Boot 默认的配置文件。
● application-dev.properties 或 application-dev.yml:用于开发环境的配置文件。
● application-prod.properties 或 application-prod.yml:用于生产环境的配置文件。
Spring Boot 通过 spring.profiles.active 属性来标记当前使用的配置文件,动态切换不同的环境配置。
3. 多环境配置的应用场景
● 开发:在开发过程中,通常会使用本地数据库、调试模式和其他开发工具的配置。
● 测试:集成测试、单元测试等需要连接测试环境的数据库或第三方服务,并根据测试要求配置环境。
● 生产:生产环境通常需要更高的安全性和性能配置,比如使用外部服务、生产级数据库连接、严格的日志管理等。
4. 如何实现配置隔离?
在 Spring Boot 中,可以通过以下方式实现不同环境的配置隔离:
● Profile 区分配置:使用 @Profile 注解或在配置文件中通过 application-{profile}.properties 来区分环境。
● 外部化配置:Spring Boot 支持将配置放在外部文件或系统环境变量中,从而使得每个环境的配置不需要硬编码到应用中。
Spring Boot 中的配置文件管理
在 Spring Boot 中,配置文件是管理应用程序设置的关键部分。Spring Boot 提供了一种简单而灵活的方式来处理配置,支持多种配置格式、层次结构、环境隔离等特性。

1. 配置文件的类型
Spring Boot 默认支持两种配置文件格式:
● application.properties:这是传统的 Java 属性文件格式,每个配置项以 key=value 的形式存在。
● application.yml:YAML 格式的配置文件,比 properties 格式更具层次性和可读性,尤其对于结构化数据的表示非常方便。
这些文件可以存放在项目的 src/main/resources 目录下,并且可以根据不同的环境进行灵活管理。
2. 配置文件的基本结构
● application.properties 示例:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
● application.yml 示例:
server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: secret
YAML 格式通过层级缩进来表示结构,能够更清晰地组织和表达配置数据。
3. 配置文件的优先级与加载顺序
Spring Boot 在启动时会按照一定的顺序加载配置文件,配置文件的加载优先级依次递增:
-
命令行参数:通过命令行传入的参数优先级最高。
-
application.properties或application.yml:项目中的配置文件,默认加载。 -
外部配置文件:可以通过
spring.config.location指定外部的配置文件路径。 -
环境变量:如果没有在配置文件中找到某项配置,Spring Boot 会查找环境变量。
-
Java System 属性:如 -D 参数传入的系统属性。
4. Profile 和配置文件的切换
在 Spring Boot 中,Profile 是一种用于标识不同运行环境的机制,可以帮助我们在不同的环境下加载不同的配置。
● 指定 Profile:可以在 application.properties 或 application.yml 中使用 spring.profiles.active 属性指定当前的运行环境(如开发、测试、生产等)。
spring.profiles.active=dev
● 环境特定的配置文件:可以创建专门为某个环境定制的配置文件,如 application-dev.properties、application-prod.properties。这些文件会根据当前活动的 Profile 被自动加载。
○ application-dev.properties 示例:
spring.datasource.url=jdbc:mysql://dev-db:3306/mydb
○ application-prod.properties 示例:
spring.datasource.url=jdbc:mysql://prod-db:3306/mydb
5. 配置文件的外部化
Spring Boot 允许将配置文件外部化,避免硬编码在应用中。常见的外部化方式有:
● 通过命令行参数指定:
java -jar myapp.jar --spring.config.location=file:/path/to/application.properties
● 通过环境变量指定:在容器化应用中(如 Docker),可以通过环境变量来指定配置。
● 配置文件路径的优先级:spring.config.location 和 spring.config.name 可以用于指定文件的位置和名称。
6. 敏感信息的管理
在配置文件中,可能会涉及到敏感信息(如数据库密码、API 密钥等)。Spring Boot 提供了多种方式来保护这些敏感配置:
● 加密配置:使用 jasypt-spring-boot 等工具来加密配置文件中的敏感信息。
● 环境变量管理:将敏感信息放在系统环境变量中,而非配置文件中。
7. 多环境配置的最佳实践
在 Spring Boot 项目中,推荐使用如下方式来管理多环境配置:
-
使用不同的配置文件:为不同的环境(如开发、测试、生产)创建不同的配置文件,并通过
spring.profiles.active动态切换。 -
外部化配置:配置文件放置在项目之外,通过命令行、环境变量等方式动态传入,避免将敏感信息和配置暴露在代码中。
-
减少重复配置:利用 Spring Boot 提供的配置继承和共享功能,减少不同环境中重复配置的量。
-
集中管理敏感配置:使用配置中心(如 Spring Cloud Config)集中管理敏感信息和环境配置。
使用 Profiles 管理不同环境配置
在开发和部署应用程序时,通常会遇到不同的运行环境,例如开发环境、测试环境、生产环境等。每个环境的配置需求往往不同,比如数据库连接、服务端口、日志级别等。为了在不同的环境中灵活地加载和管理配置,Spring Boot 提供了 Profiles 功能来实现多环境配置的管理。
1. 什么是 Profile?
Spring Boot 的 Profile 是一种标识和管理不同环境的机制,可以根据当前激活的 Profile 来加载不同的配置文件或配置项。通过 Profile,开发者可以在开发、测试、生产等多个环境中维护不同的配置,避免在同一个配置文件中管理所有环境的配置。
2. 如何使用 Profiles 管理环境配置?
2.1 定义和激活 Profile
Profile 是通过 @Profile 注解或者通过配置文件来激活的。在 Spring Boot 中,可以通过两种方式来指定当前使用的 Profile:
- 在配置文件中设置: 在
application.properties或application.yml文件中,可以通过spring.profiles.active来设置当前激活的 Profile。
# application.properties
spring.profiles.active=dev
或者,在 application.yml 中设置:
spring:profiles:active: dev
这里,dev 就是当前激活的 Profile。
- 通过命令行参数激活: 在启动应用时,可以通过命令行传入
-Dspring.profiles.active参数来指定 Profile。例如:
java -jar myapp.jar --spring.profiles.active=prod
- 通过环境变量激活: 还可以通过系统环境变量
SPRING_PROFILES_ACTIVE来指定激活的 Profile。例如,在 Linux 或 macOS 中:
export SPRING_PROFILES_ACTIVE=prod
然后启动应用。
2.2 根据 Profile 加载配置文件
Spring Boot 会根据当前激活的 Profile 来加载对应的配置文件。例如,假设你有多个不同环境的配置文件:
● application-dev.properties:开发环境配置
● application-prod.properties:生产环境配置
● application-test.properties:测试环境配置
如果在 application.properties 或 application.yml 中配置了 spring.profiles.active=dev,那么 Spring Boot 会加载 application-dev.properties 文件中的配置。不同的 Profile 可以有不同的配置文件,Spring Boot 会根据激活的 Profile 加载与之匹配的配置文件。
3. 使用 @Profile 注解在代码中区分不同环境
除了在配置文件中使用 Profile,Spring Boot 还允许我们在代码中使用 @Profile 注解来根据 Profile 的激活与否选择是否加载某些 Bean。例如:
@Configuration
@Profile("dev")
public class DevConfig {@Beanpublic DataSource dataSource() {// 开发环境的数据源配置return new DataSource("dev-db-url");}
}
@Configuration
@Profile("prod")
public class ProdConfig {@Beanpublic DataSource dataSource() {// 生产环境的数据源配置return new DataSource("prod-db-url");}
}
在上面的示例中,只有当 dev Profile 被激活时,DevConfig 中的配置才会生效;只有当 prod Profile 被激活时,ProdConfig 中的配置才会生效。
4. 配置文件的优先级与覆盖
在多个配置文件中,如果有相同的配置项,Spring Boot 会根据文件的加载顺序和 Profile 的优先级来决定最终的配置值。例如:
-
application.properties:所有环境通用的配置。
-
application-dev.properties:开发环境专用配置。
-
application-prod.properties:生产环境专用配置。
如果在 application.properties 中配置了 server.port=8080,在 application-prod.properties 中配置了 server.port=80,并且激活了 prod Profile,那么最终的端口配置会使用 application-prod.properties 中的 server.port=80。
5. Spring Boot Profile 的常见实践
● 使用环境变量:通过环境变量来设置不同的 Profile,可以方便地在不同的部署环境中切换配置。
● 配置多套数据库连接:开发环境使用本地数据库,生产环境使用生产数据库,测试环境使用专门的测试数据库。可以通过不同的 Profile 文件来配置不同的数据库连接。
● 不同的日志级别配置:在开发环境中,可能需要更详细的日志信息,而生产环境则需要更简洁的日志,以提高性能。通过 Profile 可以灵活配置不同的日志级别。
● 外部配置管理:可以通过外部的配置文件来管理环境配置,使得应用可以在不同环境下保持一致性,尤其适合容器化和微服务架构中的配置管理。
Spring Boot 配置的外部化
Spring Boot 提供了灵活的配置机制,可以轻松将应用程序的配置外部化,避免将敏感信息(如数据库密码、API 密钥等)硬编码在代码中。外部化配置不仅可以使应用程序更具可维护性,还能提高灵活性和安全性。尤其在容器化、微服务架构中,外部化配置变得尤为重要。
1. 外部化配置的概念
外部化配置指的是将应用程序的配置从代码中分离出来,将其存储在外部位置(如文件、环境变量、配置服务器等)。Spring Boot 支持从多种外部源加载配置,这样就可以避免每次更改配置时都需要重新构建和部署应用程序。
2. 外部化配置的常见方式
Spring Boot 提供了多种外部化配置的方式,可以根据需求选择合适的方法。
2.1 使用外部配置文件
Spring Boot 支持将配置文件放在项目外部,或者通过命令行传入外部配置。常见的做法是使用 application.properties 或 application.yml,并将其存放在外部目录。
- 通过命令行参数指定配置文件路径:可以通过
--spring.config.location参数指定配置文件的路径。例如,在启动命令中指定配置文件:
java -jar myapp.jar --spring.config.location=file:/path/to/application.properties
- 通过环境变量指定配置文件路径:使用环境变量来指定配置文件的位置。在 Linux 或 macOS 中:
export SPRING_CONFIG_LOCATION=/path/to/application.properties
java -jar myapp.jar
2.2 使用环境变量
Spring Boot 支持通过操作系统的环境变量来覆盖配置文件中的设置。环境变量的优先级高于配置文件中的属性,特别适合用于存储敏感信息或在生产环境中动态配置参数。
● 通过环境变量配置数据库连接:
export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=secret
这些环境变量会覆盖 application.properties 文件中的相应配置。
2.3 通过命令行参数
Spring Boot 允许在启动应用时通过命令行参数传递配置值,命令行参数的优先级最高。例如:
java -jar myapp.jar --server.port=8081 --spring.datasource.url=jdbc:mysql://localhost:3306/testdb
这将覆盖 application.properties 中的相应配置。
2.4 使用 Spring Cloud Config
对于复杂的微服务架构,Spring Cloud 提供了配置中心(Spring Cloud Config)来集中管理和外部化配置。配置中心可以将所有应用的配置统一存储在 Git 仓库、数据库或文件系统中,并通过 HTTP 服务提供给应用使用。
- 配置中心的工作原理:
○ 应用从 Spring Cloud Config 服务器拉取配置。
○ 配置可以按环境、按应用进行划分,支持动态刷新和更新。
- 配置中心的优势:
○ 集中管理:多个微服务共享配置,统一管理。
○ 动态刷新:通过 Spring Cloud Bus 可以实现配置的动态刷新,无需重启应用。
○ 版本控制:通过 Git 实现配置的版本控制。
3. 优先级与加载顺序
Spring Boot 会按照一定的优先级加载配置项,如果不同来源的配置项有重复,后加载的配置将覆盖前加载的配置。配置的加载顺序如下:
-
命令行参数:优先级最高。
-
application.properties或application.yml:项目中的配置文件。 -
外部配置文件:通过 spring.config.location 指定的外部配置文件。
-
环境变量:操作系统的环境变量。
-
系统属性:如 -D 参数传入的系统属性。
因此,如果在不同的位置配置了相同的属性,Spring Boot 会使用优先级更高的配置。
4. 敏感信息的外部化
为了确保应用程序的安全性,敏感信息(如数据库密码、API 密钥等)不应该存储在版本控制系统中。Spring Boot 提供了以下几种方式来处理敏感信息:
● 环境变量:将敏感信息存储在环境变量中,而不是硬编码在配置文件中。
● 加密配置:使用加密工具,如 Jasypt,加密配置文件中的敏感信息,然后在运行时解密。
例如,使用 Jasypt 加密 application.properties 文件中的数据库密码:
spring.datasource.password=ENC(encrypted_password)
5. 配置文件的分层管理
为了管理不同环境下的配置,Spring Boot 允许根据不同的 Profile 使用不同的配置文件。例如,可以为开发、测试、生产环境创建不同的配置文件,Spring Boot 会根据当前激活的 Profile 加载相应的配置。
● application-dev.properties:开发环境配置。
● application-prod.properties:生产环境配置。
● application-test.properties:测试环境配置。
激活 Profile 后,Spring Boot 会自动加载相应的配置文件:
# application.properties
spring.profiles.active=dev
或者,通过命令行参数指定 Profile:
java -jar myapp.jar --spring.profiles.active=prod
不同环境配置的实现
在实际的开发和部署中,应用程序通常需要在多个环境中运行,例如开发环境、测试环境和生产环境。每个环境的配置通常会有所不同,如数据库连接、缓存配置、日志级别等。Spring Boot 提供了多种方式来管理和切换不同环境的配置,以便在不修改代码的情况下,能够根据环境的不同自动加载对应的配置。
1. Spring Boot 配置文件的多环境管理
Spring Boot 允许通过使用不同的配置文件来管理不同环境的配置。我们可以为每个环境创建独立的配置文件,并通过 Profile 来指定当前激活的环境。Spring Boot 会根据激活的 Profile 加载对应的配置文件。
1.1 Profile 的概念
Profile 是 Spring 框架的一种机制,用于标识和区分不同的环境。通过 Profile,可以在开发环境、测试环境和生产环境之间切换配置,确保每个环境有合适的配置。
1.2 不同环境的配置文件
Spring Boot 通过 application.properties 或 application.yml 文件来存储配置。为了支持多环境配置,我们可以创建多个配置文件,按照环境的不同进行区分。
● application.properties 或 application.yml:用于存储通用配置。
● application-dev.properties 或 application-dev.yml:用于开发环境配置。
● application-prod.properties 或 application-prod.yml:用于生产环境配置。
● application-test.properties 或 application-test.yml:用于测试环境配置。
1.3 Profile 的激活
要使用不同的配置文件,必须激活相应的 Profile,Spring Boot 提供了几种激活 Profile 的方式:
- 通过
spring.profiles.active设置:可以在application.properties或application.yml中通过spring.profiles.active属性来指定激活的 Profile。例如:
# application.properties
spring.profiles.active=dev
或者在 application.yml 中:
spring:profiles:active: dev
- 通过命令行参数激活:可以在启动应用时通过命令行传递 --spring.profiles.active 来激活 Profile:
java -jar myapp.jar --spring.profiles.active=prod
- 通过环境变量激活:可以通过设置操作系统的环境变量来激活 Profile。例如,在 Linux 或 macOS 中:
export SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar
- 通过 @Profile 注解激活:在 Java 类中使用 @Profile 注解,只有当指定的 Profile 被激活时,相关的 Bean 才会被加载:
@Configuration
@Profile("dev")
public class DevConfig {@Beanpublic DataSource dataSource() {return new DataSource("jdbc:mysql://localhost:3306/devdb");}
}
1.4 配置文件的加载顺序
Spring Boot 会根据 Profile 的优先级顺序加载配置文件:
-
application.properties或application.yml:这是全局的配置文件,适用于所有环境。 -
application-{profile}.properties或application-{profile}.yml:根据激活的 Profile 加载相应的配置文件。例如,如果激活的是 dev Profile,则加载application-dev.properties文件中的配置。 -
命令行参数和环境变量:如果配置文件中存在重复的属性,命令行参数和环境变量的值会覆盖配置文件中的值。
2. 环境特定配置的管理
为了更好地管理不同环境的配置,常见的做法是将敏感信息和环境特定的配置如数据库连接、第三方服务的 API 密钥、日志级别等单独管理。
2.1 开发环境配置 (application-dev.properties)
开发环境中的配置通常比较宽松,适合进行调试和测试。常见的开发环境配置有:
●数据库连接:使用本地数据库或开发环境的数据库。
●日志级别:通常设置为 DEBUG,以便在开发过程中查看详细的日志信息。
●缓存配置:开发环境可能不需要使用高性能的缓存,或者使用本地缓存。
# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/devdb
spring.datasource.username=dev_user
spring.datasource.password=dev_password
logging.level.root=DEBUG
2.2 生产环境配置 (application-prod.properties)
生产环境配置需要更加严格和高效,通常包括:
●数据库连接:连接生产数据库,通常使用更高效、稳定的数据库连接池。
●日志级别:生产环境通常设置为 INFO 或 WARN,以减少日志量,避免暴露敏感信息。
●安全配置:生产环境可能需要配置更严格的安全措施,如 HTTPS、API 密钥等。
# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db-server:3306/proddb
spring.datasource.username=prod_user
spring.datasource.password=prod_password
logging.level.root=INFO
2.3 测试环境配置 (application-test.properties)
测试环境中的配置主要用于单元测试和集成测试,通常包括:
●使用测试数据库(如 H2 数据库)或内存数据库。
●配置测试特定的日志级别和性能参数。
●配置模拟服务或 Mock 数据。
# application-test.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=test_user
spring.datasource.password=test_password
logging.level.root=DEBUG
3. 配置的外部化
对于一些敏感数据(如数据库密码、API 密钥等),可以将配置外部化到环境变量、命令行参数或配置服务器中,避免将敏感信息写入配置文件。Spring Boot 支持从环境变量、JNDI、命令行参数、Spring Cloud Config 等多种外部化方式读取配置。
配置文件加密与敏感数据保护
在现代应用程序中,配置文件通常包含敏感数据,如数据库密码、API 密钥、用户名等。如果这些信息被泄露,可能会导致严重的安全问题。因此,如何保护配置文件中的敏感数据,是开发和运维过程中必须关注的重点。Spring Boot 提供了多种方式来加密配置文件中的敏感数据,确保在使用配置文件时,不会暴露敏感信息。
1. 敏感数据保护的需求
在开发和生产环境中,敏感数据的保护尤为重要。常见的敏感数据包括:
● 数据库密码、用户名
● 第三方 API 密钥
● OAuth2 客户端密钥
● 访问令牌(Access Token)
为了防止敏感数据的泄露,我们通常会采取加密手段,确保即使配置文件被非法访问,也无法获取敏感信息。
2. 配置文件加密的策略
加密配置文件中的敏感数据,常见的方式有:
-
对称加密:使用相同的密钥对敏感数据进行加密和解密。常见的对称加密算法有 AES(高级加密标准)。这种方式要求在应用程序启动时,通过安全的方式提供解密密钥。
-
非对称加密:使用公钥加密,私钥解密。适用于需要更高安全性的场景,通常用于数据交换和密钥管理。
-
基于属性的加密:仅对配置文件中的特定属性进行加密。例如,可以只加密数据库连接字符串中的密码部分,而保留其他非敏感信息明文。
3. Spring Boot 配置文件的加密
Spring Boot 并没有直接提供加密配置文件的功能,但可以通过结合第三方库来实现加密。常用的加密方案包括:
● Jasypt(Java Simplified Encryption):这是一个开源的加密工具,可以用来加密配置文件中的敏感数据。它支持对属性进行加密和解密,并提供简单的集成方式。
● Spring Cloud Config + Vault:Spring Cloud Config 提供了集中式配置管理,Vault 是 HashiCorp 提供的安全工具,专门用于存储和保护敏感数据。结合 Vault 和 Spring Cloud Config,可以有效地加密配置文件中的敏感信息。
4. Jasypt 配置文件加密
Jasypt 是 Java 中最常用的加密工具之一,它提供了易于集成的加密方案,适合用来加密 Spring Boot 配置文件中的敏感信息。
4.1 引入 Jasypt 依赖
首先,在 pom.xml 中添加 Jasypt 的依赖:
<dependency><groupId>org.jasypt</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>
4.2 加密配置属性
使用 Jasypt 加密属性时,首先需要对敏感数据进行加密。可以通过 Jasypt 提供的工具进行加密,示例如下:
import org.jasypt.util.text.BasicTextEncryptor;public class EncryptPassword {public static void main(String[] args) {BasicTextEncryptor encryptor = new BasicTextEncryptor();encryptor.setPassword("secretKey"); // 设置加密密钥String encryptedPassword = encryptor.encrypt("myPassword123"); // 加密敏感信息System.out.println(encryptedPassword);}
}
4.3 在配置文件中使用加密后的数据
将加密后的密码放入 application.properties 或 application.yml 中,格式为 ENC(…):
spring.datasource.password=ENC(1y2l1G0Uht9HgddKxsT8Tg==)
4.4 配置解密
在 Spring Boot 启动时,Jasypt 会自动解密这些加密过的配置项。为此,需要在 application.properties 中配置解密所需的密钥:
jasypt.encryptor.password=secretKey
当 Spring Boot 启动时,它会使用 secretKey 来解密配置文件中的敏感数据,并将其加载到 Spring 环境中。
5. 使用 Spring Cloud Config 与 Vault 保护敏感数据
Spring Cloud Config 与 HashiCorp Vault 是用于集中式配置和敏感数据存储的强大工具。Vault 提供了一个安全的存储库,用于存储应用程序的敏感数据,如 API 密钥、数据库凭证等。Spring Cloud Config 可以与 Vault 集成,以便在应用程序启动时从 Vault 中读取敏感配置。
5.1 配置 Vault
首先,您需要设置 Vault 服务器,并将敏感数据存储到 Vault 中。例如,将数据库密码存储为一个密钥:
vault kv put secret/myapp/db password="my-secret-password"
5.2 Spring Cloud Config 集成 Vault
在 application.properties 中配置 Vault 作为配置源:
spring.cloud.config.uri=http://localhost:8888 # Spring Cloud Config 服务器的地址
spring.cloud.config.server.vault.backend=secret # 配置 Vault 密钥后端
spring.cloud.config.server.vault.default-context=myapp
5.3 从 Vault 获取配置
当应用程序启动时,Spring Cloud Config 会自动从 Vault 中加载敏感数据,而不会暴露敏感数据在配置文件中。例如,password 就会从 Vault 中安全地加载,而不会被硬编码在配置文件里。
6. 环境变量加密配置
在某些情况下,环境变量是一个比配置文件更安全的存储敏感信息的方式。例如,可以通过 CI/CD 系统或 Docker 等平台将密钥和密码设置为环境变量,这样它们不会出现在配置文件或源代码中。
Spring Boot 支持通过环境变量读取配置:
spring.datasource.password=${DB_PASSWORD}
通过 export DB_PASSWORD=my-secret-password 来设置环境变量,Spring Boot 会在启动时读取该值。
相关文章:
SpringBoot中的多环境配置管理
SpringBoot中的多环境配置管理 文章目录 SpringBoot中的多环境配置管理SpringBoot中的多环境配置管理 多环境配置的概述1. 为什么需要多环境配置?2. Spring Boot 中如何实现多环境配置?3. 多环境配置的应用场景4. 如何实现配置隔离? Spring B…...
mac下生成.icns图标
笔记原因: 今日需要在mac下开发涉及图标文件的使用及icons文件的生成,所以记录一下。 网络上都是一堆命令行需要打印太麻烦了,写一个一键脚本。 步骤一 将需要生成的png格式文件重命名为“pic.png” mv xxxx.png pic.png 步骤二 下载我…...
关于JS继承的七种方式和理解
1.原型链继承 function Fun1() {this.name parentthis.play [1, 2, 3] } function Fun2() {this.type child }Fun2.prototype new Fun1()let s1 new Fun2() let s2 new Fun2() s1.play.push(4) console.log(s1.play, s2.play) // [1, 2, 3, 4] [1, 2, 3, 4]可以看到两个…...
储能系统-系统架构
已更新系列文章包括104、61850、modbus 、单片机等,欢迎关注 IEC61850实现方案和测试-1-CSDN博客 快速了解104协议-CSDN博客 104调试工具2_104协议调试工具-CSDN博客 1 电池储能系统(BESS) 架构 电池储能系统主要包括、电池、pcs、本地控制…...
AI智算-k8s部署DeepSeek Janus-Pro-7B 多模态大模型
文章目录 简介环境依赖模型下载下载Janus库GPU环境镜像模型manifest调用Janus多模态文生图 简介 DeepSeek Janus Pro 作为一款强大的多模态理解与生成框架,正在成为研究人员和开发者的热门选择。本文将详细介绍如何在云原生k8s环境中部署配置和使用 DeepSeek Janus…...
【截图】selenium自动通过浏览器截取指定元素div的图片
【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…...
如何导入第三方sdk | 引入第三方jar 包
0. 背景1. 上传私有仓库2. 使用本地文件系统 0. 背景 对接一些第三方功能,会拿到第三方的sdk,也就是jar包,如何导入呢 1. 上传私有仓库 最好的方式就是将第三方jar包,上传到私有的仓库,这样直接正常在pom引用即可如果只…...
HarmonyOS 5.0应用开发——ContentSlot的使用
【高心星出品】 文章目录 ContentSlot的使用使用方法案例运行结果 完整代码 ContentSlot的使用 用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。 支持混合模式开发,当容器是ArkTS组件,子组件在Native侧创建时&#…...
C#常用集合优缺点对比
先上结论: 在C#中,链表、一维数组、字典、List<T>和ArrayList是常见的数据集合类型,它们各有优缺点,适用于不同的场景。以下是它们的比较: 1. 一维数组 (T[]) 优点: 性能高:数组在内存中…...
基于CLIP视觉语言大模型的行人重识别方法的简单框架设计
以下是一个基于CLIP视觉语言大模型的行人重识别方法的简单框架设计,用于数据集测试。我们将使用torch和clip库,假设数据集是一个包含行人图像的文件夹结构,每个子文件夹代表一个行人身份。 步骤概述 安装必要的库加载CLIP模型定义数据集类提…...
RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)
文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8(例如en…...
BurpSuite抓包与HTTP基础
文章目录 前言一、BurpSuite1.BurpSuite简介2.BurpSuite安装教程(1)BurpSuite安装与激活(2)安装 https 证书 3.BurpSuite使用4.BurpSuite资料 二、图解HTTP1.HTTP基础知识2.HTTP客户端请求消息3.HTTP服务端响应消息4.HTTP部分请求方法理解5.HTTPS与HTTP 总结 前言 在网络安全和…...
SQL Server 数据库迁移到 MySQL 的完整指南
文章目录 引言一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据 二、迁移工具的选择2.1 使用 MySQL Workbench2.2 使用第三方工具2.3 手动迁移 三、迁移步骤3.1 导出 SQL Server 数据库结构3.2 转换数据类型和语法3.3 导入 MySQL 数据库3.4 迁移数据3.5 迁移存…...
【大模型】DeepSeek与chatGPT的区别以及自身的优势
目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…...
DeepSeek:知识图谱与大模型参数化知识融合的创新架构
引言:AI 领域的融合趋势 在目前大模型与知识图谱作为两个重要的研究方向,各自展现出了强大的能力与潜力。大模型,凭借其在海量数据上的深度训练,拥有强大的语言理解与生成能力,能够处理多种自然语言处理任务࿰…...
ES6 迭代器 (`Iterator`)使用总结
Iterator(迭代器)是 ES6 引入的一种 接口,用于 顺序访问 可迭代对象(Array、Set、Map、String、arguments、自定义对象等)。 Iterator(迭代器)的作用有三个: 为各种数据结构提供一个…...
信用修复和失联修复的区别
失联修复和信用修复是两个不同的概念,在目的、操作方式和应用场景上都有所区别。 失联修复 失联修复主要是指在金融催收行业中,当债务人的联系方式(通常是手机号码)发生改变,导致无法联系到债务人时,催收公…...
2025蓝桥杯JAVA编程题练习Day3
1.黛玉泡茶【算法赛】 问题描述 话说林黛玉闲来无事,打算在潇湘馆摆个茶局,邀上宝钗、探春她们一起品茗赏花。黛玉素来讲究,用的茶杯也各有不同,大的小的,高的矮的,煞是好看。这不,她从柜子里…...
[论文阅读] Knowledge Fusion of Large Language Models
Knowledge Fusion of Large Language Models (FuseLLM) Methodology 整体Pipeline如下图所示 不同的动物代表不同的LLM。左边第一,第二分别是Ensemble以及Weight Merging方法。最右侧为本文提出的FuseLLM。 Ensemble: 融合多个models的预测结果,比如…...
deepseek来讲lua
Lua 是一种轻量级、高效、可嵌入的脚本语言,广泛应用于游戏开发、嵌入式系统、Web 服务器等领域。以下是 Lua 的主要特点和一些基本概念: 1. 特点 轻量级:Lua 的核心非常小,适合嵌入到其他应用程序中。高效:Lua 的执…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
