さまざまなデータベース構成を持つNetflix Archaius

1.概要

Netflix Archaiusは、多くのデータソースに接続するためのライブラリと機能を提供しています。

  • このチュートリアルでは、設定を取得する方法を学びます。**

  • JDBC APIを使用してデータベースに接続する

  • DynamoDBインスタンスに格納されている設定から

  • Zookeeperを動的分散構成として構成することによって

Netflix Archaiusの紹介については、https://www.baeldung.com/netflix-archaius-spring-cloud-integration[この記事をご覧ください]。

2. JDBC接続でNetflix Archaiusを使う

  • 入門チュートリアルで説明したように、Archaiusに設定を処理させたいときはいつでも、Apacheの AbstractConfiguration Beanを作成する必要があります。**

BeanはSpring Cloud Bridgeによって自動的に取得され、ArchaiusのComposite Configurationスタックに追加されます。

2.1. 依存関係

JDBCを使用してデータベースに接続するために必要な機能はすべてコアライブラリに含まれているので、入門チュートリアルで説明したもの以外に特別な依存関係は必要ありません。

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-archaius</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix</artifactId>
            <version>2.0.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

starter library の最新バージョンを使用していることを確認するために、Maven Centralを確認できます。

2.2. 構成Beanを作成する方法

  • この場合、 JDBCConfigurationSource インスタンスを使用して AbstractConfiguration Beanを作成する必要があります。

JDBCデータベースから値を取得する方法を示すには、以下を指定する必要があります。

  • javax.sql.Datasource オブジェクト

  • 少なくとも2つのカラムを取得するSQLクエリ文字列

構成のキーとそれに対応する値 ** それぞれプロパティのキーと値を示す2つの列

それでは、次にこのBeanを作成しましょう。

@Autowired
DataSource dataSource;

@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
    PolledConfigurationSource source =
      new JDBCConfigurationSource(dataSource,
        "select distinct key, value from properties",
        "key",
        "value");
    return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}

2.3. 試してみる

それを簡単に保ち、まだ実用的な例を持つために、初期データを含むH2インメモリデータベースインスタンスを設定します。

これを実現するために、まず必要な依存関係を追加します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
    <scope>runtime</scope>
</dependency>

注: https://search.maven.org/search?q = g:com.h2データベース%20a:h2[h2] および https://search.maven.org/searchの最新バージョンを確認できます。 ?q = a:Maven Centralのspring-boot-starter-data-jpa%20g:org.springframework.boot[spring-boot-starter-data-jpa] ライブラリ。

次に、私たちのプロパティを含むJPAエンティティを宣言します。

@Entity
public class Properties {
    @Id
    private String key;
    private String value;
}

そして、いくつかの初期値をインメモリデータベースに追加するために、 data.sql ファイルをリソースに含めます。

insert into properties
values('baeldung.archaius.properties.one', 'one FROM:jdbc__source');

最後に、任意の時点でプロパティの値を確認するために、Archaiusによって管理されている値を取得するエンドポイントを作成できます。

@RestController
public class ConfigPropertiesController {

    private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory
      .getInstance()
      .getStringProperty("baeldung.archaius.properties.one", "not found!");

    @GetMapping("/properties-from-dynamic")
    public Map<String, String> getPropertiesFromDynamic() {
        Map<String, String> properties = new HashMap<>();
        properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
        return properties;
    }
}

データが変化した場合、Archaiusは実行時にそれを検出し、新しい値の取得を開始します。

このエンドポイントは、もちろん次の例でも使用できます。

3. DynamoDBインスタンスを使用して設定ソースを作成する方法

前のセクションで行ったように、構成のソースとしてDynamoDBインスタンスを使用してArchaiusがプロパティをどのように管理しているかを正しく分析するための完全に機能的なプロジェクトを作成します。

3.1. 依存関係

pom.xml ファイルに次のライブラリを追加しましょう。

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-dynamodb</artifactId>
    <version>1.11.414</version>
</dependency>
<dependency>
    <groupId>com.github.derjust</groupId>
    <artifactId>spring-data-dynamodb</artifactId>
    <version>5.0.3</version>
</dependency>
<dependency>
    <groupId>com.netflix.archaius</groupId>
    <artifactId>archaius-aws</artifactId>
    <version>0.7.6</version>
</dependency>

最新の依存関係バージョンについてはMaven Centralを確認できますが、 archaius-aws については、https://github.com/spring-cloud/spring-cloud-netflix/blob/master/springでサポートされているバージョンを使用することをお勧めします。 -cloud-netflix-dependencies/pom.xml[Spring CloudのNetflixライブラリ]。

aws-java-sdk-dynamodb 依存関係により、DynamoDBクライアントをデータベースに接続するように設定できます。

spring-data-dynamodb ライブラリを使用して、DynamoDBリポジトリをセットアップします。

そして最後に、https://search.maven.org/search?q=a:archaius-aws[ archaius-aws ]ライブラリを使用して AbstractConfiguration を作成します。

3.2. 設定ソースとしてDynamoDBを使用

今回は、 AbstractConfiguration DynamoDbConfigurationSource オブジェクトを使用して作成します。

@Autowired
AmazonDynamoDB amazonDynamoDb;

@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
    PolledConfigurationSource source = new DynamoDbConfigurationSource(amazonDynamoDb);
    return new DynamicConfiguration(
      source, new FixedDelayPollingScheduler());
}
  • デフォルトでは、Archaiusは、ソースとして使用するDynamoデータベースの「key」および「value」属性を含む「archaiusProperties」という名前のテーブルを検索します。

