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 的执…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...