Slide 1

Slide 1 text

1 CN4Jスタジオ MicroProfile Config 日本IBM 田中 孝清 Twitter @TTakakiyo

Slide 2

Slide 2 text

2 n Java EE 8 / Jakarat EE 8 対応(javax名前空間) n MicroProfile 独⾃ API と Jakarta EE 共通 API から構成される MicroProfile 4.x Open Tracing 2.0 Open API 2.0 Rest Client 2.0 Config 2.0 Fault Tolerance 3.0 Metrics 3.0 JWT Propagation 1.2 Health 3.1 CDI 2.0 JSON-P 1.1 JAX-RS 2.1 JSON-B 1.0 MicroProfile 独自 API Jakarta EE 共通 API

Slide 3

Slide 3 text

3 n Jakarta EE 9.1 対応(jakarta名前空間) n MicroProfile 独⾃ API と Jakarta EE 共通 API から構成される MicroProfile 5.0 Open Tracing 3.0 Open API 3.0 Rest Client 3.0 Config 3.0 Fault Tolerance 4.0 Metrics 4.0 JWT Propagation 2.0 Health 4.0 CDI 3.0 JSON-P 2.0 JAX-RS 3.0 JSON-B 2.0 Jakarta Annotation 2.0 MicroProfile 独自 API Jakarta EE 共通 API

Slide 4

Slide 4 text

