14.2. MicroProfile Config

14.2.1. 概要

 MicroProfile Config は Java のシステムプロパティ、環境変数、.properties ファイルに設定した値を集約して、アプリケーション上で取得するための API を提供します。 これにより、アプリケーションでは、どこで設定が行われているかを意識することなく、 同じ API により値を取得することができます。 もし、同じ設定名で複数個所に別の値が設定されていた場合、優先順位の高い値が取得されます。 この優先度については、「MicroProfile Config の優先度」 にて説明します。

 以下にアプリケーションで API を使用して、値を取得する際のイメージ図を示します。

MicroProfile Config の値取得

 上記の例では、userId という設定名を MicroProfile Config API で提供している ConfigProvider の getValue により取得しています。

 MicroProfile Config で使用できる API の詳細については、次節で例を挙げて説明します。

14.2.2. MicroProfile Config API

 アプリケーションで設定値を取得するためには、ConfigProvider または @Inject Config で注入する方法があります。

14.2.3. MicroProfile Config の優先度

WebOTX V11 では、MicroProfile Config 2.0 で定義されている以下の設定値を取得することができます。

 これらに同じプロパティ名が指定されていた場合は、優先度が高いものが使用されます。

 この優先度は、MicroProfile Config 2.0 で以下のように定義されており、 WebOTX V11 での既定値です。

 優先順位の設定は、WebOTX の以下で定義しています。

MicroProfile Config の優先度の設定
dotted-name(CLINAME) 説明 既定値
server.microprofile.microprofile-config.sys-prop-ordinal Java VM システムプロパティの優先度 400
server.microprofile.microprofile-config.env-ordinal 環境変数の優先度 300
server.microprofile.microprofile-config.micro-prop-ordinal microprofile-config.properties の優先度 100

この優先度の設定を変更したい場合は、otxadmin の set コマンドで以下の例のように設定します。

※設定の反映は、ドメインの再起動が必要です。

Java VM システムプロパティの優先度変更設定例:

otxadmin> set server.microprofile.microprofile-config.sys-prop-ordinal=200

14.2.4. サンプルの作成

ここでは、WebOTX Developer にて MicroProfile Config のサンプルアプリケーションを作成する手順について説明します。

作成するアプリケーションは、リクエストで /microprofile-config-sample/config/{プロパティ名} のようにプロパティ名を URL で指定して、 アプリケーション内で定義した micorporilfe-config.properties から該当のプロパティの値を返却します。

ここで作成したアプリケーションは以下よりダウンロードできます。 ダウンロードしたファイルは解凍して、WebOTX Developer にインポートして使用してください。

ダウンロード:microprofile-config-sample.zip

(1) WebOTX Developer にて新規プロジェクトの作成

WebOTX Developer を起動し、メニューバーから「ファイル」−「新規」−「その他」を選択します。 次に、以下のようなウィンドウが開くので、「Web」−「動的 Web プロジェクト」を選択して「次へ」ボタンをクリックします。

プロジェクト名を「micorprofile-config-sample」と入力し、「終了」ボタンをクリックします。

(2) microprofile-config-api.jar をライブラリに追加

プロジェクトの「プロパティ」を開き、以下のように「Java のビルド・パス」−「ライブラリ」−「外部 JAR の追加」をクリックします。

<WebOTX インストールディレクトリ>\WebOTX\modules から microprofile-config-api.jar を選択して、追加します。

追加できたら、「適用して閉じる」ボタンをクリックします。

(3) SampleActivator.java の作成
SampleActivator クラスを作成し、以下のように記述します。
package com.nec.webotx.samples;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("config")
public class SampleActivator extends Application {

}
(4) ConfigSample.java の作成

ConfigSample クラスを作成し、以下のように記述します。

package com.nec.webotx.samples;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.ConfigProvider;

@Path("/")
public class ConfigSample {
  @GET
  @Path("/{param}")
  public String getProperty(@PathParam("param") String param) {
    Config config = ConfigProvider.getConfig();
    return config.getValue(param, String.class);
  }
}
(5) microprofile-config.properties の作成

microprofile-config.properties は Class パスの通った META-INF 配下に配置するため、 以下のよう WEB-INF に classes/META-INF ディレクトリを作成してから配置します。

  WebContent
    ├─META-INF
    └─WEB-INF
      └──classes
          └─META-INF
              └─microprofile-config.properties
    

