【JJUG CCC 2019 Fall】JavaオンプレシステムをAKS + Quarkusに移行した話

44b799f91cc48e38c5fe9f5d9c5ecc61?s=47 Takaichi00
November 23, 2019

【JJUG CCC 2019 Fall】JavaオンプレシステムをAKS + Quarkusに移行した話

44b799f91cc48e38c5fe9f5d9c5ecc61?s=128

Takaichi00

November 23, 2019
Tweet

Transcript

  1. Java オンプレシステムを
 AKS + Quarkus に移行した話
 #jjug #jjug_ccc #ccc_m4a
 


    髙市 智章 (Tomoaki Takaichi)
 Nov, 23, 2019【東京】JJUG CCC 2019 Fall

  2. 自己紹介
 @Takaichi00
 
 tomoaki.takaichi.5
 ・髙市 智章(タカイチ トモアキ)
 ・ソフトバンク株式会社 入社3年目 


    ・Java でのシステム開発
 ・アジャイル開発実践
 ・iTunes カード販売システム
 ・ソフトバンクショップ向けシステム
 
 

  3. 目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と

    Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント

  4. 目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と

    Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント

  5. Quarkus とは
 ❏ GraalVM 内のコンパイラを用いて実行可能なネイティ ブバイナリを生成し、コンテナ化できる webフレーム ワーク
 ❏ Red

    Hat 社がスポンサーの OSS プロジェクト

  6. Quarkus 触ったことありますか?
 Quarkus で開発していますか?
 ご質問


  7. ❏ JavaEE の API を用いて簡単に Native Image 化でき、かつ高速起 動と低容量が実現できる
 ❏

    Quarkus では CDI 実装として、ビルド時にバイトコードを生成し、 最適化する「arc」を使用している。よって java -jar での起動も高 速。(しかし CDI のすべての機能を実装しているわけではない)
 ❏ 「arc」の制限についてはこちらを参考
 
 Quarkus の特徴

  8. 目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と

    Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント

  9. ❏ 仮説検証型のシステム開発を行うなかで、オンプレの弱点 が気になるようになってきた ❏ もっと早く環境構築したい / 不要になったらすぐ破棄したい ❏ ⇒ クラウドの採用

    ❏ カンバンツールとして Azure DevOps を採用していた ❏ Azure Pipelines, Azure Repos などのツールチェーンは使 いこなせていなかった コンテナ化の背景 ~ クラウドの採用 ~
 クラウドは Azure に決定!
  10. ❏ システム特性的に、Kubernetes との相性が良かった ❏ 「Kubernetes の導入時に考えるべきこと」(寺田佳央さんのブ ログ) ❏ 変更が頻繁に行われることが予想される ❏

    大量の CPU, メモリのリソースを消費しない ❏ Kubernetes の熱狂性、将来性 ❏ エンジニアのモチベーション UP ❏ MS 社とのハックフェストの開催 ❏ Azure, AKS の十分なサポートが得られる環境 コンテナ化の背景 ~ AKS の採用~
 ⇒ コンテナ化の必要性
  11. ❏ Spring や従来の JVM フレームワークはリフレクションや実行時 のアノテーション解析などを中心として構築されているため、高速 起動と低メモリ消費の両立は難しい ❏ 例えば Micronaut

    はフレームワークレベルでリフレクションの利 用を制限し、アノテーションなどをコンパイル時に解決することで、 高速起動と低メモリ消費を実現 ❏ ⇒ コンテナ化を前提としたフレームワークが必要 ❏ 参考資料: Micronaut 1.0への道 - JVMベースのフルスタックフレームワーク 従来の JVM フレームワーク の課題

  12. ❏ Micronaut ❏ クラウドネイティブなサーバレスアプリケーションをJava や Groovy、Kotlin で記述可能な、JVM ベースのフルスタックフ レームワーク ❏

    Grails の作者である Graeme Rocher 氏がプロダクトのリー ダー ❏ Helidon ❏ Netty を搭載した、マイクロサービスを作成するための Java ライブラリコレクション ❏ Project Helidon という名前で Oracle が公開しているOSS コンテナ化を前提としたフレームワーク

  13. ❏ JavaEE との親和性 ❏ JavaEE でのシステム開発経験があった ❏ 学習コスト、心理的障壁の少なさ ❏ native-image

    を前提としたフレームワークである ❏ Micronaut は Spring のような使い勝手の良さが特徴で、ドキュ メントも豊富 ❏ しかし今回は上記理由を優先して見送り ❏ Helidon は Microprofile の仕様をサポートする Helidon SE で は GraalVM の native-image の利用をサポートしていないため 見送り Quarkus 採用の理由

  14. 目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と

    Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント

  15. Thorntail (Wildfly Swarm) で開発されたことあ りますか? 
 ご質問


  16. ❏ Wildfly を取り込んで実行可能 jar (Uber-Jar) を生成 できる Java EE 対応のフレームワーク

    ❏ Red Hat 社が提供し、現在 2.x 系 と 4.x 系のバー ジョンが存在 Thorntail (Wildfly Swarm) 

  17. ❏ Quarkus の登場に伴い、次期メジャーバージョンの開発 は終了 ❏ 2019/03/11 に発表された Thorntail のブログにて 「Quarkus

    の登場にとても興奮している」「Quarkus は Thorntail 4.x 以上のものだ」との記載 Thorntail (Wildfly Swarm) の今後
 ⇒ Red Hat 系で Java EE や Microprofile を利用 する場合は Quarkus を使いましょう!
  18. 目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と

    Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント

  19. 実際に開発しているコードをもとにしたサンプルを公開予定
 (絶賛作成中!)
 ❏ クリーンアーキテクチャを意識した実装
 ❏ @QuarkusTest を使って DI を モックした

    Controller のテスト (Spring の mockMvc を意識)
 ❏ H2 Database を使ったデータアクセスの単体テスト など...
 https://github.com/Takaichi00/quarkus-sample Quarkus サンプルコード
 QUARKUS - CREATING YOUR FIRST APPLICATION
  20. Spring との起動時間の比較
 ❏ 現在開発している システムの概略図 ❏ 画面は Spring Boot によるサーバーサイドレンダリ

    ング、Backend API として Quarkus を採用 外部 API

  21. Spring との起動時間の比較
 ❏ 現在開発している Spring のプロジェクトと Quarkus のプロ ジェクトの比較 (ローカル

    PC で検証 ) ❏ Spring では画面の実装があるため単純比較は難しいが、 java -jar の起動は 5s ほど Quarkus が早い Quarkus Spring コード行数 5,989 3,692 コンテナサイズ 157 MB 174 MB java -jar の起動時間 1.3 s - 1.5 s 6.0 s - 6.5 s
  22. 目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と

    Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント

  23. Native Image 化の断念
 ❏ 導入検証時、GraalVM のネイティブコンパイルのタイミングで SSL 関連のエラーが発生
 ❏ SunEC

    ライブラリという暗号化を行うライブラリが extention を 追加しないと有効にならない (参考サイト)
 ❏ その他にも、ネイティブコンパイルにはビルド時に存在しないクラス をリフレクションできないなどの制約がある
 ❏ これらの制約から jar として起動することに決定
 ❏ それでも JavaEE ランタイムのビルド時最適化を実装している ため起動は速い!
 

  24. Uber-Jar 作成時の注意
 ❏ Qurakus では pom.xml に設定を加えることで Uber-Jar の作 成も可能


    ❏ しかし、jar の中には署名 jar が含まれており、それを除外し ないと起動時にエラーが発生することがある (参考サイト)
  25. ❏ システム連携のため、 Apache CXF で SOAP クライアントを実装。 しかし Uber-Jar で起動すると、Web

    サービス呼び出し時に NullPointerException が発生してしまう (参考サイト)
 ❏ Qurakus は独自プラグインで Uber-Jar を生成しているため、 Uber-Jar に設定ファイルが入らないことが原因
 ❏ よって Apache CXF が正式対応されるまで Uber-Jar の生成は断 念
 Uber-Jar の断念

  26. SQL Database との相性
 ❏ Azure を利用するため、DB は SQL Database を採用


    ❏ しかし Native Query を利用すると Dialect Error が発生し、 JPQL を利用すると問題は解決する
 ❏ しかし JPQL を利用すると JPA 特有の実装 (主キー前提、 @OneToMany など ) が生じてしまい、DB のスキーマも JPA に依 存した設計となってしまうという課題
 ❏ MyBatis などの O/R Mapper などがサポートされると嬉しい

  27. Quarkus での画面サポート
 ❏ Quarkus では JSP のサポートがされておらず、今 後もサポートされる予定は無いとのこと ❏ Unable

    to forward from a JAX-RS service to JSP #1911 ❏ 一方で Micronaut は Thymeleaf に対応している
  28. Quarkus のバージョンアップ対応
 ❏ マイナーバージョンアップが約9日に1回行われるため、定期的な バージョンアップを行っている
 ❏ 現在の最新バージョンは 0.28.1 で、プロジェクトでも同じバー ジョンを使用


    ❏ xml を処理したいので JAXB を使いたい... バージョンアップしたら JAXB がサポートされた! ということも
 ❏ 公式アナウンスで 1.0 のリリースが発表された
 ❏ 現在 1.0.0.CR2 が公開中
 ❏ 1.0.0.Final が 2019/11/25(月) にリリース予定!

  29. ❏ native-image でなくても java -jar の起動も高速
 ❏ JavaEE 経験がある開発者との親和性が高い
 ❏

    Spring API も一部サポートされている
 ❏ Spring Web, Spring DI, Spring Data がサポート
 ❏ 既存アプリケーションでも徐々に Quarkus に移行すると いった方法が選択できるのでは
 まとめ

  30. ❏ native-image での商用稼働はこれからのチャレンジ
 ❏ 開発チームに、頻繁な更新への対応や未知な問題に遭遇 しても対応できる余裕とスキルセットが必要
 ❏ 使いこなすには MicroProfile の仕様理解も必要


    ❏ Spring の MockMvc のような柔軟なテストはできない
 ❏ 文献が少ない (日本語は特に...) まとめ

  31. みなさんもぜひ Quarkus を使いましょう!!
 そして情報発信してくれると嬉しいです!! さいごに


  32. ご清聴ありがとうございました