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

MicroProfile 背景と意義、そしてこれから

MicroProfile 背景と意義、そしてこれから

JJUGナイトセミナー 2017/3/21

Kenji Kazumura

May 23, 2022
Tweet

More Decks by Kenji Kazumura

Other Decks in Programming

Transcript

  1. 自己紹介 Copyright 2017 FUJITSU LIMITED Java VM Developer JCP Executive

    Committee 富士通沼津工場に勤務 Interstage Application Serverの開発 @kkzr 2
  2. MicroProfile.io Copyright 2017 FUJITSU LIMITED An open forum to optimize

    Enterprise Java for a microservices architecture by innovating across multiple implementations and collaborating on common areas of interest with a goal of standardization. The Mission 4
  3. アプリケーション サーバー MSAレイヤーと要素技術 Copyright 2017 FUJITSU LIMITED VM/コンテナ アプリケーション サーバー

    アプリケーション docker memory footprint resiliency IaaS PaaS ステートレス API化 サービス分割 サーバレス 非同期 REST MicroProfile 1.0 Java EE 7 Java EE 8/9 MSAで必要な機能 (3) (2) (1) (1)JAX-RS、CDI、JSON-P (2)Websocket、JPA等 (3)Healthcheck等 6
  4. Java EE にも Profile Copyright 2017 FUJITSU LIMITED Java EEにProfileを追加できるのはOracleだけ

    Java EE Full Profile Java EE Web Profile Java EE Micro Profile 追加 7
  5. Java EE 歴史 Copyright 2017 FUJITSU LIMITED JSR Initiation Early

    Draft Review Public Review Final Release J2EE 1.4 2001/10 - 2002/5 2003/11 Java EE 5 2004/5 2005/4 2005/6 2006/5 Java EE 6 2007/7 2008/10 2009/1 2009/12 Java EE 7 2011/5 2012/4 2013/1 2013/5 Java EE 8 2014/8 2015/10 2017/7? J2EE 1.2 J2EE 1.3 J2EE 1.4 Java EE 5 Java EE 6 Java EE 7 Java EE 8 2000 2005 2010 2015 2020 リリース間隔 8
  6. JCPステージ Copyright 2017 FUJITSU LIMITED Initiation Draft Release Final Release

    Main- tenance Expert Group設立 (SpecLead) 最終承認投票 (EC) 保守投票 (EC) ドラフト レビュー JSR レビュー ドラフト承認投票 (EC) RI & TCK (EG) JSR承認投票 (EC) 9
  7. Java EE 8 状況 Copyright 2017 FUJITSU LIMITED JSR 機能

    状況 (2016/3) 状況 (2017/3) 366 Java EE 8 Platform EDR EDR2 367 JSON-B 1.0 – JSON Binding EDR PR 371 MVC 1.0 – Model View Controller EDR2 EDR2 372 JSF 2.3 – Integration with WebSocket EDR FD 369 Servlet 4.0 – HTTP/2 EDR EDR 365 CDI 2.0 – outside of Java EE container EDR PR 375 Security API - EDR 370 JAX-RS 2.1 – non-blocking I/O - EDR 373 Management 2.0 - WD 380 Bean Validation 2.0 - EDR 368 JMS 2.1 EDR WD 374 JSON-P 1.1 EDR FD 10
  8. JCP v.s. OpenJDK Copyright 2017 FUJITSU LIMITED JEPによる開発 JDKのオープンソース Java

    SE の RI JCP JSRによる開発 (Java Enhancement Proposal) openjdk.java.net OpenJDK 14
  9. JCP構成 Copyright 2017 FUJITSU LIMITED Executive Committee JSR JCP member

    非営利団体 企業 個人 Oracle 1シート Elected 6シート Ratified 16シート SpecLead 1-2名 Expert Group 数名 選出 承認 設立 Associate 2シート 15
  10. OpenJDKとMicroProfile Copyright 2017 FUJITSU LIMITED 競争原理が働かない ベンダ独自実装期間が短い JSR開始から仕様FIXまで、時間が短い OpenJDKの仕様が Java

    SEの仕様になる Java SE Java EE Microprofileの仕様が Java EEの仕様になる 競争あり マルチベンダによる実装 16
  11. MicroProfile沿革 Copyright 2017 FUJITSU LIMITED 2016年6月設立 2017年1月 富士通が参加 2016年9月 JavaOne

    で Version 1.0 リリース 2017年2Q Version 1.1 リリース予定 2017年3Q Version 1.2 リリース予定 18
  12. MicroProfileとは Copyright 2017 FUJITSU LIMITED 市場が評価 NG OK APSベンダーが MicroProfileを提供

    フィードバックを反映 JCPへ提案 アジャイル的に OODAループを実践 最終的にはJCPへ 19
  13. MicroProfile 1.1 Copyright 2017 FUJITSU LIMITED 2017/2Q リリース予定 Configuration API

    Health Check API JWT Token Definition Fault Tolerance (stretch goal) 22
  14. Configuration API Copyright 2017 FUJITSU LIMITED 設定の外だし 別環境への移動時等、設定変更のためのリビルドを不要に 環境が変更するたびに、リデプロイが不要に 設定動的反映

    Netflix/archaiusの考え方 優先度づけされた複数の設定(ConfigSource)で構成 1. システムプロパティ 2. 環境変数 3. 設定ファイル META-INF/microprofile-config.properties 高 (優先順位) 低 23
  15. Configuration API Copyright 2017 FUJITSU LIMITED Config config = ConfigProvider.getConfig();

    ConfigValue portConfig = config.access(“com.fujitsu.interstage.port”) .as(Integer.class) .cacheFor(5, TimeUnit.MINUTES) .logChanges(true) .evaluateVariables(true) .withDefault(8080); Integer port = portConfig.getValue(); 5分間キャッシュする Apache DeltaSpike由来のAPI org.apach.delatspike.core.api.config.Config.Resolver 値が変化したらINFOログ 出力 ${foo}のような変数の再評価 24
  16. Configuration API Copyright 2017 FUJITSU LIMITED @Inject @ConfigProperty( “com.fujitsu.interstage.port”, cacheFor=5,

    timeUnit=TimeUnit.MINUTES, evaluateVariables=true) ConfigValue<Integer> portConfig; int port = portConfig.get(); アノテーションも使えるように 25
  17. Interoperable JWT RBAC Copyright 2017 FUJITSU LIMITED OpenID ConnectベースのRole Based

    Access Control OpenID ConnectのIDトークンに 認可のためのクレームを加えたbearer/accessトークン が提案されている まだ具体的な仕様は少ない HTTPヘッダからトークン情報を取得したり、ハンドリングす るAPIも考えられているが。 JavaOne 2016のMicroProfile Meetingでセキュリティとして 優先だが高いとされた 26
  18. Interoperable JWT RBAC Copyright 2017 FUJITSU LIMITED { "iss": "https://server.example.com",

    "sub": "24400320", "preferred_username": "jdoe", "aud": "s6BhdRkqt3", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970, "auth_time": 1311280969, "realm_access": { "roles": ["role-in-realm", "user", "manager"] }, "resource_access": { "my-service": { "roles": [ "role-in-my-service" ] } }, 例: 27
  19. Service Healthchecks Copyright 2017 FUJITSU LIMITED アプリケーションのヘルスチェックをするRESTエンドポイント仕様 Consumer Producer Health

    Check Procedure GET /health 200:UP or 503:Down 全てのProcedureを実行し、 結果をまとめてJSONで返却 Kubernetes health check互換 Health Check Procedure Health Check Procedure チェック対象のアプリケーション Producerの生存を特定するマシン (Kubernetesとか) 28
  20. Service Healthchecks Copyright 2017 FUJITSU LIMITED Health Check Procedureの例 (JAX-RS)

    @Path("/app") public class HealthCheckResource { @GET @Path("/diskspace") @Health public HealthStatus checkDiskspace() { long freeBytes = path.getFreeSpace(); long threshold = 1024 * 1024 * 100; // 100MB return freeBytes>threshold ? HealthStatus.named("diskspace") .up().withAttribute("freebytes", freeBytes) : HealthStatus.named("diskspace") .down().withAttribute("freebytes", freeBytes); } 29
  21. Fault Tolerance Copyright 2017 FUJITSU LIMITED RetryPolicy rp = retryPolicy

    .retryOn(TimeOutException.class) // リトライの条件 .withDelay(2, TimeUnit.SECONDS) // リトライ間隔 .withMaxRetries(2); // リトライ回数 Connection conn = execution .with(rp) // RetryPolicyの設定 .withFallBack(this::connectToBackup) // getのリトライに失敗した際の処理 .get(this::connectToPrimary) RetryPolicy Fallback 31
  22. Fault Tolerance Copyright 2017 FUJITSU LIMITED CircuitBreaker cb = circuitBreaker

    .withFailureThreshold(3, 10) .withSuccessThreshold(5) .withDelay(1, TimeUnit.MINUTES); Connection conn = execution.with(cb).run(this::connect); CircuitBreaker closed CircuitBreaker open CircuitBreaker half-open 10回中3回失敗した 5回連続成功した 正常時 リクエスト送信遮断なし リクエスト送信遮断 1分後 5回連続成功しなかった リクエスト送信再開 CircuitBreaker 32
  23. Fault Tolerance Copyright 2017 FUJITSU LIMITED @Inject @CircuitBreaker ( delay=1,

    failThreshold=3, successThreashold=5) CircuitBreaker cb; Connection conn = execution.with(cb).run(this::connect); CircuitBreaker (アノテーションでも) 33
  24. Fault Tolerance Copyright 2017 FUJITSU LIMITED BulkHead bh = bulkHead.withPool(“myPool”);

    Connection conn = execution .with(bh) .run(this::connect); Connection connect = execution .withTimOut(2, TimeUnit.SECONDS) .run(this::connect); BulkHead 処理ごとに個別のスレッドプールを使用することで、 異常時の影響を分離 Timeout 34
  25. 37