4 Javaアプリケーションから「構成情報」を取得する⽅法は,さまざま 4 Properties props = new Properties(); props.load(new FileInputStream(”/config/myProp.properties")); String s = props.getProperty("message"); String s = System.getProperty("message"); String s = System.getenv("message"); プロパティファイルから取得 システム・プロパティから取得 環境変数から取得

Slide 5

Slide 5 text

5 MicroProfile︓Config APIなら 5 Properties props = new Properties(); props.load(new FileInputStream("/config/myProp.properties")); String s = props.getProperty("message"); String s = System.getProperty("message"); String s = System.getenv("message"); @Inject @ConfigProperty(name = "message") private String s; 構成ソースさえ切り替えれば 同じコードであらゆる場所から構成情報を取得できる

Slide 6

Slide 6 text

6 @Inject @ConfigProperty を使⽤した構成の取得 n CDIのBeanに対しては, @ConfigPropertiyアノテーションを追加した@Injectで値を注⼊できる 6 import org.eclipse.microprofile.config.inject.ConfigProperty; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @ApplicationScoped public class MessageConfig { @Inject @ConfigProperty(name="message", defaultValue="Hello from MessageConfig!") private String message; public String getMessage() { return message; } }

Slide 7

Slide 7 text

7 ConfigProvider / Config クラスを使⽤した構成の取得 n ConfigProviderからConfigのインスタンスを取得して, getValueやgetOptionalValueで,名前とクラスを指定して取得する n CDIが有効でない状況でも利⽤できる 7 import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; public class MessageConfig { public String getMessage() { Config config = ConfigProvider.getConfig(); String message = config.getValue("message", String.class); return message; } }

Slide 8

Slide 8 text

8 構成ソース n Config APIで取得できる値は,構成ソースから提供される n 構成ソースには以下のようなものがある – Config API仕様で規定されたもの • システムプロパティ,環境変数,META-INF/microprofile-config.properties – ランタイム実装が独⾃に提供しているもの – アプリケーションで設定したカスタム構成ソース • org.eclipse.microprofile.config.spi.ConfigSource インターフェースを実装したクラスを⽤意する • クラスの完全修飾クラス名を META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceに記述する 8

Slide 9

Slide 9 text

9 Config API仕様で定められているデフォルト構成ソースと優先順位 n 優先順位の値が⼤ → 優先度が⾼い – 開発初期などは低優先順位の構成ソースを使⽤し, 実働環境などでは⾼順位のものを使⽤すると便利。 • 開発時の値をMETA-INF/microprofile-config.propertiesに記述し, 実働環境では環境変数で実際の値に上書きする,など – ランタイム実装によっては 独⾃拡張の構成ソース (例えば優先順位 1 や 500) をサポートすることも。 構成ソース デフォルトの 優先順位 構成ファイルの例 値の例 システム・プロパティー 400 jvm.options (Liberty) -Dmessage=hoge 環境変数 300 server.env (Liberty) message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile- config.properties message=hoge

Slide 10

Slide 10 text

10 WebSphere Liberty / Open LibertyでのConfig構成ソース n ユーザーアプリケーションでの使⽤を前提としていて サーバーの構成情報は原則として⼊っていない 10 構成ソース 優先順位 構成ファイル 設定の例 アプリケーションのプロパティ (ServletContextなどの属性) 600 server.xmlの などの⼦要素 server.xmlで定義された変数の値 500 server.xml システム・プロパティー 400 jvm.options -Dmessage=hoge 環境変数 300 server.env message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile- config.properties message=hoge server.xmlで定義された変数のデフォルト値 1 server.xml https://openliberty.io/docs/latest/external-configuration.html

Slide 11

Slide 11 text

11 QuarkusでのConfig構成ソース(バージョン2.5.2) n サーバーの構成にもConfigが使⽤されており,各種構成情報が⼊っている 11 https://ja.quarkus.io/guides/config-reference.html 構成ソース 優先順位 構成ファイル 設定の例 アプリケーションのビルド時に決定されて 実⾏時には変更不可能なもの 2147483647 Integer.MAX_VALUE application.propertiesなど message=hoge システム・プロパティー 400 JVMの起動時の引数 -Dmessage=hoge 環境変数 300 JVMを起動したシェルで設定 export message=hoge カレントディレクトリの.envファイル $PWS/.env 295 .env message=hoge $PWD/config/application.properties 260 application.properties message=hoge クラスパスのapplication.properties 250 application.properties message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile-config.properties message=hoge 明⽰的な構成がされておらず, デフォルト値が使われているサーバー構成 -2147483648 Integer.MIN_VALUE N/A N/A

Slide 12

Slide 12 text

12 JBoss / WildflyでのConfig構成ソース n JBoss EAP 7.3ではテクノロジープレビューとして提供 n ユーザーアプリケーションでの使⽤を前提としていて サーバーの構成情報は原則として⼊っていない 12 構成ソース 優先順位 構成ファイル 設定の例 システム・プロパティー 400 standalone.confなど JAVA_OPTS=-Dmessage=hoge 環境変数 300 standalone.confなど message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile-config.properties message=hoge サーブレットのServletConfigの属性 60 web.xmlなど message hoge サーブレットフィルターのFilterConfigの属性 50 web.xmlなど message hoge ServletContextの属性 40

Slide 13

Slide 13 text

13 PayaraでのConfig構成ソース n サーバーの構成情報がいろいろとはいっている(︖) 構成ソース 優先順位 構成ファイル 設定の例 変更不可能なサーバー構成 1000 システム・プロパティー 400 domain.xml 等 JVMの起動オプションに追加 -Dmessage=hoge 環境変数 300 asenv.conf等 message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile-config.properties message=hoge directory, password, domain, jndi, config, server, application, module, cluster, ... 90〜200 https://docs.payara.fish/community/docs/Technical%20Documentation/MicroProfile/Config/Overview.html

Slide 14

Slide 14 text

14 Helidon MPでのConfig構成ソース(バージョン2.5.2) n Config APIで必須とされている構成ソースのみ n なぜか優先順位が全て100になっている n Helidonの構成は,microprofile-config.propertiesに記述するようになっている そのため,ランタイムの構成情報がいろいろ⼊っている 14 構成ソース 優先順位 構成ファイル 設定の例 システム・プロパティー 100 JVMの起動時の引数 -Dmessage=hoge 環境変数 100 JVMを起動したシェルで設定 export message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile-config.properties message=hoge

Slide 15

Slide 15 text

15 構成に使⽤する名前について n 構成のキーとなる名前については,クラスのパッケージ名のように, 「名前空間をつけたピリオドで区切られた名前」を使うことが Config APIでは推奨されている – この資料では,スペースの都合で「message」という名前を使っているが,これは不適切 – 「com.ibm.jp.configtest.message」のような名前を利⽤するようにする n 「%」で始まる名前は,ConfigProfileという仕組みで使⽤されるため, 通常の名前としては使⽤できない 15

Slide 16

Slide 16 text

16 値のコンバーターについて n Config APIの構成ソースから提供される値は原則として⽂字列 n 取得時に,String以外のクラスが指定された場合はコンバーターが使⽤される n デフォルトでは以下のような組み込みコンバーターが利⽤できる – boolean, byte, short, int, long, float, double, char およびそのラッパークラス – java.util.OptionalInt, java.util.OptionalLong, java.util.OptionalDouble – java.lang.Class – 配列 n 独⾃のコンバーターも追加できる 16 @Inject @ConfigProperty(name="jp.test.intvalue") private int intValue; int intValue = config.getValue("jp.test.intvalue", Integer.class);

Slide 17

Slide 17 text

17 組み込みのコンバーターについて n boolean, java.lang.Boolean – 値が"true", "1", "YES", "Y", "ON"のときにtrueになる – それ以外はfalseになる n 配列 – カンマ "," で区切られた値が配列になる – カンマを配列の値として使いたいときには "¥," でエスケープする(環境によってはバックスラッシュ) 17

Slide 18

Slide 18 text

18 環境変数からの読み込みについて n 環境によってはピリオドが環境変数に使えないため, ⼀定のルールにしたがって名前を変換して値が検索される n 「jp.test.ConfigVal」という名前の値を得る場合には,以下の順序で検索される – 「jp.test.ConfigVal」 そのまま – 「jp_test_ConfigVal」 英数字以外を "_" (アンダースコア)に変換する – 「JP_TEST_CONFIGVAL」 英字を⼤⽂字に変換する 18

Slide 19

Slide 19 text

19 プロパティ式 n 取得した値に ${ ... } という⽂字列が含まれていた場合, 再帰的に値が取得されて代⼊される – 以下のように構成されいる状況で「server.url」を取得すると 「server.host」が取得されて代⼊されて, 「http://example.org/endpoint」という値が取得される 19 server.url=http://${server.host}/endpoint server.host=example.org

Slide 20

Slide 20 text

20 まとめ n MicroProfile Config APIは, アプリケーションから構成情報を取得する操作を統合するAPIです。 n Config APIは, Jakarta EEの将来のバージョンで取り⼊れることが検討されていますが, MicroProfile実装だけでなく, 多くのJava EE / Jakarta EEアプリケーションサーバーでも利⽤できるようになっています n 業務アプリケーションでも是⾮ご活⽤ください 20