1. 序章

Spring Cloud Config は、Springアプリケーションの構成を簡単に外部化できるようにするライブラリです。 これにより、構成データをサービスとして公開できるため、HTTPクライアントを備えた他のアプリケーションから簡単に取り込むことができます。

このチュートリアルでは、gitを使用せずにSpringCloudConfigを使用する方法を見ていきます。

2. SpringCloudConfigの概要

Spring Cloud Configライブラリは、一般的なクライアントサーバーモデルです。 一元化されたサーバー(または複数のサーバー)は、外部データソースから構成データを読み込みます。 これらのサーバーは、他のアプリケーションが構成データを照会できるようにするさまざまなHTTPエンドポイントを公開します。

SpringCloudConfigの概要

Spring Cloud Configを使用すると、SpringBootアプリケーションから構成サーバーに自動的に接続することも非常に簡単になります。 サーバーによって提供される構成データは、クライアントアプリケーション内の他のプロパティソースと同じように使用できます。

3. Gitプロバイダー

Spring Cloud Configの最も一般的なユースケースは、構成データをgitリポジトリ内に保存することです。 このタイプのセットアップには、いくつかの利点があります。

  • 柔軟性:gitリポジトリは、バイナリを含むさまざまなファイルタイプを保持できます。
  • セキュリティ:読み取りアクセスと書き込みアクセスの両方をきめ細かいレベルで簡単に制御できます。
  • 監査:堅牢な履歴追跡により、構成変更の監査が容易になります。
  • 標準化:Gitの操作はプロバイダーに関係なく標準です。つまり、セルフホストしたり、任意の数のサードパーティプロバイダーを使用したりできます。
  • 分散型:Gitはゼロから分散型に設計されているため、クラウドネイティブおよびマイクロサービスアーキテクチャに最適です。

上記のすべての利点にもかかわらず、gitが構成データを保存するための最良の選択であるとは限りません。 たとえば、私たちの組織は、リレーショナルデータベースなどの別のデータストアに構成データをすでに配置している場合があります。 この場合、それをgitに移行する努力の価値がないかもしれません。

次のセクションでは、gitなしでSpring CloudConfigを使用する方法を詳しく見ていきます。

4. GitなしでSpringCloudConfigを使用する

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 DataRedisに依存関係を追加する必要があります。

<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"
}

最後に、SpringCloudConfigサーバーのRedisプロファイルを有効にする必要があります。

-Dspring.profiles.active=redis

構成ソースとしてRedisを使用すると、さまざまなプロファイルもサポートされます。 これを行うには、アプリケーションの最後にプロファイル名を追加するだけです。

HMSET application-dev sample.property.name1 "somevalue" sample.property.name2 "anothervalue"

この例では、devという名前のプロファイルの下に新しいプロパティのセットを作成しています。

3.4. 秘密

多くのクラウドプロバイダーの人気のある機能は、secretsです。 Secrets を使用すると、クラウドインフラストラクチャの一部として機密データを安全に保存できます。 これらは、ユーザー名、ホスト名、パスワードなど、アプリケーション構成の一部として含めたいものに最適です。

Spring Cloud Configは、さまざまなクラウドシークレットプロバイダーをサポートします。 以下では、AwsSecretsManagerEnvironmentRepositoryクラスを使用してAWSシークレットをプロパティソースにロードするAWSについて説明します。

このクラスは、 AWSSecretsManager クラスに依存して、AWSとの通信の面倒な作業を行います。 手動で作成することもできますが、より簡単な解決策は、Springスターターを使用することです。

<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

構成を保存するもう1つの便利な方法は、クラウドファイルサービスを使用することです。 AWSS3を構成ソースとして使用する方法を見てみましょう。

まず、 AWSSDKをプロジェクトに追加する必要があります。

<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

また、AWSS3構成プロバイダーに特定のプロパティを提供する必要があります。

spring:
  cloud:
    config:
      server:
        awss3:
          region: us-east-1
          bucket: config-bucket

また、AWSS3設定ソースが確実に読み込まれるようにプロファイルを設定する必要があります。

-Dspring.profiles.active=awss3

あとは、バケット内にプロファイル固有のファイルを含む目的のプロパティファイルを作成するだけです。 アプリケーションにプロファイルがない場合、構成サーバーはdefaultを想定していることに注意してください。 したがって、このサフィックスが付いたファイルを、特定のプロファイル名を含む他のファイルと一緒に含める必要があります。

3.6. カスタム構成ソース

提供されている構成ソースのいずれかがニーズを満たさない場合は、常に独自の構成ソースを実装するオプションがあります。 一般に、これには、EnvironmentRepositoryOrderedの両方を実装する新しいクラスの作成が含まれます。

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;
    }
}

次に、このクラスを新しいSpringBeanとしてインスタンス化するだけです。

@Bean
public CustomConfigurationRepository customConfigurationRepository() {
    return new CustomConfigurationRepository();
}

4. 複数の構成ソース

場合によっては、複数の構成ソースを使用してSpringCloudConfigを実行する必要があります。 この場合、いくつかのデータを指定する必要があります。

JDBCとRedisの両方を構成ソースとして実行したいとします。 最初に行う必要があるのは、bootstrap.ymlファイルで各ソースの順序を定義することです。

spring:
  cloud:
    config:
      server:
        redis:
          order: 2
        jdbc:
          order: 1

これにより、構成ソースを他のソースよりも優先して使用する優先順位を指定できます。 順序付けは通常のSpringOrdered アノテーション処理に従うため、小さい番号のソースが最初にチェックされます

さらに、サーバーの両方のプロファイルを定義する必要があります。

-Dspring.profiles.active=jdbc,redis

YAMLでアクティブなプロファイルを指定することもできることに注意してください。 そして、これと同じパターンを使用して、任意の数の構成ソースを定義できます

5. 結論

この記事では、Spring CloudConfigで使用できるさまざまな構成ソースについて説明しました。 gitは多くのプロジェクトにとって優れたデフォルトのソースですが、常に最良の選択であるとは限りません。 Spring Cloud Configは、カスタムプロバイダーを作成する機能だけでなく、複数の選択肢を提供することを確認しました。