JSUG勉強会2020その5 Spring Boot 2.3 徹底解説 に行ってきた #jsug

JSUG勉強会2020その5 Spring Boot 2.3 徹底解説 に参加しました。今回はオンライン開催。簡単に所感をまとめます。

jsug.doorkeeper.jp

所感

Wavefront は初めて知りましたが、VMware が提供するサービスなんですね。k9s や コンテナ向けの機能がどんどん追加されていきますね。ヒープメモリの割り当ての説明が参考になりました。Memory Calculator は便利そう。

YouTube の URL はこちら。

https://youtu.be/mQC7yPTAE5oyoutu.be

以下、メモから抜粋。

Deep dive into Spring Boot 2.3

docs.google.com

  • Boot 2.3 からは半年に1回リリースに
    • Spring Data のメジャーアップデートに対応するため
    • Gradle バージョンアップ (6.3+) が必要
  • k9s Support
  • /actuator/health エンドポイント
    • HealthIndicator
    • 外部サービス向けのヘルスチェック?
    • k9s コンテナのヘルスチェックには不向き
  • Liveness State
    • プロセス内部の状態のヘルスチェック
    • NGの場合はプロセス再起動する (コンテナ再作成)
    • /actuator/health/liveness
    • 外部サービスのヘルスチェックは含めない☆
      • コンテナを再起動しても外部サービスが復旧するわけではない
  • Readiness State
    • トラフィックを受けられるかどうか
    • NGの場合はトラフィックを遮断する
    • /actuator/health/readiness
    • 外部サービスのヘルスチェックを含める
      • アプリ側で対処できるものは含めない (Circuit Breaker, Fallback, ...)
  • Liveness と Readiness の間に任意の処理を入れられる☆
    • リクエストを受ける前にキャッシュをロードしたり
  • k9s 環境ではデフォルトでエンドポイントは有効
    • k9s 以外では明示的に要設定
  • HTTP エンドポイントの他に、イベントの終了結果に応じてコマンドで状態を変えられる☆
  • Graceful Shutdown
    • レスポンスを返す前にシャットダウンするとエラーになったり
    • 高負荷な状態でシャットダウンすると不整合が起きたり
    • Boot 2.2 までは自前で実装
    • server.shutdown=graceful
    • spring.lifecycle.timeout-per-shutdown-phase
      • シャットダウンまでの猶予時間?(デフォルト30s)
    • 新規リクエストは受け付けない
  • Docker Image Support
    • チュートリアルの Dockerfile では不十分
    • Dockerfile 以外でも Docker Image は作成可能
  • Cloud Native Buildpacks
    • OCI イメージを作成できる Maven/Gradle Plugin
    • Paketo (Buildpack 実装)
    • 使われる JRE は BellSoft Liberica☆
    • ヒープサイズとノンヒープサイズを自動設定☆
  • Buildpack の Docker Image ではロード済みのレイヤー (ミドルウェア) は再利用される?
    • push/pull されない
  • コンテナのメモリサイズと -Xmx の設定値を同じにするのはNG
    • ノンヒープの分を考慮する必要あり
    • Memory Calculator
      • ヒープサイズ = コンテナメモリ - ノンヒープ
      • jar 内のクラスファイル数, MetaSpace, Thread Stack など
    • ノンヒープがコンテナメモリを超える場合はエラー
      • スレッドや Reserved CodeCache の分を減らしたり
    • Memory Calculator のパラメータと Tomcat などのパラメータは合わせる
  • Head Room
    • Java 以外のプロセスが利用するメモリ
  • Memory Calculator は個別に利用可能
  • JVMKill Agent
    • OOME が発生したときにプロセスを kill する
    • k9s のときに適宜コンテナを再作成してクリーンな状態に
  • Layered Jar Format
    • アプリのレイヤーをさらに細分化 (application/dependencies)
    • 依存ライブラリの更新頻度は高くないので push/pull 不要
    • Dockerfile multi-stage builds と組み合わせると Dockerfile でも可
  • デフォルトではレスポンスに例外メッセージを含めなくなった
    • server.error.include-message, server.error.include-binding-errors で変更可
  • spring-boot-starter-validation が含まれなくなった
    • Bean Validation を使う場合は個別に依存を追加
    • メモリフットプリントが大きいから
    • Hibernate Validation 6.1 から自動でロケールを見てメッセージを表示
  • spring-boot-properties-migrator
  • Wavefront
    • SaaS モニタリングサービス
    • Sleuth, Micrometer からメトリクス/トレース送信
    • Spring Boot から Freemium アカウント作成可
    • ワンタイムリンクでダッシュボードにアクセス可
    • 2回目以降はプロパティに設定
  • GraalVM Native
    • Actuator, JPA, Cloud Function, Jafu
    • メモリフットプリントが小さく
    • AWS Lambda 上で動かすためのアダプタ?
    • ネイティブのコンパイル時間は CI のサンプルのビルド結果を参考に