一、简介
Spring Cloud Config 是一个库,可以轻松地将Spring 应用程序的配置外部化。它允许我们将配置数据公开为服务,从而可以轻松地从任何其他具有HTTP 客户端的应用程序中获取。
在本教程中,我们将了解如何在没有git 的情况下使用Spring Cloud Config。
2. Spring Cloud 配置概述
Spring Cloud Config 库是一个典型的客户端-服务器模型。一个集中式服务器(或多个服务器)从一些外部数据源读取配置数据。这些服务器公开各种HTTP 端点,允许任何其他应用程序查询配置数据。
Spring Cloud 配置概述
Spring Cloud Config 还使得从Spring Boot 应用程序自动连接到配置服务器变得非常容易。然后可以像使用客户端应用程序中的任何其他属性源一样使用服务器提供的配置数据。
3. Git 提供者
Spring Cloud Config 最常见的用例是将配置数据存储在git 存储库中。这种类型的设置有几个优点:
灵活性:一个git 存储库可以保存各种文件类型,包括二进制文件。
安全性:易于在粒度级别控制读写访问。
审计:强大的历史跟踪允许轻松审计配置更改。
标准化:无论提供商如何,Git 操作都是标准的,这意味着我们可以自托管或使用任意数量的第三方提供商。
分布式:Git 从一开始就是为分布式而设计的,因此非常适合云原生和微服务架构。
然而,尽管上面列出了所有好处,git 可能并不总是存储配置数据的最佳选择。例如,我们的组织可能已经将配置数据放在另一个数据存储中,例如关系数据库。在这种情况下,将其迁移到git 可能不值得。
在下一节中,我们将仔细研究在没有git 的情况下使用Spring Cloud Config。
4. 在没有Git 的情况下使用Spring Cloud Config
当我们谈论在Spring Cloud Config 中使用git 以外的东西时,我们实际上指的是服务器组件。我们对数据存储的选择不会影响客户端组件。只有服务器受到影响。
在Spring Cloud Config Server 库中,有一个名为EnvironmentRepository
的接口,用于定义配置源。所有配置源,无论是git 还是其他,都必须实现这个接口。
让我们看一些提供的实现。
3.1 文件系统
Spring Cloud Config 支持使用文件系统作为配置源。要启用此功能,我们必须在配置服务器的application.properties
文件中指定以下值:
spring.cloud.config.server.native.search-locations=resources/other.properties
默认情况下,搜索位置采用类路径资源。如果我们想使用任意文件,我们只需包含一个文件资源前缀:
spring.cloud.config.server.native.search-locations=file:///external/path/other.properties
除了此属性之外,配置服务器还需要在启用本机配置文件的情况下运行:
-Dspring.profiles.active=native
重要的是要记住,当使用文件系统配置源时,我们需要确保文件系统在配置服务器将运行的任何地方都可用。这可能意味着使用分布式文件系统,例如NFS。
3.2. JDBC
Spring Cloud Config 还可以使用关系数据库通过JDBC 加载配置数据。这是通过JdbcEnvironmentRepository
类完成的。要启用这个类,我们必须遵循几个步骤。
首先,spring-jdbc
库必须存在于类路径中。如果我们已经在使用Spring Data JDBC或其他依赖库,那么它已经存在。否则,我们总是可以手动指定它:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency>
其次,我们需要指定如何连接数据库:
spring.datasource.url=jdbc:mysql://dbhost:3306/springconfig spring.datasource.username=dbuser spring.datasource.password=dbpassword spring.datasource.driver-class-name=com.mysql.jdbc.Driver
在这种情况下,我们使用MySQL,但任何符合JDBC 的驱动程序都可以工作。
接下来,数据库必须包含一个名为PROPERTIES
的表,该表具有以下列:
应用
轮廓
标签
钥匙
价值
最后,我们需要为配置服务器指定JDBC 配置文件:
-Dspring.profiles.active=jdbc
3.3. Redis
Spring Cloud Config 还支持Redis 作为配置源。这是使用RedisEnvironmentRepository
类完成的。与JDBC 源类似,我们需要按照几个步骤来启用它。
首先,我们需要给Spring Data Redis添加一个依赖:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency>
其次,我们需要为如何连接到Redis 设置一些属性:
spring.redis.host=localhost spring.redis.port=6379
接下来,我们必须确保我们的属性正确存储在Redis 中。我们可以使用HMSET
命令来存储一些示例属性:
HMSET application sample.property.name1 "somevalue" sample.property.name2 "anothervalue"
如果我们要回显这些属性,我们应该会看到以下数据:
HGETALL application { "sample.property.name1": "somevalue", "sample.property.name2": "anothervalue" }
最后,我们必须为Spring Cloud Config 服务器启用Redis 配置文件:
-Dspring.profiles.active=redis
使用Redis 作为配置源也支持不同的配置文件。为此,我们只需将配置文件名称添加到应用程序的末尾:
HMSET application-dev sample.property.name1 "somevalue" sample.property.name2 "anothervalue"
在此示例中,我们将在名为dev
的配置文件下创建一组新属性。
3.4. Secrets
许多云提供商的一个流行特性是secrets
。Secrets 允许我们安全地存储敏感数据作为我们云基础设施的一部分。这些非常适合用户名、主机名和密码之类的内容,我们希望将其作为应用程序配置的一部分。
Spring Cloud Config 为许多不同的云秘密提供者提供支持。下面,我们将看看AWS,它使用AwsSecretsManagerEnvironmentRepository
类将AWS 机密加载到属性源中。
这个类依赖于AWSSecretsManager
类来完成与AWS 通信的繁重工作。虽然我们可以自己手动创建它,但更直接的解决方案是使用Spring starter:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-aws-secrets-manager-config</artifactId> <version>2.2.6.RELEASE</version> </dependency>
该模块包含一个自动配置,它将为我们创建一个AWSSecretsManager
实例。我们所要做的就是在bootstrap.yml
文件中指定一组属性:
aws: secretsmanager: default-context: application prefix: /config profile-separator: _ fail-fast: true name: ConfigServerApplication enabled: true
现在,假设我们想将我们的数据库凭据存储在一个秘密中,并使其可供配置服务器使用。我们只需在路径/config/application/database_credentials
处创建一个新密钥。在内部,我们将存储连接到数据库所需的必要键/值对。
此构造还支持不同的配置文件。例如,如果我们有一个开发数据库服务器,我们也可以为它创建一个单独的秘密。我们将其命名为/config/application/database_credentials_dev.
3.5. S3
存储配置的另一种便捷方式是使用云文件服务。让我们看看如何使用AWS S3 作为配置源。
首先,我们需要将AWS SDK添加到我们的项目中:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3outposts</artifactId> <version>1.12.150</version> </dependency>
然后,我们需要提供一些值来配置与包含我们的属性文件的S3 存储桶的连接:
amazon.s3.access-key=key amazon.s3.secret-key=secret
而且,我们需要为AWS S3 配置提供程序提供特定属性:
spring: cloud: config: server: awss3: region: us-east-1 bucket: config-bucket
我们还需要设置配置文件以确保加载AWS S3 配置源:
-Dspring.profiles.active=awss3
剩下的就是在存储桶中创建我们想要的属性文件,包括任何特定于配置文件的文件。请注意,当应用程序没有配置文件时,配置服务器假定为default
。因此,我们应该包含一个带有此后缀的文件以及任何其他包含特定配置文件名称的文件。
3.6.自定义配置源
如果任何提供的配置源不能满足我们的需求,我们总是可以选择实现我们自己的。通常,这涉及创建一个实现EnvironmentRepository
和Ordered
的新类:
public class CustomConfigurationRepository implements EnvironmentRepository, Ordered { @Override public Environment findOne(String application, String profile, String label) { // Return a new Environment that is populated from // our desired source (DB, NoSQL store, etc) } @Override public int getOrder() { // Define our order relative to other configuration repositories return 0; } }
然后,我们简单地将这个类实例化为一个新的Spring bean:
@Bean public CustomConfigurationRepository customConfigurationRepository() { return new CustomConfigurationRepository(); }
4.多个配置源
在某些情况下,可能需要使用多个配置源运行Spring Cloud Config。在这种情况下,我们必须指定几条数据。
假设我们想同时使用JDBC 和Redis 作为配置源。我们需要做的第一件事是在bootstrap.yml
文件中定义每个源的顺序:
spring: cloud: config: server: redis: order: 2 jdbc: order: 1
这允许我们指定哪些配置源应该在其他配置源之前使用的优先级。因为排序遵循正常的SpringOrdered
注释处理,所以将首先检查较低数量的源。
此外,我们需要为服务器定义两个配置文件:
-Dspring.profiles.active=jdbc,redis
请注意,我们也可以在YAML 中指定活动配置文件。而且,同样的模式可以用来定义任意数量的配置源。
5. 结论
在本文中,我们介绍了可与Spring Cloud Config 一起使用的各种配置源。虽然git 是许多项目的一个很好的默认源,但它可能并不总是最好的选择。我们已经看到Spring Cloud Config 提供了多种选择,以及创建自定义提供程序的能力。
0 评论