Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界

111 views

Published on

Oracle Cloud Hangout Cafe (a.k.a. OCHa Cafe) #4
「Cloud Native時代のモダンJavaの世界」のセッション資料です。
https://ochacafe.connpass.com/event/155389/

マイクロサービスのためのEnterprise Javaの仕様 Eclipse MicroProfile と、Oracleが提供するMicroProfile準拠OSSである Helidon について解説しています。
(表示品質が悪かったので再掲しました)

* P.49 "Oracle Integration Cloud Service" は ”Oracle Identity Cloud Service” の誤りです.

Published in: Software
  • Be the first to comment

OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界

  1. 1. Eclipse MicroProfile と Helidon MP OCHaCafe Season 2 - #4 Cloud Native時代のモダンJavaの世界 Senior Director Oracle Corporation Japan December 19th, 2019 Tadahisa Kotegawa
  2. 2. 2 The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, timing, and pricing of any features or functionality described for Oracle’s products may change and remains at the sole discretion of Oracle Corporation. Statements in this presentation relating to Oracle’s future plans, expectations, beliefs, intentions and prospects are “forward-looking statements” and are subject to material risks and uncertainties. A detailed discussion of these factors and other risks that affect our business is contained in Oracle’s Securities and Exchange Commission (SEC) filings, including our most recent reports on Form 10-K and Form 10-Q under the heading “Risk Factors.” These filings are available on the SEC’s website or on Oracle’s website at http://www.oracle.com/investor. All information in this presentation is current as of September 2019 and Oracle undertakes no duty to update any statement in light of new information or future events. Safe harbor statement
  3. 3. 3 古手川 忠久 日本オラクル株式会社 クラウドソリューション推進本部 (英語名: Cloud Pursuit) 自己紹介 OCHa Cafeの紹介記事です! https://codezine.jp/article/detail/11762 CodeZine: 「クラウドネイティブ時代の技術 が学べる「OCHaCafe」とは?~注目の多言 語対応ランタイムGraalVMの勉強会に潜入」 @tkotegaw tkote oracle-japan
  4. 4. 4 5 4 3 2 1 まとめ Helidon MP が提供する MicroProfile 以外の機能 MicroProfile 詳説 MicroProfile の概要と Helidon MP Program agenda
  5. 5. 5 https://github.com/oracle-japan/ochacafe-microprofile-demo 本日のデモのソースはこちら 1. JDKをセットアップ 2. Gitをセットアップ 3. Mavenをセットアップ 4. あとは、以下のコマンドをたたけば動きます git clone https://github.com/oracle-japan/ochacafe-microprofile-demo.git cd ochacafe-microprofile-demo mvn compile exec:java
  6. 6. 6 ところで、Javaって難しい言語ですか? ググってみた… (苦笑…) 「Javaは他のメジャーなプログラミング言語と比較して複雑です」 「『下手なプログラミング』を行うと目も当てられないような状態になります」 「JavaとC言語は個人ビジネスには向いていません」 「Java言語を扱う企業にブラック企業が多いと言われ...」
  7. 7. 7 MicroProfile の概要 と Helidon MP
  8. 8. 8 The MicroProfile is a baseline platform definition that optimizes Enterprise Java for a microservices architecture and delivers application portability across multiple MicroProfile runtimes. (訳) MicroProfileはエンタープライズJavaをマイクロサービス・アーキテクチャの ために最適化させたベースラインとなるプラットフォーム定義で、複数の MicroProfileランタイム間のポータビリティを提供するものです。 What is the MicroProfile? https://microprofile.io/faq/ より抜粋
  9. 9. 9 PolyglotなMicroservices環境のなかで協調して動く(= Microservices各種標準に 準拠する、 Microservicesのデザインパターンを実装する)Javaアプリケーショ ンの開発に必要な機能を、フレームワークとして規定したもの。 開発者はビジネスロジックの実装に集中でき、効率的な開発ができる。 基盤となる実装は、MicroProfileプロバイダの品質維持・向上を期待できる。 MicroProfile: 自分なりの言葉で表現すると… OpenMetrics OpenTracing OpenAPI Circuit Breaker Bulk Head Health Check
  10. 10. 10 MicroProfile Config 1.3 MicroProfile Fault Tolerance 2.0 MicroProfile Health 2.1 MicroProfile JWT Authentication 1.1 MicroProfile Metrics 2.2 MicroProfile OpenAPI 1.1 MicroProfile OpenTracing 1.3 MicroProfile Rest Client 1.3 Eclipse MicroProfile 3.2 (Nov. 1st, 2019) CDI 2.0 Common Annotations 1.3 JAX-RS 2.1 JSON-B 1.0 JSON-P 1.1 Java EE 8 由来MicroProfile 固有
  11. 11. 11 OSS プロジェクト Microservicesを開発するためのJavaライブラリの集合体 単体のJVMとして動作。アプリケーションサーバー不要 従来からの一般的なツールで開発できる(Java SE, Maven, Docker, Kubernetes, etc.) 2つのプログラミングモデル • Helidon MP: 宣言的な記法、Java EE開発者フレンドリー • Helidon SE: 関数型の記法 Eclipse MicroProfile実装(MP) Oracle Cloudとのインテグレーション(将来的に実装される予定) Project Helidon ※ Helidonは ギリシア語でつばめ(swallow)を意味します Helidon は1.4.0(Nov. 22nd, 2019)でMicroProfile 3.2に対応!
  12. 12. 12 Helidonのポジショニング Full Stack MicroProfile based Microframeworks Helidon MP Helidon SE
  13. 13. 13 HelidonはOpen Sourceのプロジェクト • Apache 2.0 License Open Sourceとしてのサポートを提供中 • Web Site with guides and tutorials: https://helidon.io • StackOverflow: https://stackoverflow.com/tags/helidon • Public Slack channel: https://helidon.slack.com • GitHub issues tracker: https://github.com/oracle/helidon/issues Oracleによる商用サポートについて • WebLogic Serverライセンス保有のお客様にHelidonのサポート提供を表明 • Helidon単独のサポート提供を検討中 Helidonのサポートについて
  14. 14. Hybrid Application and Environment Management Copyright © 2019 Oracle and/or its affiliates. Hybrid Applications in Hybrid Environments Oracle Enterprise Java Vision – AppDev Platform Open Operating Systems Cloud Native Environment Java Microservices Polyglot microservicesTraditional Applications Public Cloud Private Cloud Hybrid Cloud Operators
  15. 15. 15 色々ご意見あると思いますが… Helidon (MicroProfile) と WebLogic Server (Java EE) の使い分け Web Front Proxy Server Browser Database WebLogic Server servlet MVC JDBC WLS JTA JMS global transaction management Web Front Proxy Server API GW Browser Mobile App IoT DatabaseHelidon JAX-RS SPA/MVVC JDBC Microservices REST Client JAX-RS Java EE MicroProfile WLS ajax etc. Static contents EJB global transaction management Outer Systems (often XA resources)
  16. 16. 16 とりあえず Quickstart MPから https://helidon.io/docs/latest/#/guides/03_quickstart-mp 書いてある通りにMavenプロジェクトを作って動かしていけば、以下のようなことができる • サンプルコードのコンパイル/パッケージングと実行 • Dockerイメージの作成 (Dockerの動作環境が必要) • Kubernetesクラスタへのデプロイ (Kubernetesクラスタとkubectlツールが必要) 一通り感覚をつかんだら、MicroProfile関連のHelidonドキュメントに目を通す https://helidon.io/docs/latest/#/microprofile/01_introduction GitHubも覗いてみる – https://github.com/oracle/helidon • examplesディレクトリに各種コードあり helidon.io Helidon MP の始め方
  17. 17. 17 MicroProfile 詳説
  18. 18. 18 REST APIのインターフェースとロジック実装のための基本部分 CDI, Common Annotations, JAX-RS, JSON-B, JSON-P @ApplicationScoped @Path("/echo") public class EchoResource{ @Inject @ConfigProperty(name = “echo.reply", defaultValue = "Hi!") private String reply; @POST @Produces(MediaType.APPLICATION_JSON) public Response handleRequest(Message message, @Context UriInfo uriInfo) { JsonObject json = Json.createObjectBuilder() .add("url", uriInfo.getRequestUri().toASCIIString()) .add("text", message.text) .add(“reply", reply) .build(); return Response.ok(json.toString()).build(); } } CDI JSON-BJSON-P JAX-RS JAX-RS CDI JAX-RS JAX-RS MicroProfile Config
  19. 19. JAX-RS –The Java API for RESTful Web Services RESTfulを実装するAPIセット Plain Old Java Object(POJO)をアノテーションによって修飾 歴史 • Oracleがスペックリード • 2008年: JAX-RS 1.0 (JSR 311) リリース - Java EE 6 (JSR 316) • 2013年: JAX-RS 2.0 (JSR 339) リリース - Java EE 7 (JSR 342) • 2018年: JAX-RS 2.1 (JSR 370) リリース - Java EE 8 (JSR 366) JAX-RS実装 • Jersey (リファレンス実装), RESTEasy, Apache CXF, etc. 19
  20. 20. 20 (超ざっくり言うと) コンポーネント間の依存性注入(DI)とそのスコープ(ライフサイクル)を管理する 依存性注入(DI) • (超ざっくり言うと)ダイナミックなオブジェクト参照を可能にすること Contexts and Dependency Injection (CDI) @Inject @ConfigProperty(name = “echo.reply", defaultValue = "Hi!") private String reply; ソースにはreply(参照型の変数)を初期化している箇所は無い CDIコンテナが実行(デプロイ)時にいい感じにオブジェクトを差し込んでくれる
  21. 21. 21 Java API for JSON Processing (JSON-P) • オブジェクト・モデルAPI - メモリー内でJSONデータを示すツリーを作成 • ストリーミング・モデルAPI - 要素を読み取るイベント・ベースのパーサーを使用 Java API for JSON Binding (JSON-B) • JavaオブジェクトとJSONの相互変換(バインディング)を行う JavaのJSON処理標準
  22. 22. 22 アプリケーションの定義情報を設定・取得するためのMP全般にわたる統一的仕様 設定情報(複数指定可能) • システム・プロパティ (優先順位=400) • 環境変数 (優先順位=300) • /META-INF/microprofile-config.properties (優先順位=100, config_ordinalで変更可) • ConfigSourceインターフェースの実装クラス(優先順位=任意) • ConfigSourceProviderインターフェースの実装クラス(優先順位=任意) MicroProfile Config com.acme.myproject.someserver.url = http://some.server/some/endpoint com.acme.myproject.someserver.port = 9085 com.acme.myproject.someserver.active = true com.acme.other.stuff.name = Karl com.acme.myproject.notify.onerror=karl@mycompany,sue@mcompany some.library.own.config=some value 基本コレ microprofile-config.propertiesを上書きできる
  23. 23. 23 MicroProfile Config – 使用例 @ApplicationScoped public class InjectedConfigUsageSample { @Inject private Config config; @Inject @ConfigProperty(name="myprj.some.url") private String someUrl; @Inject @ConfigProperty(name="myprj.some.port") private Optional<Integer> somePort; @Inject @ConfigProperty(name="myprj.some.dynamic.timeout", defaultValue="100") private javax.inject.Provider<Long> timeout; @Inject @ConfigProperty(name="myPets") private String[] myArrayPets; @Inject @ConfigProperty(name="myPets") private List<String> myListPets; @Inject @ConfigProperty(name="myPets") private Set<String> mySetPets; } myPets=dog,cat,dog,cat {“dog”, “cat”, “dog,cat”}
  24. 24. 24 文字列からターゲットのクラス型への変換 MicroProfile Config – Converter 種類 説明 Built-in • boolean and Boolean : “true”, “1”, “YES”, “Y” “ON” の場合 true (case insensitive) • int and Integer • long and Long • float and Float • double and Double • Class: Class.forName で生成されるクラス Custom Converterインターフェースの実装クラス Array Built-in/Custom Converterの配列への変換: デリミタ=, エスケープ= Automatic クラスTのオブジェクトが以下のいずれかの方法で生成できる場合 T.of(String) T.valueOf(String) new T(String) T.parse(CharSequence)
  25. 25. 25 REST APIロジック作成 基本部分全部入り - JAX-RS, CDI, Config, JSON-P, JSON-B /echo Demo
  26. 26. 26 耐障害性の高いMicroservicesシステム構築のための仕様 メソッドやクラスにアノテーションを付与して、障害発生時の振る舞いを設定する • 実装の仕組みは CDI Interceptor と同じ MicroProfile Fault Tolerance アノテーション 機能 Timeout メソッド実行が指定の時間に達した場合、例外(TimeoutException)を発生させる Retry メソッド実行の例外発生時、一定時間/回数処理を繰り返す Fallback メソッド実行の例外発生時、代替メソッドを呼び出す CircuitBreaker 例外発生が繰り返されるメソッドの実行を一時的に止めて、メソッドの処理を行う 前に例外(CircuitBreakerOpenException)を発生させる Bulkhead メソッドの同時実行数や(非同期実行の際の)待機キューの長さが指定の数を超え た場合、例外(BulkheadException)を発生させる Asynchronous メソッド実行を非同期(別スレッド)で行う
  27. 27. 27 メソッド or クラス にannotationを指定 Timeout発生時、TimeoutException をthrowする @Fallback, @CircuitBreaker, @Asynchronous, @Bulkhead, @Retryと併せて利用可能 MicroProfile Fault Tolerance – @Timeout @Timeout(400) // timeout is 400ms public Connection serviceA() { Connection conn = null; counterForInvokingServiceA++; conn = connectionService(); return conn; } parameter 説明 デフォルト Value タイムアウト時間 1000 unit タイムアウト時間の単位 (java.time.temporal.ChronoUnit) MILLIS
  28. 28. 28 メソッド or クラス に annotationを指定 @Fallback, @CircuitBreaker, @Asynchronous, @Bulkhead, @Timeout と併せて利用可能 MicroProfile Fault Tolerance – @Retry /** * jitterの変動値は-400ms~400msなので、リトライ間隔は0-800ms * 最低でも4回リトライするが、10回を超えてリトライはしない */ @Retry(delay = 400, maxDuration= 3200, jitter= 400, maxRetries = 10) public Connection serviceA() { return connectionService(); } parameter 説明 デフォルト maxRetries 最大リトライ回数 3 delay リトライ間隔 0 delayUnit 間隔時間の単位(java.time.temporal.ChronoUnit) MILLIS maxDuration 最大遅延時間 180000 durationUnit 遅延時間の単位 MILLIS jitter リトライ変動値 200 jitterDelayUnit 変動時間の単位 MILLIS retryOn リトライを実施する例外クラス Exception.class abortOn リトライを中止する例外クラス
  29. 29. 29 エラー時の代替処理指定方法1: FallbackHandlerクラスを指定する MicroProfile Fault Tolerance – @Fallback @Retry(maxRetries = 1) @Fallback(StringFallbackHandler.class) public String serviceA() { counterForInvokingServiceA++; return nameService(); } public interface FallbackHandler<T>{ T handle(ExecutionContext context); } FallbackHandler インターフェース Public class StringFallbackHandler implements FallbackHandler { public String handle (ExecutionContext context) { … } } 返り値の型は同じにする java.lang.reflect.Method getMethod​() java.lang.Object[] getParameters​() 呼び出されたメソッドとパラメータを取得可能
  30. 30. 30 エラー時の代替処理指定方法2: 代替メソッドを指定する • Annotateされたクラスからメソッドとして呼び出せること • 同じ型のパラメータ、返り値であること MicroProfile Fault Tolerance – @Fallback (cont.) @Retry(maxRetries = 2) @Fallback(fallbackMethod = "fallbackForServiceB") public String serviceB() { counterForInvokingServiceB++; return nameService(); } private String fallbackForServiceB() { return "myFallback"; }
  31. 31. 31 継続的な障害に対し、速やかにエラーを返すことによりレイテンシの増加や余分なリ ソース消費を回避する 3つの状態 “Closed” “Open” “Half-Open” MicroProfile Fault Tolerance – @CircuitBreaker Closed Open Half- Open requestVolumeThreshold & failureRatio delay successThreshold << fails >> 正常な状態 異常な状態 不安定な状態
  32. 32. 32 @Fallback, @Retry, @Asynchronous, @Bulkhead, @Timeout と併せて利用可能 MicroProfile Fault Tolerance – @CircuitBreaker (cont.) parameter 説明 デフォルト failOn 指定された例外を失敗とみなす(複数可) Throwable.cla ss delay サーキットがOpenからHalf-Openに移る時間 5000 delayUnit 間隔時間の単位 (java.time.temporal.ChronoUnit) MILLIS requestVolumeThreshold ローリング・ウィンドウとなる連続した リクエスト数 >= 1 20 failureRatio サーキットをOpenにする失敗率 0 < x < 1 0.5 successThreshold サーキットがCloseに移るための閾値 >= 1 1 /** * ローリング・ウィンドウとなる連続した4回の呼び出しのうち3回(4xfailureRatio=0.75)が失敗した場合 * サーキットはOpenとなる。サーキットは1,000msecの間Openの状態を保ったのちHalf-Openに遷移し、 * 以降10連続呼び出しが成功した場合にClosedとなる。そうでない場合は再びOpenに戻る。 */ @CircuitBreaker(successThreshold = 10, requestVolumeThreshold = 4, failureRatio = 0.75, delay = 1000) public Connection serviceA() { … }
  33. 33. 33 特定のサービスに発生した障害の影響がカスケード的に全体に波及するのを防ぐ セマフォ・スタイルとスレッドプール・スタイル MicroProfile Fault Tolerance – @Bulkhead // 最大5同時リクエストを許可 @Bulkhead(5) public Connection serviceA() { Connection conn = null; counterForInvokingServiceA++; conn = connectionService(); return conn; } // 最大5同時&待機キューに最大8リクエストを許可 @Asynchronous @Bulkhead(value = 5, waitingTaskQueue = 8) public Future<Connection> serviceA() { Connection conn = null; counterForInvokingServiceA++; conn = connectionService(); return CompletableFuture .completedFuture(conn); } セマフォ・スタイル スレッドプール・スタイル
  34. 34. 34 リクエストの処理を別スレッドで行う Future もしくは CompletionStage を返す (java.util.concurrent パッケージ) • 処理が完了するまで未完了のステータス – 両者で振る舞いが異なる • 耐障害性を考えると Future よりも CompletionStage が好ましい MicroProfile Fault Tolerance – @Asynchronous @Asynchronous @Retry public Future<Connection> serviceA() { CompletableFuture<U> future = new CompletableFuture<>(); future.completeExceptionally(new RuntimeException("Failure")); return future; } @Asynchronous @Retry public CompletionStage<Connection> serviceA() { CompletableFuture<U> future = new CompletableFuture<>(); future.completeExceptionally(new RuntimeException("Failure")); return future; } Retryは トリガーされる Retryは トリガーされない
  35. 35. 35 Configでパラメーターのオーバーライトや無効化が可能 * Configだけで新規にFault Tolerance を設定できる訳ではないので注意 • classname/methodname/annotation/parameter (メソッドレベル) • classname/annotation/parameter (クラスレベル) • annotation/parameter (システムレベル) • classname/methodname/annotation/enabled=false (有効/無効) • classname/annotation/enabled=false (有効/無効) • annotation/enabled=false (有効/無効) MicroProfile Fault Tolerance – Configによる制御 com.acme.test.MyClient/serviceA/Retry/maxDuration=3000 com.acme.test.MyClient/Retry/maxRetries=100 Retry/maxRetries=30 com.acme.test.MyClient/methodA/CircuitBreaker/enabled=false com.acme.test.MyClient/CircuitBreaker/enabled=true CircuitBreaker/enabled=false
  36. 36. 36 Istioのようなサービスメッシュに任せる? • サイドカー・パターン • 言語非依存、実装と設定を完全分離 • コントロールプレーンから環境全体をコントロール可能 • Fault Toleranceの他にも様々な機能を提供する • 稼働プロセスが2倍、故障可能ポイントも2倍?、導入にはそれなりの気合が必要そう… MicroProfile Fault Toleranceは? • MicroProfile 縛りだが、Java VMが稼働する環境であればどこでも使える • 中央集権的なコントロールプレーンは無い(良く言えば不要)、個々に設定必要 • Annotationを使うことによってソース内でビジネスロジックの実装からフォルトトレラン スの設定を分離している • Config(環境変数、-Dオプション)を使ってデプロイ時点で設定の制御も可能 Fault Tolerance はどこで実現すべきか? Service A Service B Envoy Envoy Istio control plane pod pod
  37. 37. 37 Bulkhead & Circuit Breaker - Circuit Breakerの状態遷移を確認する /ft Demo
  38. 38. 38 Kubernetesなどノードの状態を検査するプロセスに対してヘルスチェック情報を提供する MicroProfile Health @Liveness @Readiness public class MyCheck implements HealthCheck { public HealthCheckResponse call() { ... } } Annotation Path Function @Liveness /health/live Liveness @Readiness /health/ready Readiness @Health /health (Deprecated) Liveness + Readiness @ApplicationScoped class MyChecks { @Produces @Liveness HealthCheck check1() { … } @Produces @Readiness HealthCheck check2() { … } } CDIを使ってmethodを分けるパターン
  39. 39. 39 Kubernetesのヘルスチェック機能と連携 • LivenessProbe - ヘルスチェック失敗時、Podが再作成される • ReadinessProbe - ヘルスチェック失敗時、Serviceからのルーティングの 対象から外される(Podの再作成はされない) MicroProfile Health (cont.) apiVersion: v1 kind: Pod metadata: name: helidon-demo-mp spec: containers: - name: api-helidon-container image: helidon-demo-mp:latest imagePullPolicy: Always ports: - containerPort: 8080 livenessProbe: httpGet: port: 8080 path: /health/live failureThreshold: 3 periodSeconds: 10
  40. 40. 40 Health Check と Kubernetes Liveness Probe の組み合わせ /health Demo
  41. 41. 41 RESTfulの認証スタイルに沿ったAPIの必要性 • ステートレス - セキュリティの状態はCookie等を使用せずリクエスト毎に送られる • 軽量で相互運用性のあるトークンを使って認証情報をサービス間で伝搬する MP JWT Authentication • JSON Web Tokensのインターフェス - org.eclipse.microprofile.jwt.JsonWebToken • Java EE/MicroProfile APIとのマッピング、インテグレーション JSON Web Tokens(JWT) https://tools.ietf.org/html/rfc7519 MicroProfile JWT Authentication GET /resource/1 HTTP/1.1 Host: example.com Authorization: Bearer mF_9.B5f-4.1JqM HTTPのAuthorizationヘッダに ”Bearer <JWT>” を設定して 認証情報をサーバーに渡すよくあるパターン
  42. 42. 42 (参考) Json Web Token [ヘッダ] eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb3UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS8pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk [ペイロード(クレームセット)] [シグナチャ] { "typ": "JWT", "alg": "RS256", "kid": "abc-1234567890" } { "iss": "https://server.example.com", "aud": ["s6BhdRkqt3"], "exp": 1311281970, "iat": 1311280970, "sub": "24400320", "upn": "jdoe@server.example.com", "groups: ["red-group", "green-group", "admin-group"], "roles": ["auditor", "administrator"], "jti": "a-123", "auth_time": 1311280969, "preferred_username": "jdoe", "acr": "phr", "nbf": 1311288970 } ヘッダとペイロードを 署名したもの イメージ
  43. 43. 43 org.eclipse.microprofile.jwt パッケージ • JsonWebToken インターフェース • java.security.Principal の拡張インターフェース • getXXX(), getClaim(String claimName) • Claims 列挙型 • 個々のクレームの説明とJava型を保持する JAX-RSでの認証方式の指定(web.xmlのlogin-config相当のもの) MicroProfile JWT Authentication - API import org.eclipse.microprofile.annotation.LoginConfig; @LoginConfig(authMethod = "MP-JWT", realmName = "TCK-MP-JWT") @ApplicationPath("/") public class TCKApplication extends Application { ・・・ }
  44. 44. 44 CDI Injection MicroProfile JWT Authentication - API (Cont.) @Path("/endp") @DenyAll @RequestScoped public class RolesEndpoint { @Inject private JsonWebToken callerPrincipal; ... @RequestScoped public class MyEndpoint { @Inject @Claim(standard=Claims.iat) private Long issuedAt; ... JsonWebTokenを インジェクト Claimの個々の値 をインジェクト
  45. 45. 45 JAX-RS APIとのインテグレーション #1 MicroProfile JWT Authentication - API (Cont.) @Provider @Auth public class BasicAuthFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) throws IOException { SecurityContext securityContext = context.getSecurityContext(); JsonWebToken jwt = (JsonWebToken)securityContext.getUserPrincipal() if(!securityContext.isUserInRole("admin")){ ... JsonWebToken オブジェクトを返す
  46. 46. 46 JAX-RS APIとのインテグレーション #2 • @DenyAll – どのセキュリティロールもアクセス不可 • @RolesAllowed – 指定したロールのみアクセス可能 • @PermitAll – 全てのロールがアクセス可能 MicroProfile JWT Authentication - API (Cont.) @Path(value="/addresses") @PermitAll public class AddressBookResource { @GET @Produces(value="text/plain") public String getList() { ... } @PUT @RolesAllowed(“Administrator”) public void updateList(String books) { ... } } どのセキュリティ ロールでもアクセス可能 “Administrator”ロール のみアクセス可能 JWTの”groups”クレーム とのマッピングを行う このクラスのデフォルト アクセスレベルを指定
  47. 47. 47 Helidonの提供するSecurity Providerを試す /security Demo
  48. 48. 48 • JWT Provider • HTTP Basic Authentication • HTTP Digest Authentication • Header Assertion • HTTP Signatures • ABAC Authorization • Google Login Authentication Provider • OIDC (Open ID Connect) Authentication Provider • IDCS Role Mapping Provider Helidonが提供するSecurity Providers
  49. 49. 49 Oracle Integration Cloud Serviceと連携してユーザー認証&認可を行う Demo 1 - OIDC (Open ID Connect) Authentication Provider + IDCS Role Mapping Provider こちらも参考にして下さい! https://www.slideshare.net/oracle4engineer/ochacafe5 IDCS Helidon Open ID Connect Sequence /security/idcs/login Cookie Browser scope user group
  50. 50. 50 @RolesAllowed を使ってエンドポイント毎の認可を設定する Demo 2 - HTTP Basic Authentication Browser Endpoint Roles allowed Permitted Users /security/basic/public <anonymous> <everyone> /security/basic/guest <logged-in users> John, Mary, Ken /security/basic/user user John, Mary /security/basic/admin admin John, Helidon application.yaml GitHubのソースは こちらの設定です
  51. 51. 51 Metrics = システムの健全性を測定するために使用される指標 既存JMX(Java Management Extensions)標準はJVMを前提 - Polyglot環境では不向き Polyglot環境に適したモニタリングを可能にする ヘルスチェックとは異なる目的 • 長期的なトレンドの把握 • キャパシティ・プラニング、潜在的問題の早期把握 • スケジューリング・システムと連動したスケーリング MicroProfile Metrics
  52. 52. 52 以下の3種類のスコープが存在 RESTエンドポイント MicroProfile Metrics スコープ 説明 base 全てのMicroProfile実装で提供しなければいけないメトリクス vendor ベンダ独自のメトリクス (optional) application アプリケーション独自のメトリクス (optional) Endpoint Request Type Supported Format Description /metrics GET JSON, OpenMetrics 全ての登録されているメトリクスを返す /metrics/<scope> GET JSON, OpenMetrics 当該スコープに登録されているメトリクスを返す /metrics/<scope>/<metric_name> GET JSON, OpenMetrics 当該スコープ・名前に一致するメトリクスを返す /metrics OPTIONS JSON 全ての登録されているメトリクスのメタデータを返す /metrics/<scope> OPTIONS JSON 当該スコープに登録されているメトリクスのメタデータを返す /metrics/<scope>/<metric_name> OPTIONS JSON 当該スコープ・名前に一致するメトリクスのメタデータを返す HTTP request のAccept: ヘッダで切り替え
  53. 53. 53 メタデータ メトリック・タイプ (詳細は、org.eclipse.microprofile.metrics パッケージのJava Doc参照) MicroProfile Metrics メタデータ 説明 name メトリックの名前 unit メトリックの単位 type メトリックのタイプ (下表参照) description (optional) メトリックの説明 displayName (optional) メトリックの表示名 reusable (optional) 同じMetric IDの下で複数回メトリックを登録できるか タイプ 説明 例 counter 単調に増加していく数値 受信リクエスト数の合計 concurrent gauge 漸進的に増減する数値 メソッド呼び出しの並列度 gauge サンプルされた数値 CPU温度 / ディスク使用量 meter 平均スループット、1/5/15分の指数加重移動平均スループット histogram 数値の分布 timer 継続時間の集計値、継続時間の統計、スループットの統計
  54. 54. 54 Helidonの例(/metrics) MicroProfile Metrics – OpenMetrics Text Format # TYPE base_cpu_availableProcessors gauge # HELP base_cpu_availableProcessors Displays the number of processors available to the Java virtual machine... base_cpu_availableProcessors 2 # TYPE vendor_requests_count_total counter # HELP vendor_requests_count_total Each request (regardless of HTTP method) will increase this counter vendor_requests_count_total 12 # TYPE vendor_requests_meter_total counter # HELP vendor_requests_meter_total Each request will mark the meter to see overall throughput vendor_requests_meter_total 12 # TYPE vendor_requests_meter_rate_per_second gauge vendor_requests_meter_rate_per_second 0.05411739326125853 # TYPE vendor_requests_meter_one_min_rate_per_second gauge vendor_requests_meter_one_min_rate_per_second 0.12177241397420359 # TYPE vendor_requests_meter_five_min_rate_per_second gauge vendor_requests_meter_five_min_rate_per_second 0.21843631434845615 # TYPE vendor_requests_meter_fifteen_min_rate_per_second gauge vendor_requests_meter_fifteen_min_rate_per_second 0.32275102524669447 Meterを表す
  55. 55. 55 application スコープのメトリックを登録・公開することが可能 2種類の方法 • Annotationを使う方法 • プログラマティカル&動的に作成する方法 Annotationを使う方法 – いろいろな方法あり MicroProfile Metrics – Application Metrics Annotation Constructor Field Method Parameter Type(Class) 説明 @Counted O O O @ConcurrentGauge O O O @Gauge O @Metered O O O @Timed O O O @Metric O O O Fieldで使用できるのはMeter, Timer, Counter, Histogram Gaugeが使用できるのはProducer method か field
  56. 56. 56 MicroProfile Metrics – Example: Annotation package oracle.demo.metrics; @ApplicationScoped @Path("/mpmetrics") public class MetricsResource{ @Inject @Metric(name="total") Counter total; private synchronized void countup(){ total.inc(); } @Metered @GET @Path("/blue") public void blue(){ countup(); } @Metered @GET @Path("/green") public void green(){ countup(); } }
  57. 57. 57 MicroProfile Metrics – Example: Metrics # TYPE application_oracle_demo_metrics_MetricsResource_blue_total counter # HELP application_oracle_demo_metrics_MetricsResource_blue_total application_oracle_demo_metrics_MetricsResource_blue_total 10 # TYPE application_oracle_demo_metrics_MetricsResource_blue_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_rate_per_second 0.0948144020926388 # TYPE application_oracle_demo_metrics_MetricsResource_blue_one_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_one_min_rate_per_second 0.11031275087245901 # TYPE application_oracle_demo_metrics_MetricsResource_blue_five_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_five_min_rate_per_second 0.030672989003081328 # TYPE application_oracle_demo_metrics_MetricsResource_blue_fifteen_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_fifteen_min_rate_per_second 0.010806905605177459 # TYPE application_oracle_demo_metrics_MetricsResource_green_total counter # HELP application_oracle_demo_metrics_MetricsResource_green_total application_oracle_demo_metrics_MetricsResource_green_total 9 # TYPE application_oracle_demo_metrics_MetricsResource_green_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_rate_per_second 0.08533204569172652 # TYPE application_oracle_demo_metrics_MetricsResource_green_one_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_one_min_rate_per_second 0.1265310936101765 # TYPE application_oracle_demo_metrics_MetricsResource_green_five_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_five_min_rate_per_second 0.028990958652981156 # TYPE application_oracle_demo_metrics_MetricsResource_green_fifteen_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_fifteen_min_rate_per_second 0.009886502441084419 # TYPE application_oracle_demo_metrics_MetricsResource_total counter # HELP application_oracle_demo_metrics_MetricsResource_total application_oracle_demo_metrics_MetricsResource_total 19 パッケージ名 クラス名 メトリック名 メソッド名がメトリック名になる
  58. 58. 58 Application Scope Metrics – コーディングから Prometheus - Grafanaによるビジュアライズまで /mpmetrics Demo
  59. 59. 59 Demo – Helidon & Prometheus & Grafana PrometheusGrafana Helidon /metrics /mpmetrics/blue /mpmetrics/green application scope の メトリクスをテスト https://grafana.com/ https://prometheus.io/ メトリクスの監視・集計メトリクスの可視化
  60. 60. 60 OpenAPI = RESTfulなAPIを記述するメタモデルの標準仕様 JAX-RS + MP OpenAPI Annotationで OpenAPI v3ドキュメントを生成 • org.eclipse.microprofile.openapi.annotations パッケージ MicroProfile OpenAPI @GET @Path("/findByStatus") @Operation(summary = "Finds Pets by status", description = "Multiple status values can be provided with comma separated strings") public Response findPetsByStatus(...) { ... } /pet/findByStatus: get: summary: Finds Pets by status description: Multiple status values can be provided with comma separated strings operationId: findPetsByStatus Java Source OpenAPI Spec
  61. 61. 61 JAX-RS + MicroProfile OpenAPI Annotation さらに、Configを使ってドキュメント生成を制御できる APIを使ってOpenAPIのmodel treeを生成することも可能 MicroProfile OpenAPI – ドキュメント生成の仕組み こちらも参考にしてください! https://www.slideshare.net/oracle4engineer/ochacafe6-apiここにアクセスすれば何もしなくても とりあえずのAPIの構成は出てくる
  62. 62. 62 /openapi を眺めてみる (OCHaCafe APIの回のおさらい) /country Demo
  63. 63. 63 分散トレーシングのためのAPIを提供 既存の分散トレーシング・システムと統合し、マイクロサービス環境の一部として機能 OpenTracing (opentracing.io) を前提 JAX-RSアプリケーションは追加的なコードを必要としない • SpanContextは受信したリクエストから自動的に取り出される • Spanはリクエストを受信時に自動的にスタートし、リクエスト処理時に終了する • リクエスト送信時、自動的にSpanContextを挿入する/ Spanを開始し、完了後終了する - Client: (1) javax.ws.rs.client.Client(設定処理要) と (2) MicroProfile Rest Client (デフォルト有効) 分散トレーシングとは? • マイクロサービス環境で複数のサービスを経由して処理されるリクエストのサービス間の依存 関係やレイテンシーを可視化し、障害発生時の解析を容易にする MicroProfile OpenTracing
  64. 64. 64 (参考)The OpenTracing Data Model https://opentracing.io/specification/
  65. 65. 65 JaegerによるSpanのトラッキング /tracing Demo https://www.jaegertracing.io/ OSSの分散トレーシングシステム
  66. 66. Demo - JaegerによるSpanのトラッキング Kubernetes (OKE) (pod) Helidon-demo-mp-0NordPort (pod) Helidon-demo-mp-1 (pod) Helidon-demo-mp-2 (pod) Helidon-demo-mp-3 (pod) jaeger Service Service Service Service ServiceNordPort Browser Port: 30080 (RESTAPI) Port: 30086 (Jaeger UI) トレース情報 66
  67. 67. 67 Demo - JaegerによるSpanのトラッキング (Cont.) [ { "endpoint" : "http://helidon-demo-mp-1:8080/tracing/invoke", "orders" : [] }, { "endpoint" : "http://helidon-demo-mp-2:8080/tracing/invoke", "orders" : [ { "endpoint" : "http://helidon-demo-mp-3:8080/tracing/invoke", "orders" : [ { "endpoint" : "http://helidon-demo-mp-1:8080/tracing/invoke", "orders" : [] } ] }, { "endpoint" : "http://helidon-demo-mp-0:8080/tracing/invoke", "orders" : [] } ] } ] mp-1 mp-2 mp-3 mp-1 mp-0 mp-0 リクエスト json リクエストの流れ
  68. 68. 68 JAX-RS REST Client API • Java EE仕様に含まれるJavaベースのREST Client仕様 • JSON-Bを使ったJson – POJO バインディングが可能 • Filterを使った柔軟な動作カスタマイズが可能 MicroProfile REST Client API • REST Clientを作成する新たなAPI • RESTfulサービスをタイプ・セーフに呼び出す方法を提供 • RestClientBuilderがエントリーポイント - サービス・インターフェースを実装したオブジェクトをビルドする - javax.ws.rs.core.Configurableをextendsしているので、ここからカスタマイズ可能 MicroProfile REST Client
  69. 69. 69 MicroProfile Rest Client (Cont.) REST API用 インターフェース Server 実装 (JAX-RS) Client 実装 (MP Rest Client) @Path("/movies") public interface MovieReviewService { @POST @Path("/{movieId}/reviews") String submitReview( @PathParam("movieId") String movieId, Review review ); } URI apiUri = new URI("http://..."); MovieReviewService reviewSvc = RestClientBuilder.newBuilder() .baseUri(apiUri) .build(MovieReviewService.class); Review review = new Review(3, “Not bad"); reviewSvc.submitReview( movieId, review ); implements builds
  70. 70. 70 単一Interfaceからサーバー、クライアント双方をタイプセーフに作成する /restclient /movies Demo
  71. 71. Demo – Rest Client Browser Helidon GET /restclient MP Rest Client << interface >> MovieReviewService MovieReviewServiceResource POST /movies implements builds 71 GET /restclient/1/submit-review?star=5&comment=great! You submitted a review for movie [id=1,tiele=JOHN WICK: CHAPTER 2] as review [id=0,star=5,comment=great!] [request] [response] { star: 5 comment: “great!” }
  72. 72. 72 Helidon MP が提供する MicroProfile 以外の機能 Helidon MP が提供する MicroProfile 以外の機能 The gRPC Microprofile API というHelidon MP上でgRPCサーバー/ クライアントをAnnotationを使って 簡単に実装する機能がありますが、 今回はバッサリ割愛します…
  73. 73. 73 CDI extensions • HikariCP data sources • Oracle UCP data sources • Jedis clients • OCI Object Storage clients • Java Transaction API (JTA) objects Java Persistence API (JPA)のサポート • JDBC Driver (DataSource) + JTA Extension + Hikari Connection Pool Extension + EclipseLink JPA Extension データの永続化/キャッシュが必要な場合に便利な機能 CDI extension = CDIのライフサイクルイベントを受け取って独自の実装を追加するための仕様 JPA = Javaオブジェクトをデータベースに永続化するための仕様 JTA (Java Transaction API) = トランザクションを管理するための仕様
  74. 74. 74 /country のJPA版 /jpa/country Demo Helidon MP H2 database (in memory) H2 JDBC Driver Java Transaction API EclipseLink (JPA) EntityApp Hikari Connection Pool application.yaml persistence.xml GET/POST/PUT/DELETE
  75. 75. 75 まとめ
  76. 76. 76 単なる「JavaでREST APIを書くためのフレームワーク」ではない • Microservices環境に適したアプリケーションを効率的に作成できる MicroProfileベンダーが必要な実装の大部分を提供するので(だからフレームワーク…) 開発者はビジネスロジックの開発に専念できる • 放っておいても、Metrics、Health、OpenAPIなどはデフォルトで提供してくれる 多くの実績の中で育まれたJavaのエコシステムを活用できる • IDE、ライブラリ、モニタリング・プロファイリング・デバッギング、etc. • GraalVMの活用(native image化は克服すべき課題あり → Quarkusの取り組み) MicroProfileを使う理由 Helidonという素敵なMicroProfile実装がある!
  77. 77. 77 ご清聴ありがとうございました!

×