1. 概要

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

このチュートリアルでは、構成を取得する方法を学習します:

  • JDBCAPIを使用してデータベースに接続する
  • DynamoDBインスタンスに保存されている設定から
  • Zookeeperを動的分散構成として構成する

Netflix Archaiusの紹介については、この記事をご覧ください。

2. JDBC接続でのNetflixArchaiusの使用

入門チュートリアルで説明したように、Archaiusで構成を処理する場合は常に、Apacheの AbstractConfigurationbeanを作成する必要があります。

beanはSpring Cloudブリッジによって自動的にキャプチャされ、Archaiusのコンポジット構成スタックに追加されます。

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>

Maven Centralをチェックして、最新バージョンのスターターライブラリを使用していることを確認できます。

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

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

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>

注:MavenCentralのh2および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 バージョンについては、 SpringCloudNetflixライブラリでサポートされているバージョンを使用することをお勧めします。

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

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

最後に、archaius-awsライブラリを使用してAbstractConfigurationを作成します。

3.2. DynamoDBを構成ソースとして使用する

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

@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. 依存関係

の公式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>

ここでも、MavenCentralのspring-cloud-starter-zookeeper-configおよびzookeeperの依存関係の最新バージョンを確認できます。

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

4.2. Spring Cloudの自動構成

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

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

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

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

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

4.3. 初期データの準備

この場合、構成をノードとして保存するためのローカルZookeeperサーバーも必要になります。 このApacheのガイドに従って、ポート2181で実行されるスタンドアロンサーバーをセットアップできます。

Zookeeperサービスに接続して初期データを作成するには、ApacheのCuratorクライアントを使用します。

@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");
        }
    }
}

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

5. 結論

この記事では、NetflixArchaiusを使用して高度な構成ソースをセットアップする方法を学びました。 Etcd、Typesafe、AWS S3ファイル、JCloudなどの他のソースもサポートしていることを考慮する必要があります。

いつものように、Githubリポジトリのすべての例を確認できます。