$30 off During Our Annual Pro Sale. View Details »

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

Takaichi00
November 23, 2019

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

Takaichi00

November 23, 2019
Tweet

More Decks by Takaichi00

Other Decks in Technology

Transcript

  1. Java オンプレシステムを

    AKS + Quarkus に移行した話

    #jjug #jjug_ccc #ccc_m4a


    髙市 智章 (Tomoaki Takaichi)

    Nov, 23, 2019【東京】JJUG CCC 2019 Fall


    View Slide

  2. 自己紹介

    @Takaichi00


    tomoaki.takaichi.5

    ・髙市 智章(タカイチ トモアキ)

    ・ソフトバンク株式会社 入社3年目 

    ・Java でのシステム開発

    ・アジャイル開発実践

    ・iTunes カード販売システム

    ・ソフトバンクショップ向けシステム



    View Slide

  3. 目次

    ❏ Quarkus とは?

    ❏ Quarkus 採用の背景

    ❏ Quarkus と Thorntail (Wildfly Swarm) 

    ❏ Quarkus のサンプル

    ❏ 実開発ではまったポイント


    View Slide

  4. 目次

    ❏ Quarkus とは?

    ❏ Quarkus 採用の背景

    ❏ Quarkus と Thorntail (Wildfly Swarm) 

    ❏ Quarkus のサンプル

    ❏ 実開発ではまったポイント


    View Slide

  5. Quarkus とは

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

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


    View Slide

  6. Quarkus 触ったことありますか?

    Quarkus で開発していますか?

    ご質問


    View Slide

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

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

    ❏ 「arc」の制限についてはこちらを参考


    Quarkus の特徴


    View Slide

  8. 目次

    ❏ Quarkus とは?

    ❏ Quarkus 採用の背景

    ❏ Quarkus と Thorntail (Wildfly Swarm) 

    ❏ Quarkus のサンプル

    ❏ 実開発ではまったポイント


    View Slide

  9. ❏ 仮説検証型のシステム開発を行うなかで、オンプレの弱点
    が気になるようになってきた
    ❏ もっと早く環境構築したい / 不要になったらすぐ破棄したい
    ❏ ⇒ クラウドの採用
    ❏ カンバンツールとして Azure DevOps を採用していた
    ❏ Azure Pipelines, Azure Repos などのツールチェーンは使
    いこなせていなかった
    コンテナ化の背景 ~ クラウドの採用 ~

    クラウドは Azure に決定!

    View Slide

  10. ❏ システム特性的に、Kubernetes との相性が良かった
    ❏ 「Kubernetes の導入時に考えるべきこと」(寺田佳央さんのブ
    ログ)
    ❏ 変更が頻繁に行われることが予想される
    ❏ 大量の CPU, メモリのリソースを消費しない
    ❏ Kubernetes の熱狂性、将来性
    ❏ エンジニアのモチベーション UP
    ❏ MS 社とのハックフェストの開催
    ❏ Azure, AKS の十分なサポートが得られる環境
    コンテナ化の背景 ~ AKS の採用~

    ⇒ コンテナ化の必要性

    View Slide

  11. ❏ Spring や従来の JVM フレームワークはリフレクションや実行時
    のアノテーション解析などを中心として構築されているため、高速
    起動と低メモリ消費の両立は難しい
    ❏ 例えば Micronaut はフレームワークレベルでリフレクションの利
    用を制限し、アノテーションなどをコンパイル時に解決することで、
    高速起動と低メモリ消費を実現
    ❏ ⇒ コンテナ化を前提としたフレームワークが必要
    ❏ 参考資料: Micronaut 1.0への道 - JVMベースのフルスタックフレームワーク
    従来の JVM フレームワーク の課題


    View Slide

  12. ❏ Micronaut
    ❏ クラウドネイティブなサーバレスアプリケーションをJava や
    Groovy、Kotlin で記述可能な、JVM ベースのフルスタックフ
    レームワーク
    ❏ Grails の作者である Graeme Rocher 氏がプロダクトのリー
    ダー
    ❏ Helidon
    ❏ Netty を搭載した、マイクロサービスを作成するための Java
    ライブラリコレクション
    ❏ Project Helidon という名前で Oracle が公開しているOSS
    コンテナ化を前提としたフレームワーク


    View Slide

  13. ❏ JavaEE との親和性
    ❏ JavaEE でのシステム開発経験があった
    ❏ 学習コスト、心理的障壁の少なさ
    ❏ native-image を前提としたフレームワークである
    ❏ Micronaut は Spring のような使い勝手の良さが特徴で、ドキュ
    メントも豊富
    ❏ しかし今回は上記理由を優先して見送り
    ❏ Helidon は Microprofile の仕様をサポートする Helidon SE で
    は GraalVM の native-image の利用をサポートしていないため
    見送り
    Quarkus 採用の理由


    View Slide

  14. 目次

    ❏ Quarkus とは?

    ❏ Quarkus 採用の背景

    ❏ Quarkus と Thorntail (Wildfly Swarm) 

    ❏ Quarkus のサンプル

    ❏ 実開発ではまったポイント


    View Slide

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

    ご質問


    View Slide

  16. ❏ Wildfly を取り込んで実行可能 jar (Uber-Jar) を生成
    できる Java EE 対応のフレームワーク
    ❏ Red Hat 社が提供し、現在 2.x 系 と 4.x 系のバー
    ジョンが存在
    Thorntail (Wildfly Swarm) 


    View Slide

  17. ❏ Quarkus の登場に伴い、次期メジャーバージョンの開発
    は終了
    ❏ 2019/03/11 に発表された Thorntail のブログにて
    「Quarkus の登場にとても興奮している」「Quarkus は
    Thorntail 4.x 以上のものだ」との記載
    Thorntail (Wildfly Swarm) の今後

    ⇒ Red Hat 系で Java EE や Microprofile を利用
    する場合は Quarkus を使いましょう!

    View Slide

  18. 目次

    ❏ Quarkus とは?

    ❏ Quarkus 採用の背景

    ❏ Quarkus と Thorntail (Wildfly Swarm) 

    ❏ Quarkus のサンプル

    ❏ 実開発ではまったポイント


    View Slide

  19. 実際に開発しているコードをもとにしたサンプルを公開予定

    (絶賛作成中!)

    ❏ クリーンアーキテクチャを意識した実装

    ❏ @QuarkusTest を使って DI を モックした Controller のテスト
    (Spring の mockMvc を意識)

    ❏ H2 Database を使ったデータアクセスの単体テスト など...

    https://github.com/Takaichi00/quarkus-sample
    Quarkus サンプルコード

    QUARKUS - CREATING YOUR FIRST APPLICATION

    View Slide

  20. Spring との起動時間の比較

    ❏ 現在開発している システムの概略図
    ❏ 画面は Spring Boot によるサーバーサイドレンダリ
    ング、Backend API として Quarkus を採用
    外部 API


    View Slide

  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

    View Slide

  22. 目次

    ❏ Quarkus とは?

    ❏ Quarkus 採用の背景

    ❏ Quarkus と Thorntail (Wildfly Swarm) 

    ❏ Quarkus のサンプル

    ❏ 実開発ではまったポイント


    View Slide

  23. Native Image 化の断念

    ❏ 導入検証時、GraalVM のネイティブコンパイルのタイミングで SSL
    関連のエラーが発生

    ❏ SunEC ライブラリという暗号化を行うライブラリが extention を
    追加しないと有効にならない (参考サイト)

    ❏ その他にも、ネイティブコンパイルにはビルド時に存在しないクラス
    をリフレクションできないなどの制約がある

    ❏ これらの制約から jar として起動することに決定

    ❏ それでも JavaEE ランタイムのビルド時最適化を実装している
    ため起動は速い!


    View Slide

  24. Uber-Jar 作成時の注意

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

    ❏ しかし、jar の中には署名 jar が含まれており、それを除外し
    ないと起動時にエラーが発生することがある (参考サイト)

    View Slide

  25. ❏ システム連携のため、 Apache CXF で SOAP クライアントを実装。
    しかし Uber-Jar で起動すると、Web サービス呼び出し時に
    NullPointerException が発生してしまう (参考サイト)

    ❏ Qurakus は独自プラグインで Uber-Jar を生成しているため、
    Uber-Jar に設定ファイルが入らないことが原因

    ❏ よって Apache CXF が正式対応されるまで Uber-Jar の生成は断
    念

    Uber-Jar の断念


    View Slide

  26. SQL Database との相性

    ❏ Azure を利用するため、DB は SQL Database を採用

    ❏ しかし Native Query を利用すると Dialect Error が発生し、
    JPQL を利用すると問題は解決する

    ❏ しかし JPQL を利用すると JPA 特有の実装 (主キー前提、
    @OneToMany など ) が生じてしまい、DB のスキーマも JPA に依
    存した設計となってしまうという課題

    ❏ MyBatis などの O/R Mapper などがサポートされると嬉しい


    View Slide

  27. Quarkus での画面サポート

    ❏ Quarkus では JSP のサポートがされておらず、今
    後もサポートされる予定は無いとのこと
    ❏ Unable to forward from a JAX-RS service to JSP #1911
    ❏ 一方で Micronaut は Thymeleaf に対応している

    View Slide

  28. Quarkus のバージョンアップ対応

    ❏ マイナーバージョンアップが約9日に1回行われるため、定期的な
    バージョンアップを行っている

    ❏ 現在の最新バージョンは 0.28.1 で、プロジェクトでも同じバー
    ジョンを使用

    ❏ xml を処理したいので JAXB を使いたい... バージョンアップしたら
    JAXB がサポートされた! ということも

    ❏ 公式アナウンスで 1.0 のリリースが発表された

    ❏ 現在 1.0.0.CR2 が公開中

    ❏ 1.0.0.Final が 2019/11/25(月) にリリース予定!


    View Slide

  29. ❏ native-image でなくても java -jar の起動も高速

    ❏ JavaEE 経験がある開発者との親和性が高い

    ❏ Spring API も一部サポートされている

    ❏ Spring Web, Spring DI, Spring Data がサポート

    ❏ 既存アプリケーションでも徐々に Quarkus に移行すると
    いった方法が選択できるのでは

    まとめ


    View Slide

  30. ❏ native-image での商用稼働はこれからのチャレンジ

    ❏ 開発チームに、頻繁な更新への対応や未知な問題に遭遇
    しても対応できる余裕とスキルセットが必要

    ❏ 使いこなすには MicroProfile の仕様理解も必要

    ❏ Spring の MockMvc のような柔軟なテストはできない

    ❏ 文献が少ない (日本語は特に...)
    まとめ


    View Slide

  31. みなさんもぜひ Quarkus を使いましょう!!

    そして情報発信してくれると嬉しいです!!
    さいごに


    View Slide

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


    View Slide