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

IBM Liberty Dojo (4) MicroProfile を触ろう

babatch
August 02, 2022

IBM Liberty Dojo (4) MicroProfile を触ろう

connpass でのセッション (https://ibm-developer.connpass.com/event/253664/) の Deck です。
2022/08/02 14:30 に更新しています。これ以前にダウンロードされた方は、お手数ですが再度ダウンロードと内容のご確認をお願いします。
(IDE に Eclipse を使用し、IBM Liberty Developer Tools を使用するように変更しています。)

babatch

August 02, 2022
Tweet

More Decks by babatch

Other Decks in Programming

Transcript

  1. 2 Liberty Dojo n 過去回の資料・動画はこちらへ – https://ibm-developer.connpass.com/ 2 日時 タイトル

    担当 2022/6/28(火) 17:00-18:00 Cloud Nativeの世界でもJava EE を使える! OSSの実行環境 Open Liberty 田中 孝清 2022/7/12(火) 17:00-18:00 Libertyの基本的な構成方法 田中 孝清 2022/7/20(水) 13:00-14:00 tWASからLibertyへのモダナイズ カスタマーサクセス マネージャ有志 2022/8/2(火) 17:00-18:00 MicroProfileを触ろう 馬場 剛
  2. 4 本⽇の内容 n MicroProfile について n 今回の「触ってみよう」について n さっそく触ってみましょう! n

    アンケート – https://app.sli.do/event/b6BbfS8hzwyhCFVBVCoJ1s 4 ご意⾒ご感想、どしどしお寄せ下さい!
  3. 5 本編に⼊る前に IBM Liberty Developer Tools のインストール n Eclipse を起動する。

    – ワークスペースを尋ねられた場合は空のディレクトリを必要に応じ て作成して指定する。 – Welcome 画⾯が表⽰された場合は を押す。 n Eclipse メニューから Help > Eclipse Marketplace... を選 択する。 n Find: に Liberty と⼊⼒して Enter を押す。 n IBM Liberty Developer Tools 22.1 (執筆⽇時点) の Install ボタンを押す。 n Confirm> ボタンを押す。 n Finish ボタンを押す。 n (3-5分程度待つ) n Restart Eclipse IDE to apply the software update? に対 して Restart Now を押す。 5
  4. 7 MicroProfile n Javaでマイクロサービスを実装する際に必要な機能を標準化 n 世の中では、Java EEと排他的な選択肢と思われている 例) MicroProfileで⼗分なアプリ →

    MicroProfileを使う Java EEが必要なアプリ → Java EEを使う n 実際には、Java EEで使っても有⽤な機能が多い n 進化がとても早いのが特徴 7 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 JavaでRESTful APIを作成するための仕様 2021/12 MicroProfile 5.0
  5. 8 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
  6. 9 MicroProfile 5.0 機能⼀覧 9 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 アノテーションによりアプリケーションに対して情報を 提供する。
  7. 10 MicroProfileの世間の評価は・・・ n 「良い仕様だが、これだけでは業務アプリケーションは作れない」 → Libertyならば,Java/Jakarta EE仕様の機能と⾃由に組み合わせられる (Java/Jakarta EEと同⼀ランタイムで提供している強み) n

    「更新が早すぎて、業務アプリケーションで使⽤するにはバージョンアップ対応が⼤変」 → Libertyならば、ゼロマイグレーション・ポリシーがあるので安⼼して利⽤できる 10 by Oracle by Red Hat Java/Jakarta EE MicroProfile MicroProfileを利⽤するならばLibertyが最適 ※1 ※1 XP (Expansion Pack) による MicroProfile サポートあり
  8. 11 Libertyならば,マイクロサービスのパフォーマンスも最⾼です n Javaマイクロサービスの ベンチマークソフト Acme Air Microservices による計測 n

    メモリフットプリントは 同系ソフトの中で最低 n スループットは, 同系ソフトの中で最⾼ 11 https://openliberty.io/blog/2020/10/21/memory-footprint-throughput.html
  9. 13 今回の「触ってみよう」について n 全 13 種の API から、今回は Config を触ってみます。

    – 「どこで誰と稼働するかわからない」クラウド環境において、構成情報の外部化は重要! • 稼働環境ごとに異なるコードを書いて、稼働環境ごとにリコンパイルすることを避けたい。 – 扱いが⽐較的容易 & 結果がわかりやすい! n 触ってみるための前提条件 – Eclipse IDE for Enterprise Java and Web Developers • IBM Liberty Developer Tools を導⼊します。 – お好みの Java SE 17 • IBM Semeru Runtimes は以下で⼊⼿可能。 – https://developer.ibm.com/languages/java/semeru-runtimes/downloads/ • ご⾃⾝の OS, Architecture にあったものを選択。 • インストールして、java コマンドにパスを通すか、JAVA_HOME を設定しておく。 • ハンズオン開発は IBM Semeru Runtimes を使⽤しています。 – Maven • 最新のものをダウンロード、展開して、mvn コマンドにパスを通しておく。 – Git • 最新のものをダウンロード、インストールして、git コマンドにパスを通しておく。 – インターネット接続 13 不要に なりました!
  10. 14 Javaアプリケーションから「構成情報」を取得する⽅法は,さまざま 1 4 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"); プロパティファイルから取得 システム・プロパティから取得 環境変数から取得
  11. 15 MicroProfile︓Config APIなら 1 5 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; 構成ソースさえ切り替えれば 同じコードであらゆる場所から構成情報を取得できる
  12. 16 Open Liberty における構成ソースのデフォルトの優先順位 n 優先順位の値が⼤ → 優先度が⾼い – 開発初期などは低優先順位の構成ソースを使⽤し、実働環境などでは⾼順位のものを使⽤すると便利。

    16 構成ソース デフォルトの 優先順位 構成ファイル の例 値の例 Open Liberty の server.xml 内での application または webApplication 要素の、appProperties 内の property 要素 600 server.xml <appProperties> <property name=”message" value=”hoge"/> </appProperties> Open Liberty の server.xml 内の variable 要素 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 Open Liberty の server.xml 内での variable 要素の defaultValue 1 server.xml <variable name=“message” value=“hoge” /> MicroProfile Config 3.0 仕様での定義
  13. 17 本⽇のハンズオン n Config API を使⽤して構成情報を取得するコードを書く。 n まずは @ConfigProperty の

    defaultValue の値を取得してみる。 – 指定した名前の構成情報がどこにもない場合のデフォルトの値。 n 優先順位の低い構成ソースから順に、同じ名前で異なる値を設定してみる。 ⇒ コードを⼀切変更することなく、順に異なる値が取得されるはず。 17
  14. 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 ボタンを押してダウンロード!
  15. 20 スターター・アプリケーションの展開 n 展開⽤ディレクトリを作成して展開する。 20 Tech_Dojo % mkdir config-demo Tech_Dojo

    % cd config-demo config-demo % unzip ../config-demo.zip Archive: ../config-demo.zip creating: src/main/java/com/ibm/demo/ inflating: src/main/liberty/config/server.xml inflating: Dockerfile inflating: .dockerignore inflating: src/main/java/com/ibm/demo/rest/RestApplication.java inflating: README.txt inflating: .mvn/wrapper/maven-wrapper.jar inflating: .mvn/wrapper/maven-wrapper.properties inflating: mvnw inflating: mvnw.cmd inflating: pom.xml inflating: .gitignore
  16. 21 スターター・アプリケーションのインポート n Enterprise Explorer の空いているところで右クリックし、 Import > Import... を選択し、開いた画⾯でMaven

    > Existing Maven Projects をクリックする。 n Root Directory の右側の Browse... をクリックし、先ほどス ターター・アプリケーションを展開したディレクトリを指定 して Finish ボタンを押す。 21
  17. 22 @Inject @ConfigProperty を使⽤した構成の取得 n Enterprise Explorer で config-demo >

    src > main > java を右クリックして New > Folder をクリックする。 n 開いた画⾯で Folder name: に mpConfigDemo と⼊⼒して Finish をクリックする。 n 作成した mpConfigDemo フォルダを右クリックして、New > Other をクリックする。 n 開いた画⾯で Class を選択して Next> をクリックする。 n 次の画⾯で Name: に MessageConfig と記⼊して Finish を クリックする。 22
  18. 23 @Inject @ConfigProperty を使⽤した構成の取得 n エディターで MessageConfig.java が開くので、コード全体を以下で置き換えて保存する。 23 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; } }
  19. 24 @Inject @ConfigProperty を⽤いて取得した構成の表⽰ n 同様に mpConfigDemo フォルダを右クリックして、New > Other...

    をクリックする。 n 開いた画⾯で Web > Servlet を選択して Next> をクリックする。 n Class name: に MessageServlet と記⼊して Finish をクリックする。 n MessageServlet.java がエディターで開くので、コード全体を以下で置き換えて保存する。 24 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; /** * Servlet implementation class 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 { // TODO Auto-generated method stub response.getWriter().append(config.getMessage()); } }
  20. 25 pom.xml の内容確認 n Enterprise Explorer で config-demo > pom.xml

    をダブルクリックして開く。 – ここで pom.xml を正常に開くことができた場合は、内容を確認して次のページへ進む。 – pom.xml が正常に開かなかった場合は、以下の⼿順を実⾏して次のページに進む。 • メニューバーから Help > Install New Software... をクリックする。 • 開いた画⾯で Work with: に http://download.eclipse.org/tm4e/releases/latest を記⼊して Enter を押す。 • TextMate > TexeMate Core のみにチェックを⼊れて Next> をクリックする。 • 次の画⾯で Finish をクリックする。 • しばらくすると Restart Eclipse IDE to apply the software update? と表⽰されるので Restart Now をクリックする。 • pom.xml を正常に開くことができるか確認する。 • pom.xml の内容を確認する。 25 <plugin> <groupId>io.openliberty.tools</groupId> <artifactId>liberty-maven-plugin</artifactId> <version>3.5.2</version> </plugin> ◎ 右の部分 (コメントは除いてある) が Open Liberty の Maven Plugin 構成 • <configuration> で <runtimeArtifact> を指定しない場合、最新 の Open Liberty runtime kernel がサーバーとして使⽤される。 • <runtimeArtifact> についての詳細は以下。 – https://github.com/OpenLiberty/ci.maven/blob/main/docs/instal lation-configuration.md • Open Liberty の Maven Plugin 全体については以下。 – https://github.com/OpenLiberty/ci.maven
  21. 26 Liberty フィーチャーの構成 (1) n Enterprise Explorer で ServletSample >

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

    下のようになっていることを確認して保存する。 – Liberty フィーチャーについて詳細は以下とその⼦⽂書を参照。 • https://openliberty.io/docs/latest/reference/feature/feature-overview.html 27 <featureManager> <feature>jakartaee-9.1</feature> <feature>microProfile-5.0</feature> <feature>cdi-3.0</feature> </featureManager>
  23. 28 @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 以下が表⽰されれば、ここまでの作業は成功となる。 28 [INFO] [監査 ] CWWKT0016I: Web アプリケーションが使⽤可能です (default_host): http://localhost:9080/config-demo/ [INFO] [監査 ] CWWKZ0003I: アプリケーション config-demo が 0.501 秒で更新されました。
  24. 29 ここまでのおさらい n ここまでの作業を振り返って、何を実施したのか考えてみましょう。 – “@” で始まるアノテーションの機能 – server.xml の

    <featureManager> タグ内の各フィーチャーの機能 – 表⽰されたメッセージはどこに書いてあったものか 29 この先、./mvnw liberty:dev コマンドを実⾏した際、およびサーバーを再起動した際に下のようなエラーが 出ることがありますが、今⽇は気にしなくて構いません。(SSL を使⽤しないため) [INFO] [エラー ] CWWKS9582E: ID が defaultOrb の orb エレメントで必要な [defaultSSLConfig] sslRef 属性が 10 秒以内で解決されませんでした。このため、アプリケーションは 始動しません。keyStore エレメントを組み込んだこと、およびその Secure Sockets Layer (SSL) が正 しく構成されていることを確認してください。sslRef が defaultSSLConfig の場合、ID が defaultKeyStore の keyStore エレメントおよびパスワードを追加してください。
  25. 30 デフォルトの優先順位 1 (最低) の構成の取得 n Enterprise Explorer で config-demo

    > src > main > liberty > config > server.xml をダブ ルクリックして開く。 n 最下⾏の </server> の直前の⾏に下の内容を記載して保存する。 n Liberty dev モードを実⾏している (./mvnw liberty:dev を発⾏した) ターミナルで、r と Enter を順に押してサーバーを再起動する。 n 先ほどの Web ブラウザー画⾯をリロードする。 30 <variable name="message" defaultValue="Hello from defaultValue of variable in server.xml!"/>
  26. 31 デフォルトの優先順位 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 ブラウザー画⾯をリロードする。 31 message=Hello from microprofile-config.properties!
  27. 32 デフォルトの優先順位 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 ブラウザー画⾯をリロードする。 32 message=Hello from server.env!
  28. 33 デフォルトの優先順位 400 の構成の取得 n Enterprise Explorer で ServletSample >

    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 ブラウザー画⾯をリロードする。 33
  29. 34 デフォルトの優先順位 500 の構成の取得 n Enterprise Explorer で Servlet Sample

    > src > main > liberty > config > server.xml をダ ブルクリックして開く。 n 最下⾏の </server> の直前の⾏に、以下の内容を記載して保存する。 n これまでと同様にしてサーバーを再起動 (r > Enter) し、Web ブラウザー画⾯をリロードする。 34 <variable name="message" value="Hello from value of variable in server.xml!"/>
  30. 35 デフォルトの優先順位 600 (最⾼) の構成の取得 n 前ページと同様にして server.xml を開く。 n

    <webApplication contextRoot="/config-demo" location="config-demo.war" /> の 1⾏を、 下の 5⾏で置き換える。 n これまでと同様にしてサーバーを再起動 (r > Enter) し、Web ブラウザー画⾯をリロードする。 35 <webApplication contextRoot="/config-demo" location="config-demo.war"> <appProperties> <property name="message" value="Hello from valueof property in appProperties in server.xml!"/> </appProperties> </webApplication> > の直前の / は削除する
  31. 36 本⽇のまとめ n Javaでマイクロサービスを実装する際に必要な機能を標準化した MicroProfile という API 群が ある。 –

    最新は 5.0 で Jakarta EE 9.1 に対応している。 – MicroProfile 独⾃の API 群と、Jakarta (Java) EE と共通の API 群から構成される。 n 本⽇のハンズオンでは Config API を触ってみた。 – Java のコードには⼀切変更を加えることなく、さまざまな箇所 (構成ソース) に記載された構成情報 (本⽇のハ ンズオンでは message) を読み込むことができた。 – 構成ソースには優先順位がある。 – Config API で⼊⼿した構成情報を、サーブレットを⽤いて Web ブラウザーに表⽰した。 n Jakarta (Java) EE と MicroProfile は「択⼀」ではない。 – Jakarta (Java) EE アプリケーションで有⽤な MicroProfile の API がある。 n Open Liberty (WebSphere Liberty) なら Java EE と MicroProfile を⼀つのランタイムで併⽤ することができる! – ゼロ・マイグレーション・ポリシーでマイグレーションも安⼼! – マイクロサービスのパフォーマンスも最⾼! 36