これらの値を上書きしたい場合は、次のシステムプロパティを宣言する必要があります。

  • com.netflix.config.dynamo.tableName

  • com.netflix.config.dynamo.keyAttributeName

  • com.netflix.config.dynamo.valueAttributeName

3.3. 完全に機能的な例を作成する

このDynamoDBガイド で行ったように、機能を簡単にテストするためにローカルDynamoDBインスタンスをインストールすることから始めます。

ガイドの指示に従って、以前に自動配線した AmazonDynamoDB インスタンスを作成します。

データベースに初期データを追加するには、まずデータをマッピングするための DynamoDBTable エンティティを作成します。

@DynamoDBTable(tableName = "archaiusProperties")
public class ArchaiusProperties {

    @DynamoDBHashKey
    @DynamoDBAttribute
    private String key;

    @DynamoDBAttribute
    private String value;

   //...getters and setters...
}

次に、このエンティティ用に CrudRepository を作成します。

public interface ArchaiusPropertiesRepository extends CrudRepository<ArchaiusProperties, String> {}

そして最後に、リポジトリと AmazonDynamoDB インスタンスを使用してテーブルを作成し、後でデータを挿入します。

@Autowired
private ArchaiusPropertiesRepository repository;

@Autowired
AmazonDynamoDB amazonDynamoDb;

private void initDatabase() {
    DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDb);
    CreateTableRequest tableRequest = mapper
      .generateCreateTableRequest(ArchaiusProperties.class);
    tableRequest.setProvisionedThroughput(new ProvisionedThroughput(1L, 1L));
    TableUtils.createTableIfNotExists(amazonDynamoDb, tableRequest);

    ArchaiusProperties property = new ArchaiusProperties("baeldung.archaius.properties.one", "one FROM:dynamoDB");
    repository.save(property);
}

DynamoDbConfigurationSource を作成する直前にこのメソッドを呼び出すことができます。

これで、アプリケーションを実行する準備が整いました。

4.動的Zookeeper分散構成をセットアップする方法

Zookeeperの紹介記事を読む の前に見たように、このツールの利点の1つは、分散構成ストアとして使用できることです。

Archaiusと組み合わせると、構成管理のための柔軟でスケーラブルなソリューションになります。

4.1. 依存関係

より安定したバージョンを設定するには、http://cloud.spring.io/spring-cloud-zookeeper/single/spring-cloud-zookeeper.html#spring-cloud-zookeeper-install[公式のSpring Cloudの指示]に従ってください。 ApacheのZookeeper。

唯一の違いは、Zookeeperが提供する機能の一部しか必要としないことです。したがって、公式ガイドで使用されているものの代わりに spring-cloud-starter-zookeeper-config 依存関係を使用できます。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-config</artifactId>
    <version>2.0.0.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.13</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

spring-cloud-starter-zookeeper-config およびhttps://の最新バージョンを確認することもできますMaven Centralでのsearch.maven.org/search?q=g:org.apache.zookeeper%20a:zookeeper[ zookeeper ]依存関係。

zookeeper ベータ版を避けてください。

4.2. Spring Cloudの自動設定

  • 公式のドキュメントで説明されているように、 spring-cloud-starter-zookeeper-config 依存関係を含めて、Zookeeperのプロパティソースを設定するのに十分です。

デフォルトでは、1つのソースのみが自動設定され、 config/application Zookeeperノードの下のプロパティを検索します。そのため、このノードは異なるアプリケーション間の共有設定ソースとして使用されます。

さらに、 spring.application.name プロパティを使用してアプリケーション名を指定すると、別のソースが自動的に設定されます。今回は config/<app name> __ノードでプロパティを検索します。

これらの親ノードの下にある各ノード名はプロパティキーを示し、それらのデータはプロパティ値になります。

幸いなことに、Spring Cloudはこれらのプロパティソースをコンテキストに追加するので、Archaiusはそれらを自動的に管理します。 AbstractConfigurationをプログラムで作成する必要はありません。

4.3. 初期データの準備

この場合、設定をノードとして保存するために、ローカルのZookeeperサーバーも必要です。 このApacheのガイド に従って、ポート2181で動作するスタンドアロンサーバーを設定できます。

Zookeeperサービスに接続して初期データを作成するには、https://www.baeldung.com/apache-curator[Apacheのキュレータークライアント]を使用します。

@Component
public class ZookeeperConfigsInitializer {

    @Autowired
    CuratorFramework client;

    @EventListener
    public void appReady(ApplicationReadyEvent event) throws Exception {
        createBaseNodes();
        if (client.checkExists().forPath("/config/application/baeldung.archaius.properties.one") == null) {
            client.create()
              .forPath("/config/application/baeldung.archaius.properties.one",
              "one FROM:zookeeper".getBytes());
        } else {
            client.setData()
              .forPath("/config/application/baeldung.archaius.properties.one",
              "one FROM:zookeeper".getBytes());
        }
    }

    private void createBaseNodes() throws Exception {
        if (client.checkExists().forPath("/config") == null) {
            client.create().forPath("/config");
        }
        if (client.checkExists().forPath("/config/application") == null) {
            client.create().forPath("/config/application");
        }
    }
}

ログをチェックしてプロパティソースを確認し、Netflix Archaiusがプロパティを変更したら更新したことを確認できます。

5.まとめ

この記事では、Netflix Archaiusを使って高度な設定ソースを設定する方法を学びました。 Etcd、Typesafe、AWS S3ファイル、JCloudなど、他のソースもサポートしていることを考慮する必要があります。

いつものように、私たちはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-archaius[私たちのGithubレポ]ですべての例をチェックすることができます。