Slide 1

Slide 1 text

Copyright 2017 FUJITSU LIMITED MicroProfile 背景と意義、そしてこれから 2017年3月21日 数村 憲治 0 JJUG ナイト・セミナー

Slide 2

Slide 2 text

Copyright 2017 FUJITSU LIMITED アジェンダ Java EEではだめなのか 仕様が先か、実装が先か MicroProfile 1.1 MicroProfileとは サマリ 1

Slide 3

Slide 3 text

自己紹介 Copyright 2017 FUJITSU LIMITED Java VM Developer JCP Executive Committee 富士通沼津工場に勤務 Interstage Application Serverの開発 @kkzr 2

Slide 4

Slide 4 text

Copyright 2017 FUJITSU LIMITED アジェンダ Java EEではだめなのか 仕様が先か、実装が先か MicroProfile 1.1 MicroProfileとは サマリ 3

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

マイクロサービスアーキテクチャ(MSA) Copyright 2017 FUJITSU LIMITED マイクロサービスアーキテクチャとは モノリシックなソフトウェアではなく、 疎結合な小さなサービスの集合・分散 サービスとして実装するアーキテクチャ。 マイクロサービスが訴求するのは 意思決定とビジネスの速さ マイクロサービスの価値 Observe Orient Decide Action OODAループ 迅速な意思決定を助けるアーキテクチャと フィードバックループによる進化 5

Slide 7

Slide 7 text

アプリケーション サーバー 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

Slide 8

Slide 8 text

Java EE にも Profile Copyright 2017 FUJITSU LIMITED Java EEにProfileを追加できるのはOracleだけ Java EE Full Profile Java EE Web Profile Java EE Micro Profile 追加 7

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

GlassFish issues Copyright 2017 FUJITSU LIMITED created resolved 11

Slide 13

Slide 13 text

Copyright 2017 FUJITSU LIMITED アジェンダ Java EEではだめなのか 仕様が先か、実装が先か MicroProfile 1.1 MicroProfileとは サマリ 12

Slide 14

Slide 14 text

仕様が先か、実装が先か Copyright 2017 FUJITSU LIMITED 仕様が先 実装が先 仕様策定に時間がかかる 公正な議論と、複数実装による適切な競争 イノベーションに向いている どこで誰が仕様を決めているか不明 13

Slide 15

Slide 15 text

JCP v.s. OpenJDK Copyright 2017 FUJITSU LIMITED JEPによる開発 JDKのオープンソース Java SE の RI JCP JSRによる開発 (Java Enhancement Proposal) openjdk.java.net OpenJDK 14

Slide 16

Slide 16 text

JCP構成 Copyright 2017 FUJITSU LIMITED Executive Committee JSR JCP member 非営利団体 企業 個人 Oracle 1シート Elected 6シート Ratified 16シート SpecLead 1-2名 Expert Group 数名 選出 承認 設立 Associate 2シート 15

Slide 17

Slide 17 text

OpenJDKとMicroProfile Copyright 2017 FUJITSU LIMITED 競争原理が働かない ベンダ独自実装期間が短い JSR開始から仕様FIXまで、時間が短い OpenJDKの仕様が Java SEの仕様になる Java SE Java EE Microprofileの仕様が Java EEの仕様になる 競争あり マルチベンダによる実装 16

Slide 18

Slide 18 text

Copyright 2017 FUJITSU LIMITED アジェンダ Java EEではだめなのか 仕様が先か、実装が先か MicroProfile 1.1 MicroProfileとは サマリ 17

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

MicroProfileとは Copyright 2017 FUJITSU LIMITED 市場が評価 NG OK APSベンダーが MicroProfileを提供 フィードバックを反映 JCPへ提案 アジャイル的に OODAループを実践 最終的にはJCPへ 19

Slide 21

Slide 21 text

Copyright 2017 FUJITSU LIMITED アジェンダ Java EEではだめなのか 仕様が先か、実装が先か MicroProfile 1.1 MicroProfileとは サマリ 20

Slide 22

Slide 22 text

MicroProfile 1.0 Copyright 2017 FUJITSU LIMITED 2016/9 JavaOneでリリース JAX-RS CDI JSON-P 21

Slide 23

Slide 23 text

MicroProfile 1.1 Copyright 2017 FUJITSU LIMITED 2017/2Q リリース予定 Configuration API Health Check API JWT Token Definition Fault Tolerance (stretch goal) 22

Slide 24

Slide 24 text

Configuration API Copyright 2017 FUJITSU LIMITED 設定の外だし 別環境への移動時等、設定変更のためのリビルドを不要に 環境が変更するたびに、リデプロイが不要に 設定動的反映 Netflix/archaiusの考え方 優先度づけされた複数の設定(ConfigSource)で構成 1. システムプロパティ 2. 環境変数 3. 設定ファイル META-INF/microprofile-config.properties 高 (優先順位) 低 23

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Configuration API Copyright 2017 FUJITSU LIMITED @Inject @ConfigProperty( “com.fujitsu.interstage.port”, cacheFor=5, timeUnit=TimeUnit.MINUTES, evaluateVariables=true) ConfigValue portConfig; int port = portConfig.get(); アノテーションも使えるように 25

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Fault Tolerance Copyright 2017 FUJITSU LIMITED RetryPolicy Fallback アプリケーションの実行論理と実行時のエラーハンドリングを 分離する機能 CircuitBreaker BulkHead Timeout 30

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Copyright 2017 FUJITSU LIMITED アジェンダ Java EEではだめなのか 仕様が先か、実装が先か MicroProfile 1.1 MicroProfileとは サマリ 35

Slide 37

Slide 37 text

サマリ Copyright 2017 FUJITSU LIMITED フィードバックループによるマイクロサービスを実践 既存のJavaコミュニティを分裂するものではない アプリケーションポータビリティ 最終的にはJCPで標準化 オープンイノベーション 実装(ベンダー)を選択可能 36

Slide 38

Slide 38 text

37

Slide 39

Slide 39 text

Copyright 2017 FUJITSU LIMITED Javaは、Oracle Corporationおよびその子会社、関連会社の米国および その他の国おける登録商標です。 本ドキュメントに記載されている、社名、商品名等は各社の商標または 登録商標である場合があります。 その他の記載されている、商標および登録商標については、 一般に各社の商標または登録商標です。 38