Slide 1

Slide 1 text

Java オンプレシステムを
 AKS + Quarkus に移行した話
 #jjug #jjug_ccc #ccc_m4a
 
 髙市 智章 (Tomoaki Takaichi)
 Nov, 23, 2019【東京】JJUG CCC 2019 Fall


Slide 2

Slide 2 text

自己紹介
 @Takaichi00
 
 tomoaki.takaichi.5
 ・髙市 智章(タカイチ トモアキ)
 ・ソフトバンク株式会社 入社3年目 
 ・Java でのシステム開発
 ・アジャイル開発実践
 ・iTunes カード販売システム
 ・ソフトバンクショップ向けシステム
 
 


Slide 3

Slide 3 text

目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント


Slide 4

Slide 4 text

目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント


Slide 5

Slide 5 text

Quarkus とは
 ❏ GraalVM 内のコンパイラを用いて実行可能なネイティ ブバイナリを生成し、コンテナ化できる webフレーム ワーク
 ❏ Red Hat 社がスポンサーの OSS プロジェクト


Slide 6

Slide 6 text

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


Slide 7

Slide 7 text

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


Slide 8

Slide 8 text

目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント


Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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


Slide 12

Slide 12 text

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


Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント


Slide 15

Slide 15 text

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


Slide 16

Slide 16 text

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


Slide 17

Slide 17 text

❏ Quarkus の登場に伴い、次期メジャーバージョンの開発 は終了 ❏ 2019/03/11 に発表された Thorntail のブログにて 「Quarkus の登場にとても興奮している」「Quarkus は Thorntail 4.x 以上のものだ」との記載 Thorntail (Wildfly Swarm) の今後
 ⇒ Red Hat 系で Java EE や Microprofile を利用 する場合は Quarkus を使いましょう!

Slide 18

Slide 18 text

目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント


Slide 19

Slide 19 text

実際に開発しているコードをもとにしたサンプルを公開予定
 (絶賛作成中!)
 ❏ クリーンアーキテクチャを意識した実装
 ❏ @QuarkusTest を使って DI を モックした Controller のテスト (Spring の mockMvc を意識)
 ❏ H2 Database を使ったデータアクセスの単体テスト など...
 https://github.com/Takaichi00/quarkus-sample Quarkus サンプルコード
 QUARKUS - CREATING YOUR FIRST APPLICATION

Slide 20

Slide 20 text

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


Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

目次
 ❏ Quarkus とは?
 ❏ Quarkus 採用の背景
 ❏ Quarkus と Thorntail (Wildfly Swarm) 
 ❏ Quarkus のサンプル
 ❏ 実開発ではまったポイント


Slide 23

Slide 23 text

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


Slide 24

Slide 24 text

Uber-Jar 作成時の注意
 ❏ Qurakus では pom.xml に設定を加えることで Uber-Jar の作 成も可能
 ❏ しかし、jar の中には署名 jar が含まれており、それを除外し ないと起動時にエラーが発生することがある (参考サイト)

Slide 25

Slide 25 text

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


Slide 26

Slide 26 text

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


Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Quarkus のバージョンアップ対応
 ❏ マイナーバージョンアップが約9日に1回行われるため、定期的な バージョンアップを行っている
 ❏ 現在の最新バージョンは 0.28.1 で、プロジェクトでも同じバー ジョンを使用
 ❏ xml を処理したいので JAXB を使いたい... バージョンアップしたら JAXB がサポートされた! ということも
 ❏ 公式アナウンスで 1.0 のリリースが発表された
 ❏ 現在 1.0.0.CR2 が公開中
 ❏ 1.0.0.Final が 2019/11/25(月) にリリース予定!


Slide 29

Slide 29 text

❏ native-image でなくても java -jar の起動も高速
 ❏ JavaEE 経験がある開発者との親和性が高い
 ❏ Spring API も一部サポートされている
 ❏ Spring Web, Spring DI, Spring Data がサポート
 ❏ 既存アプリケーションでも徐々に Quarkus に移行すると いった方法が選択できるのでは
 まとめ


Slide 30

Slide 30 text

❏ native-image での商用稼働はこれからのチャレンジ
 ❏ 開発チームに、頻繁な更新への対応や未知な問題に遭遇 しても対応できる余裕とスキルセットが必要
 ❏ 使いこなすには MicroProfile の仕様理解も必要
 ❏ Spring の MockMvc のような柔軟なテストはできない
 ❏ 文献が少ない (日本語は特に...) まとめ


Slide 31

Slide 31 text

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


Slide 32

Slide 32 text

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