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

MicroProfile Config を触ろう @JJUGナイトセミナー

babatch
October 21, 2022

MicroProfile Config を触ろう @JJUGナイトセミナー

2022/10/20 20:00-21:00 に日本Javaユーザーグループのナイトセミナー「Java仕様勉強会」でオンラインで講演させていただきました、標記セッションの資料です。

babatch

October 21, 2022
Tweet

More Decks by babatch

Other Decks in Programming

Transcript

  1. 2 ⾃⼰紹介 n⾺場 剛 (ばば つよし) n ⽇本アイ・ビー・エム株式会社 オートメーションソフトウェア テクニカルセールス

    n WebSphere Application Server などのテクニカル セールスを担当 n Java 再⼊⾨中 n Twitter @babatch324 2
  2. 3 本⽇の内容 n MicroProfile について n MicroProfile Config について n

    とりあえず動かしてみる n カスタム構成ソース n 動的構成ソース n 構成プロファイル n その他の話題 n まとめ n 参考にしたもの 3
  3. 5 MicroProfile n Javaでマイクロサービスを実装する際に必要な機能を標準化 n 世の中では、Java EEと排他的な選択肢と思われている 例) MicroProfileで⼗分なアプリ →

    MicroProfileを使う Java EEが必要なアプリ → Java EEを使う n 実際には、Java EEで使っても有⽤な機能が多い n 進化がとても早いのが特徴 5 2016/9 MicroProfile 1.0 2017/8 MicroProfile 1.1 2017/9 MicroProfile 1.2 2018/1 MicroProfile 1.3 2018/6 MicroProfile 1.4 2019/6 MicroProfile 3.0 2019/10 MicroProfile 3.1 2019/11 MicroProfile 3.2 2020/2 MicroProfile 3.3 2018/6 MicroProfile 2.0 2018/10 MicroProfile 2.1 2019/2 MicroProfile 2.2 2020/12 MicroProfile 4.0 2021/08 MicroProfile 4.1 2021/12 MicroProfile 5.0
  4. 6 n Jakarta EE 9.1 対応 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
  5. 7 MicroProfile 5.0 機能⼀覧 7 API 機能 Open Tracing 3.0

    分散システム上のアプリケーションに対するトレーシ ングを提供するベンダ非依存のライブラリ。 Open API 3.0 RESTful Webサービスのソースコード上のアノテーショ ンから API 仕様文書を生成する。 Rest Client 3.0 RESTful Webサービスへアクセスするためのクライア ント API。 Config 3.0 システム・プロパティ、環境変数、.property ファイルな どからランタイム構成を取得する。 Fault Tolerance 4.0 マイクロサービス環境において1 つのサービスで発生 した障害が他のサービスに波及することを食い止め、 障害許容性と回復性を実現する。 Metrics 4.0 アプリケーションの時系列テレメトリデータを提供する。 JWT Propagation 2.0 複数のマイクロサービスからなる環境において一気 通貫のRBACを行うために、OIDCやJWTを活用して認 証・認可情報を伝搬する。 API 機能 Health 4.0 サービスの正常性を外部から検査する。 CDI 3.0 アノテーションによりアプリケーションに対して実行時 依存性を注入する。 JSON-P 2.0 JSON に対するさまざまな操作を提供する。 JAX-RS 3.0 RESTful Webサービスを提供する。 JSON-B 2.0 JSON オブジェクトと Java オブジェクトを相互に変換す る。 Annotations 2.0 アノテーションによりアプリケーションに対して情報を 提供する。
  6. 9 Javaアプリケーションから「構成情報」を取得する⽅法は,さまざま 9 Properties props = new Properties(); props.load(new FileInputStream(”/config/myProp.properties"));

    String s = props.getProperty("hoge"); String s = System.getProperty("hoge"); String s = System.getenv("hoge"); プロパティファイルから取得 システム・プロパティから取得 環境変数から取得
  7. 10 MicroProfile︓Config APIなら 1 0 Properties props = new Properties();

    props.load(new FileInputStream("/config/myProp.properties")); String s = props.getProperty("hoge"); String s = System.getProperty("hoge"); String s = System.getenv("hoge"); @Inject @ConfigProperty(name = "hoge") private String s; 構成ソースさえ切り替えれば 同じコードであらゆる場所から構成情報を取得できる
  8. 11 Config API 仕様で定められているデフォルト構成ソースと優先順位 n 優先順位の値が⼤ → 優先度が⾼い – 開発初期などは低優先順位の構成ソースを使⽤し、実働環境などでは⾼順位のものを使⽤すると便利。

    • 開発時の値を META-INF/microprofile-config.properties に記述し、実働環境では環境変数で実際の値に上書きする、 など。 – ランタイム実装によっては独⾃拡張の構成ソース (例えば優先順位 1 や 500) をサポートすることも。 11 構成ソース デフォルトの 優先順位 構成ファイルの例 設定の例 システム・プロパティー 400 jvm.options (Liberty の場合) -Dmessage=hoge 環境変数 300 server.env (Liberty の場合) message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile-config.properties message=hoge
  9. 12 WebSphere Liberty / Open LibertyでのConfig構成ソース n ユーザーアプリケーションでの使⽤を前提としていて サーバーの構成情報は原則として⼊っていない 12

    構成ソース 優先順位 構成ファイル 設定の例 アプリケーションのプロパティ (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. 13 QuarkusでのConfig構成ソース(バージョン2.5.2) n サーバーの構成にもConfigが使⽤されており,各種構成情報が⼊っている 13 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ファイル $PWD/.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. 14 JBoss / WildFlyでのConfig構成ソース n JBoss EAP 7.3ではテクノロジープレビューとして提供 n ユーザーアプリケーションでの使⽤を前提としていて

    サーバーの構成情報は原則として⼊っていない 14 構成ソース 優先順位 構成ファイル 設定の例 システム・プロパティー 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. 15 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. 16 Helidon MPでのConfig構成ソース(バージョン2.5.2) n Config APIで必須とされている構成ソースのみ n なぜか優先順位が全て100になっている n Helidonの構成は,microprofile-config.propertiesに記述するようになっている

    そのため,ランタイムの構成情報がいろいろ⼊っている 16 構成ソース 優先順位 構成ファイル 設定の例 システム・プロパティー 100 JVMの起動時の引数 -Dmessage=hoge 環境変数 100 JVMを起動したシェルで設定 export message=hoge クラスパス上のすべての META-INF/microprofile-config.properties 100 microprofile-config.properties message=hoge
  14. 18 (参考) デモ環境のセットアップ n お好みの Java SE 17 – IBM

    Semeru Runtimes は以下で⼊⼿可能。 • https://developer.ibm.com/languages/java/semeru-runtimes/downloads/ – インストールして、java コマンドにパスを通して JAVA_HOME を設定しておく。 – デモ開発は IBM Semeru Runtimes を使⽤しています。 n Eclipse IDE for Enterprise Java and Web Developers – https://marketplace.eclipse.org/content/ibm-liberty-developer-tools を⾒て、最新の Liberty Developer Tools がサポートする最新の Eclipse を⼊⼿、導⼊します。 • 今回は 2022-03 を使⽤しています – Eclipse Marketplace から IBM Liberty Developer Tools を導⼊します。 n インターネット接続 18
  15. 19 (参考) スターター・アプリケーションの⼊⼿ n Open Liberty 公式サイトの Get Started ページへアクセスする。

    – https://openliberty.io/start/ n 以下の構成でスターター・アプリケーションを⽣成してダウンロードする。 – Group: com.ibm.demo – Artifact: config-demo – Build Tool: Maven – Java SE Version: 17 – Java EE/Jakarta EE Version: 9.1 – MicroProfile Version: 5.0 – Generate Project ボタンを押してダウンロード n ダウンロードしたアーカイブを展開する。 n Eclipse で File > Import > Maven > Existing Maven Project を選択して Next> を押す。 n 以降、画⾯の指⽰に従ってインポートを完了する。
  16. 20 @Inject @ConfigProperty を使⽤した構成の取得 n MessageConfig.java – CDI の Beanに対しては,@ConfigProperty

    アノテーションを追加した @Inject で値を注⼊できる – CDI を使⽤せず、プログラマティックに⾏う⽅法もある。 • Config config = ConfigProvider.getConfig(); して config.getValue("propertyName", propertyType.class); 20 package mpConfigDemo; import org.eclipse.microprofile.config.inject.ConfigProperty; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @ApplicationScoped public class MessageConfig { @Inject @ConfigProperty(name="message", defaultValue="Hello from defaultValue in MessageConfig!") private String message; public String getMessage() { return message; } }
  17. 21 @Inject @ConfigProperty を⽤いて取得した構成の表⽰ n MessageServlet.java 21 package mpConfigDemo; import

    java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.inject.Inject; @WebServlet("/MessageServlet") public class MessageServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Inject MessageConfig config; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append(config.getMessage()); } }
  18. 22 Liberty フィーチャーの構成 (1) n Enterprise Explorer で config-demo >

    src > main > liberty > config > server.xml をダブルクリックして開く。 n Feature Manager をクリックし、続いて Add... をクリック する。 n cdi-3.0 をクリックして OK ボタンを押す。 22
  19. 23 Liberty フィーチャーの構成 (2) n server.xml エディタ最下部の Source タブをクリックし、<featureManager> タグの要素が

    下のようになっていることを確認して保存する。 – Liberty フィーチャーについて詳細は以下とその⼦⽂書を参照。 • https://openliberty.io/docs/latest/reference/feature/feature-overview.html 23 <featureManager> <feature>jakartaee-9.1</feature> <feature>microProfile-5.0</feature> <feature>cdi-3.0</feature> </featureManager>
  20. 24 @ConfigProperty の devaultValue の表⽰ n ターミナル (コマンドプロンプト) を開いて、スターター・アプリケーションを展開したディレ クトリにカレント・ディレクトリを移す。

    n ターミナル (コマンドプロンプト) で ./mvnw liberty:dev コマンドを発⾏する。 – Open Liberty dev mode についてはこちら https://openliberty.io/docs/latest/development-mode.html n 以下が表⽰されるのを待つ。(初回の起動時は時間がかかります) n Web ブラウザーを開いて http://localhost:9080/config-demo/MessageServlet へアクセス する。 n 以下が表⽰されれば、ここまでの作業は成功となる。 24 [INFO] [監査 ] CWWKT0016I: Web アプリケーションが使⽤可能です (default_host): http://localhost:9080/config-demo/ [INFO] [監査 ] CWWKZ0003I: アプリケーション config-demo が 0.501 秒で更新されました。
  21. 25 デフォルトの優先順位 100 の構成の取得 n Enterprise Explorer で config-demo >

    src > main > webapp を右クリックして、New > Folder をクリック。 n Folder name: に META-INF と記⼊して Finish をクリックする。 n 作成した META-INF フォルダを右クリックして、New > File をクリックする。 n File name: に microprofile-config.properties と記載して Finish をクリックする。 n microprofile-config.properties のエディタが開くので、以下を記載して保存する。 n 先ほどの Web ブラウザー画⾯をリロードする。 25 message=Hello from microprofile-config.properties!
  22. 26 デフォルトの優先順位 300 の構成の取得 n Enterprise Explorer で config-demo >

    src > main > liberty > config を右リックして New > File をクリックする。 n File name: に server.env を記⼊して Finish をクリックする。 n エディタで server.env が開くので 下の内容を追記して保存。 n Liberty dev モードを実⾏している (./mvn liberty:dev を発⾏した) ターミナルで、r と Enter を順に押してサーバーを再起動する。 n 先ほどの Web ブラウザー画⾯をリロードする。 26 message=Hello from server.env!
  23. 27 デフォルトの優先順位 400 の構成の取得 n Enterprise Explorer で config-demo >

    src > main > liberty > config を右クリックし、 New > File をクリックする。 n File name: に jvm.options と記⼊して Finish をクリックする。 n エディターで jvm.options が開くので、–Dmessage=Hello from jvm.options! と記⼊して 保存する。 – 上の –Dmessage=Hello from jvm.options! をコピー & ペーストすると失敗します。キーボードから打ち込 んで下さい。 n これまでと同様に Web ブラウザー画⾯をリロードする。 27
  24. 30 カスタム構成ソースの例 n CustomConfigSource.java 30 package mpConfigDemo; import java.util.HashMap; import

    java.util.Map; import java.util.Set; import org.eclipse.microprofile.config.spi.ConfigSource; public class CustomConfigSource implements ConfigSource { private static final Map<String, String> configuration = new HashMap<>(); static { configuration.put("message", "Hello from CustomConfigSource!"); } @Override public int getOrdinal() { return 450; } @Override public Set<String> getPropertyNames() { return configuration.keySet(); } @Override public String getValue(String propertyName) { return configuration.get(propertyName); } @Override public String getName() { return CustomConfigSource.class.getSimpleName(); } }
  25. 31 カスタムの優先順位 450 の構成の取得 n Enterprise Explorer で config-demo >

    src > main > webapp を右クリックし、New > Folder をクリックする。 n Folder name: に META-INF と記⼊して Finish をクリックする。 n 同様にして META-INF フォルダ内に services フォルダを作成する。 n services フォルダを右クリックし、New > File をクリックする。 n File name: に org.eclipse.microprofile.config.spi.ConfigSource と記⼊して Finish をクリッ クする。 n エディターが開くので、mpConfigDemo.CustomConfigSource と記⼊して保存する。 n これまでと同様に Web ブラウザー画⾯をリロードする。 31
  26. 33 動的構成ソース n 値を取得するタイミングで値が変化する構成ソース。 n ConfigSource 内で値を取得する処理は getValue() 内か getValue()

    から呼ばれる場所に書く。 – 前の例のように Static イニシャライザに書いたりすると…? n @Inject @ConfigProperty で ConfigSource から値を取得する場合、 jakarta.inject.Provider<T> を⽤いる。 33 @Inject @ConfigProperty(name="time", defaultValue="Failed to get time.") private Provider<String> time; @Override public String getValue(String propertyName) { configuration.put("time", DateFormat.getTimeInstance(DateFormat.LONG).format(new Date())); return configuration.get(propertyName); }
  27. 34 動的構成ソースの例 n TimeCustomConfigSource.java 34 package mpConfigDemo; import java.text.DateFormat; import

    java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.eclipse.microprofile.config.spi.ConfigSource; public class TimeCustomConfigSource implements ConfigSource { private Map<String, String> configuration = new HashMap<>(); @Override public Set<String> getPropertyNames() { return configuration.keySet(); } @Override public String getValue(String propertyName) { configuration.put("time", DateFormat.getTimeInstance(DateFormat.LONG).format(new Date())); return configuration.get(propertyName); } @Override public String getName() { return TimeCustomConfigSource.class.getSimpleName(); } }
  28. 35 @Inject @ConfigProperty を使⽤した構成の取得 n TimeConfig.java 35 package mpConfigDemo; import

    org.eclipse.microprofile.config.inject.ConfigProperty; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.inject.Provider; @ApplicationScoped public class TimeConfig { @Inject @ConfigProperty(name="time", defaultValue="Failed to get time.") private Provider<String> time; public Provider<String> getTime() { return time; } }
  29. 36 @Inject @ConfigProperty を⽤いて取得した構成の表⽰ n TimeServlet.java 36 package mpConfigDemo; import

    java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.inject.Inject; @WebServlet("/TimeServlet") public class TimeServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Inject TimeConfig config; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append(config.getTime().get()); } }
  30. 37 org.eclipse.microprofile.config.spi.ConfigSource への実装クラス名の記載 n config-demo > src > main >

    webapp > META-INF > services > org.eclipse.microprofile.config.spi.ConfigSource をダブルクリックして開く。 n 2⾏⽬に以下を追記して保存する。 37 mpConfigDemo.TimeCustomConfigSource
  31. 39 デモ環境の初期化 n 次のセクションのデモのために、これまで作成したものの⼀部を削除する。 n config-demo > src > main

    内の以下のファイルを右クリックして Delete する。 – liberty > config > server.env – webapp > META-INF > services > org.eclipse.microprofile.config.spi.ConfigSource 39
  32. 41 構成プロファイル n 例えば環境ごと (開発、テスト、本番など) に同じ名前の構成を使い分けることができる。 n 構成プロファイルの指定⽅法は以下の 2つがある。 –

    プロパティ・レベル • 構成プロパティ名の前に %<プロファイル名>. を付加する – 構成ソース・レベル • 優先順位 100 のデフォルト構成プロパティで、ファイル名を microprofile-config-<プロファイル名>.properties とする。 41
  33. 42 プロパティ・レベルの構成プロファイル n config-demo > src > main> webapp >

    META-INF > microprofile-config.properties を 開いて、以下の内容となるように編集して保存する。 n config-demo > src > main > liberty > config > jvm.options を開いて、以下の内容で保 存する。 42 message=Hello from microprofile-config.properties! %dev.message=Hello from microprofile-config.properties for dev. %test.message=Hello from microprofile-config.properties for test. %prod.message=Hello from microprofile-config.properties for prod. -Dmp.config.profile=dev
  34. 43 プロパティ・レベルの構成プロファイルのテスト n Web ブラウザーを開いて http://localhost:9080/config-demo/MessageServlet へアクセス する。 n 以下が表⽰されれば、ここまでの作業は成功となる。

    n 他の構成プロファイル (test, prod) も同様にして試す。 – 構成プロファイルを指定しない (jvm.options ファイルを空に、もしくは削除した) 場合は…? – 削除した場合は r > <Enter> でテストサーバーを再起動する。 43
  35. 44 構成ソース・レベルの構成プロファイル n config-demo > src > main > webapp

    > META-INF 内に以下のファイルを作成する。 – microprofile-config.properties: – microprofile-config-dev.properties: – microprofile-config-test.properties: – microprofile-config-prod.properties: n config-demo > src > main > liberty > config > jvm.options を開いて、以下の内容で保存 する。 44 message=Hello from microprofile-config.properties! message=Hello from microprofile-config-dev.properties! message=Hello from microprofile-config-test.properties! message=Hello from microprofile-config-prod.properties! -Dmp.config.profile=dev
  36. 45 構成ソース・レベルの構成プロファイルのテスト n Web ブラウザーを開いて http://localhost:9080/config-demo/MessageServlet へアクセス する。 n 以下が表⽰されれば、ここまでの作業は成功となる。

    n 他の構成プロファイル (test, prod) も同様にして試す。 – 構成プロファイルを指定しない (jvm.options ファイルを空に、もしくは削除した) 場合は…? – 削除した場合は r > <Enter> でテストサーバーを再起動する。 45
  37. 48 値のコンバーターについて 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 独⾃のコンバーターも追加できる 48 @Inject @ConfigProperty(name="jp.test.intvalue") private int intValue; int intValue = config.getValue("jp.test.intvalue", Integer.class);
  38. 49 組み込みのコンバーターについて n boolean, java.lang.Boolean – 値が"true", "1", "YES", "Y",

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

    以下のように構成されている状況で「server.url」を取得すると 「http://example.org/foo」という値が取得される n 再帰的値取得の回数は有限 – 仕様では 5回が推奨されているが、実装依存 – 制限回数を超えた場合は IllegalArgumentException が throw される 51 server.url=http://example.org/${server.endpoint} server.endpoint=${server.endpoint.path.${server.endpoint.path.bar}} server.endpoint.path.foo=foo server.endpoint.path.bar=foo
  40. 52 Config API は頻繁に実⾏してもよい? n Java 8 では、⼀旦取得した値はアプリケーション側で使い回した⽅がよい。 – Java

    11 以降は (おそらく) 気にしなくてよい n 構成ソースがシステム・プロパティーの場合、Config.getValues() の裏で System.getProperties() が実⾏されている。 n System オブジェクトではシステム・プロパティーは java.util.Properties に格納されている。 – Java 8 では Properties の実体は Hashtable – Java 11 では Properties の実体は ConcurrentHashMap n 違いは次ページに public class SysPropConfigSource extends AbstractConfigSource { ... private static Map<String, String> getSystemProperties() { return unmodifiableMap(propertiesToMap(doPrivileged((PrivilegedAction<Properties>) System::getProperties))); } } https://github.com/smallrye/smallrye-config/blob/main/implementation/src/main/java/io/smallrye/config/SysPropConfigSource.java
  41. 53 Java 8 と Java 11 の Properties.java n Java

    8 n Java 11 53 public class Properties extends Hashtable<Object,Object> { ... public String getProperty(String key) { Object oval = super.get(key); String sval = (oval instanceof String) ? (String)oval : null; return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval; } ... public class Properties extends Hashtable<Object,Object> { ... private transient volatile ConcurrentHashMap<Object, Object> map; ... public String getProperty(String key) { Object oval = map.get(key); String sval = (oval instanceof String) ? (String)oval : null; Properties defaults; return ((sval == null) && ((defaults = this.defaults) != null)) ? defaults.getProperty(key) : sval; } ...
  42. 55 MicroProfile 5.0 を試せる OSS アプリケーション・サーバー n このページの執筆⽇ (2022/08/18) 現在、以下のもの。

    – https://microprofile.io/compatible/5-0/ n Open Liberty (EPL: Eclipse Public License) – https://openliberty.io/start/#runtime_releases – 22.0.0.1 またはそれ以降 55
  43. 56 Open Liberty をお薦めする理由 n 構成ファイルを書き換え、必要に応じて Feature を追加するだけで、 Java EE

    7/8, Jakarta EE 8/9.1 のどれでも利⽤できる。 – 今後、Jakarta EE 10 対応のバージョンが出ても、当分は Java EE の API を使⽤し続けられる。 – 構成ファイル (server.xml) で、使⽤するバージョンの Feature を指定するだけ。 n MicroProfile も、Java EE / Jakarta EE と組み合わせて使⽤できる。 – MicroProfile 1.0 / 1.2 / 1.3 / 1.4 / 2.0 / 2.1 / 2.2 / 3.0 / 3.2 / 3.3 / 4.0 / 4.1 / 5.0 のどれでも利⽤できる。 n Jakarta EE 9.1 参照実装 – Jakarta EE 10 でも参照実装の⼀つになる予定 56 <featureManager> <feature>jakartaee-9.1</feature> <feature>microProfile-5.0</feature> </featureManager> <featureManager> <feature>javaee-8.0</feature> </featureManager>
  44. 57 本⽇のまとめ n Javaでマイクロサービスを実装する際に必要な機能を標準化した MicroProfile という API 群がある。 – 最新は

    5.0 で Jakarta EE 9.1 に対応している。 – MicroProfile 独⾃の API 群と、Java / Jakarta EE と共通の API 群から構成される。 n 構成情報の外部化に Config API を使⽤することができる。 – Java のコードには⼀切変更を加えることなく、さまざまな箇所 (構成ソース) に記載された構成情報を読み込むことができた。 – 構成ソースには優先順位がある。 n デフォルト構成ソースに加えて、カスタム構成ソースを作成して使⽤することができる。 – 優先順位も設定できる n 動的に値が変化する動的構成ソースを作成して使⽤することができる。 n 構成プロファイルを使⽤すると、システム・プロパティで環境 (開発、テスト、本番など) を指定することが できる。 n Java / Jakarta EE と MicroProfile は「択⼀」ではない (と思う)。 – Java / Jakarta EE アプリケーションでも有⽤な MicroProfile の API がある。 – Config API で⼊⼿した構成情報を、サーブレットを⽤いて Web ブラウザーに表⽰した。 57
  45. 59 ⽂献 n Configuration for MicroProfile - 3.0, October 27,

    2021 Final – https://download.eclipse.org/microprofile/microprofile-config-3.0/microprofile-config-spec-3.0.html n MicroProfile Config API v3.0 – https://download.eclipse.org/microprofile/microprofile-config-3.0/apidocs/ n External configuration of microservices – https://openliberty.io/docs/latest/external-configuration.html n SmallRye Config – https://smallrye.io/smallrye-config/ 59