知識庫 / Spring / Spring Cloud RSS 訂閱

使用 Spring Cloud Config 排除 Git 方案

Spring Cloud
HongKong
8
12:21 PM · Dec 06 ,2025

1. 簡介

Spring Cloud Config 是一個庫,旨在簡化 Spring 應用的外部化配置。它允許我們將配置數據暴露為一個服務,從而方便任何具有 HTTP 客户端的應用程序進行獲取。

在本教程中,我們將學習如何在不使用 Git 的情況下使用 Spring Cloud Config。

2. Spring Cloud Config 概述

Spring Cloud Config 庫採用典型的客户端-服務器模型。一個或多箇中心化服務器從外部數據源讀取配置數據。這些服務器公開各種 HTTP 端點,允許任何其他應用程序查詢配置數據。

Spring Cloud Config 概述

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

當我們談論使用非 Git 的方式與 Spring Cloud Config 結合使用時,實際上指的是服務器組件。 我們的數據存儲選擇不影響客户端組件。 只有服務器受到影響。

Spring Cloud Config Server 庫中,有一個名為 EnvironmentRepository 的單一接口,它定義了一個配置源。 所有配置源,無論使用 Git 還是其他方式,都必須實現此接口。

讓我們看看一些提供的實現。

3.1. 文件系統

Spring Cloud Config 支持使用文件系統作為配置源。為了啓用此功能,需要在 Config 服務器的 <em >application.properties</em > 文件中指定以下值:

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

重要的是要記住,在使用文件系統配置源時,我們需要確保文件系統在配置服務器運行的任何地方都可用

3.2. JDBC

Spring Cloud Config 也可以使用關係型數據庫加載配置數據,使用 JDBC。這通過 <em>JdbcEnvironmentRepository</em> 類實現。為了啓用該類,我們需要遵循幾個步驟。

首先,<a href="https://mvnrepository.com/artifact/org.springframework/spring-jdbc">spring-jdbc</a> 庫必須存在於 classpath 上。如果我們在使用 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”的表,該表包含以下列:

  • “APPLICATION”
  • “PROFILE”
  • “LABEL”
  • “KEY”
  • “VALUE”

最後,我們需要為配置服務器指定 JDBC 配置文件。

-Dspring.profiles.active=jdbc

3.3. Redis

Spring Cloud Config 也支持 Redis 作為配置源。 這通過使用 <em >RedisEnvironmentRepository</em> 類來實現的。 類似於 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. 密鑰

許多雲提供商的流行功能是 密鑰。 密鑰允許我們安全地將敏感數據存儲在雲基礎設施的一部分中。 它們非常適合用户名、主機名和密碼等內容,我們將希望將其包含在應用程序配置中。

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

使用雲文件服務存儲配置的另一種便捷方式是利用 Amazon S3。 讓我們看看如何將 Amazon 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. 自定義配置源

如果提供的配置源無法滿足我們的需求,我們始終可以選擇實現自己的配置源。通常,這涉及到創建新的類,該類同時實現 <a href="https://www.javadoc.io/doc/org.springframework.cloud/spring-cloud-config-server/latest/org/springframework/cloud/config/server/environment/EnvironmentRepository.html"><em title="EnvironmentRepository">EnvironmentRepository</em></a> 和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 提供了多種替代方案,以及創建自定義提供程序的強大能力。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.