microprofile-config.properties には、例として以下を記述します。

test=100
(6) war ファイルのエクスポート

プロジェクトを右クリックして、「エクスポート」−「WAR ファイル」を選択します。

「Destination」出力先のパスを指定し、「終了」ボタンをクリックします。

(7) アプリケーションの配備

対象の環境に合わせて、アプリケーションを配備します。

コンテナ環境の場合は、[ 構築・運用 > コンテナ型仮想化 ] を参考に、本サンプルアプリケーションを含めたコンテナイメージを作成して、コンテナを起動してください。

コンテナ環境でない場合は、[ 配備 > アプリケーション配備 > 配備・再配備・置換 > 配備・再配備 ] を参考に、配備してください。
例) エージェントプロセス上に配備する場合

otxadmin> deploy (エクスポート時に指定したWARファイル名).war
(8) アプリケーションの実行

以下の URLにアクセスすると、microprofile-config.properties で指定した値が表示されます。

http://localhost/microprofile-config-sample/config/test
(9) MicroProfile Config で取得できる値の変更

(8) で取得した値をアプリケーションを修正せずに変更する例として、マイクロサービス起動時に以下のように環境変数を設定します。

docker run -it -d -p 80:80 -e test=200 --name microprofile-config-sample-200 microprofile-config-sample

Docker 起動後に先ほどと同じように以下にリクエストすると、取得される値が 100 から 200 に変わっていることがわかります。

http://localhost/microprofile-config-sample/config/test

このようにして、アプリケーションを修正することなく、 環境変数や Java のシステムプロパティで設定値を変更することができます。

14.2.5. 記述例

アプリケーションからMicroProfile Config APIを使って接続ホストや認証情報を取得しDBやKVSを利用するための記述例を下記に示します。

package com.nec.webotx.samples;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.config.inject.ConfigProperty;

import redis.clients.jedis.Jedis;


@Path("/hello")
public class HelloWorldEndpoint {

    // DB接続URL
    @Inject
    @ConfigProperty(name = "hello_db_url")
    String dbUrl;

    // DB認証ユーザ名
    @Inject
    @ConfigProperty(name = "hello_db_user")
    String dbUser;

    // DB認証パスワード
    @Inject
    @ConfigProperty(name = "hello_db_password")
    String dbPassword;

    // KVSホスト名
    @Inject
    @ConfigProperty(name = "hello_kvs_host")
    String kvsHost;

    // KVSポート番号
    @Inject
    @ConfigProperty(name = "hello_kvs_port")
    Integer kvsPort;

    // KVS認証ユーザ名
    @Inject
    @ConfigProperty(name = "hello_kvs_user")
    String kvsUser;

    // KVS認証パスワード
    @Inject
    @ConfigProperty(name = "hello_kvs_password")
    String kvsPassword;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response doGet() {
        StringBuilder text = new StringBuilder();

        // DB(Oracle)接続例
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
            ・・・
        } catch (Exception e) {
            ・・・
        } finally {
            ・・・
        }

        // KVS(Redis)接続例
        Jedis jedis = null;
        try {
            jedis = new Jedis(kvsHost, kvsPort);
            jedis.auth(kvsUser, kvsPassword);
            ・・・
        } catch (Exception e) {
            ・・・
        }finally {
            if(jedis != null) try { jedis.close(); } catch (Exception e) {}
        }

        return Response.ok(text).build();
    }
}

設定値

hello_db_url=jdbc:oracle:thin:@{DBホスト名}:{DBポート番号}:{SID}
hello_db_user={DBユーザ名}
hello_db_password={DBパスワード}

hello_kvs_host={KVSホスト名}
hello_kvs_port={KVSポート番号}
hello_kvs_user={KVSユーザ名}
hello_kvs_password={KVSパスワード}
Caution
パスワードには暗号化した値を設定し、アプリケーションで復号して利用する事を推奨します。
Memo1
DBやKVSに登録された値を設定値として返却するConfigSourceをユーザー実装する事によって、DBやKVSを設定媒体として利用することができるようになります。
詳細はMicroProfile Config APIを参照してください。 詳しくは [ MicroProfile Config API ] の [ org.eclipse.microprofile.config.spi.ConfigSource ] の説明を参照してください。