在沒有Git的情況下使用Spring Cloud Config
- Spring Cloud
一、簡介
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
這允許我們指定哪些配置源應該在其他配置源之前使用的優先級。因為排序遵循正常的 Spring Ordered
註釋處理,所以將首先檢查較低數量的源。
此外,我們需要為服務器定義兩個配置文件:
-Dspring.profiles.active=jdbc,redis
請注意,我們也可以在 YAML 中指定活動配置文件。而且,同樣的模式可以用來定義任意數量的配置源。
5. 結論
在本文中,我們介紹了可與 Spring Cloud Config 一起使用的各種配置源。雖然 git 是許多項目的一個很好的默認源,但它可能並不總是最好的選擇。我們已經看到 Spring Cloud Config 提供了多種選擇,以及創建自定義提供程序的能力。