Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CN4Jスタジオ: MicroProfile Config

CN4Jスタジオ: MicroProfile Config

2022年9月16日に開催されたJakartaOne Livestream Japan 2022のCN4J Studioセッション「CN4Jスタジオ: MicroProfile Config」の発表資料です。
https://jakartaone.org/jp/2022/japan/

Takakiyo Tanaka

September 15, 2022
Tweet

More Decks by Takakiyo Tanaka

Other Decks in Technology

Transcript

  1. 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
  2. 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
  3. 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"); プロパティファイルから取得 システム・プロパティから取得 環境変数から取得
  4. 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; 構成ソースさえ切り替えれば 同じコードであらゆる場所から構成情報を取得できる
  5. 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; } }
  6. 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; } }
  7. 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
  8. 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
  9. 10 WebSphere Liberty / Open LibertyでのConfig構成ソース n ユーザーアプリケーションでの使⽤を前提としていて サーバーの構成情報は原則として⼊っていない 10

    構成ソース 優先順位 構成ファイル 設定の例 アプリケーションのプロパティ (ServletContextなどの属性) 600 server.xmlの <webApplication> などの⼦要素 <appProperties> <property name="message" value="hoge" /> </appProperties> server.xmlで定義された変数の値 500 server.xml <variable name="message" value="hoge" /> システム・プロパティー 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 <variable name="message" defaultValue="hoge" /> https://openliberty.io/docs/latest/external-configuration.html
  10. 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
  11. 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など <init-param> <param-name>message</param-name> <param-value>hoge</param-value> </init-param> サーブレットフィルターのFilterConfigの属性 50 web.xmlなど <init-param> <param-name>message</param-name> <param-value>hoge</param-value> </init-param> ServletContextの属性 40
  12. 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
  13. 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
  14. 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);
  15. 17 組み込みのコンバーターについて n boolean, java.lang.Boolean – 値が"true", "1", "YES", "Y",

    "ON"のときにtrueになる – それ以外はfalseになる n 配列 – カンマ "," で区切られた値が配列になる – カンマを配列の値として使いたいときには "¥," でエスケープする(環境によってはバックスラッシュ) 17
  16. 19 プロパティ式 n 取得した値に ${ ... } という⽂字列が含まれていた場合, 再帰的に値が取得されて代⼊される –

    以下のように構成されいる状況で「server.url」を取得すると 「server.host」が取得されて代⼊されて, 「http://example.org/endpoint」という値が取得される 19 server.url=http://${server.host}/endpoint server.host=example.org
  17. 20 まとめ n MicroProfile Config APIは, アプリケーションから構成情報を取得する操作を統合するAPIです。 n Config APIは,

    Jakarta EEの将来のバージョンで取り⼊れることが検討されていますが, MicroProfile実装だけでなく, 多くのJava EE / Jakarta EEアプリケーションサーバーでも利⽤できるようになっています n 業務アプリケーションでも是⾮ご活⽤ください 20