Spring Fest 2018 に行ってきた #jsug

Spring Fest 2018 に行ってきました。簡単に所感をまとめます。

springfest2018.springframework.jp

今回参加したセッションは以下の通り。メモから抜粋。(スライドのリンクは随時更新します)

KEYNOTE

  • Spring ユーザーの4分の3は Java 8
    • Java 7 は2割くらい
  • Spring のベースラインは LTS の Java バージョンに合わせる見通しか
    • 中間の Java リリースに対応できるように Spring もシームレスにアップデートしていく
  • GraalVM (Substrate VM)
  • Kotlin が伸びている (Android 開発によるもの)
    • メジャーな JVM 言語になる可能性あり
    • ネイティブライブラリが使える
    • さまざまなエコシステムの開発に使える
    • 記述の簡潔さ、immutable、静的型付け
  • Spring 5.1
    • 5.0 => Java 8
    • 5.1 => Java 8, 11
    • Java 9, 10 はベストエフォートでサポート
    • 5.1 を使うだけで省メモリ、高速化が可能
  • Spring Boot 2.1
    • Java 11 サポート
    • Spring Data JDBC starter
    • 起動時間短縮、パフォーマンス改善、省メモリ
  • Kotlin サポート
    • Spring 5.2 / Kotlin 1.3 ベースライン
    • Coroutines サポート
    • モバイル領域の言語なので省メモリで高パフォーマンス
  • GraalVM
    • Spring 5.1
    • ミリ秒レベルで Spring Boot アプリケーションが起動できる
  • R2JDBC ★
    • リアクティブプログラミングサポート
    • ブロッキングJDBC の代替
    • Reactive SQL SPI (experimental)
    • PostgreSQL ドライバのみ (他は今後サポート予定)
    • Spring Data R2DBC
    • 検索結果が Stream (Flux, Mono) で返る
    • Database Client で functional に書ける
  • RSocket
  • Spring Fu ★
    • incubator intended to mature experimental
    • Spring Boot 2.1 より省メモリで高パフォーマンス
    • Kofu Configuration
      • functional に configuration できる

決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発

www.slideshare.net

  • 支援ツールを内製化して運用作業を自動化
  • サービス監視
  • 開発支援
  • Pivotal Cloud Foundry ★
    • Pivotal Container Service (Kubernetes)
    • Pivotal Application Service
    • Pivotal Function Service
  • 抽象化レイヤが違う、サポートしているプラットフォームが違う
  • PAS を使うことでデプロイ速度向上が可能 (1min)
    • ベンダー&オンプレだと1ヶ月以上かかることも
  • 開発チームの責任分担
    • 12 Factor App に従う
    • ベンダーロックインはない
  • PAS 以外のコンポーネント(VM)は BOSH で管理
  • Dev, Prod の2環境
    • Dev で問題ないものを Prod にあげる
  • API Gateway に Spring Cloud Gateway の ProxyExchange (ユーティリティ) を使っている
  • Hystrix で Circuit Breaker
    • ある決済機関で発生した障害が API Gateway まで伝搬しないように
    • 処理がブロックされてスレッドが枯渇する
  • 非同期処理は RabbitMQ + Spring Cloud Stream
    • ある加盟店で障害が発生したときはキューに退避して再送する
    • Hystrix で Circuit Breaker
  • PCF App Autoscaler
  • 12 Factor App ★
    • ログは標準出力に出力すればプラットフォーム側で集約
    • ロストしたくないログはRDBに保存する
  • JMeter による E2E テスト
    • JMeter の HTML レポートが意外と使える
  • Java の複数バージョンでのユニットテスト
    • Docker イメージを使って各バージョンでテストする
    • アップデートの弊害を早期に検知する
    • 複数バージョン同時にテストできるCI環境
    • 簡単にデプロイできる Dev / Staging / Prod 環境
  • Observability
    • Metrics, Tracing, Logging
    • Grafana (Micrometer)
    • Kibana
    • Zipkin
      • サービス跨ぎでどこの処理に時間がかかっているか分かる
      • SQLの実行時間を確認できる

Spring ♥ GCP ー Spring と GCPの素敵な関係(アプリ実行環境としてのGCPを考える)

  • GCP を使うメリットはスケール感
  • Cloud Function は Java 未サポート
  • App Engine
    • 2番目にサポートした言語が Java
  • フレキシブルの中身はVM
    • 起動に時間がかかる
  • スタンダードはサンドボックス
    • フレキシブルより使えるライブラリに制限が多い
    • ランタイムのサポートを広げる (普段のランタイムと同じように使えるように)
    • スタンダード第二世代 (Java サポートあり)
  • App Engine にデプロイするときは war でパッケージングする
    • ランタイムが Jetty なので
  • アプリのモジュール化
  • App Engine 上でバージョニング
    • Splitting Traffic
    • 新旧バージョンでリクエストを振り分ける
  • GKE
    • zero-ops を目指す
    • master ノードは Google がメンテする
    • worker ノードはオプションを提供している (オートスケールなど)
    • アプリケーションがコンテナ化されていること (Docker)
    • Container Registry に登録されていること
    • Docker 化されたアプリは pod という単位で扱われる

Amazon Cognito使って認証したい?それならSpring Security使いましょう!

www.slideshare.net

  • Core, Web, Config
  • SecurityFilter は複数ある
    • Security Filter Chain
    • 実行される順序は決まっている
  • AccessDecisionVoter ★
    • Voter は複数持てる
    • Voter の投票結果から Manager がアクセス権を判断する
    • Manager も複数ある
  • Amazon Cognito
  • 認証成功でユーザープールトークンが返る
  • アクセストーク
    • JWT
    • 有効期限は1時間、切れたら更新トークンを使って更新する
  • アクセストークン検証
    • JWTの構造、署名、クレーム
    • 何を認証するかは Cognito のリファレンスを参照
  • テストでは MockMvc に SecurityFilter を追加する
  • メソッドセキュリティ ★
    • メソッド呼び出しのレベルでアクセス制御する
    • Post... は戻り値に対してチェックする

Pivotal認定講師が解説!基礎からのOAuth 2.0とSpring Security 5.1による実装

  • 認可サーバーがアクセストークンを発行する
  • Keycloak
    • SSO基盤
    • OAuth2, OpenID Connect をサポート
  • 認可コード
    • 認可サーバーからアクセストークンをもらうときに使う
      • アクセストークンをブラウザに保持させたくない
    • クライアントは認可コードと引き換えにアクセストークンを受け取る
      • アクセストークンを持ってリソースサーバーに問い合わせる
  • どのように認可するかは未定義
    • 開発者が自作するか、ライブラリ依存
  • クライアント > 認可サーバー への認証がある (ベーシック認証)
  • アクセストークンが本当に認可サーバーから発行されたものかチェックする必要がある
    • 認可サーバーに問い合わせてアクセストークンを検証
    • スコープをチェックしてレスポンスを返す
    • チェックの方法は OAuth2 で未定義 (何かしらの形でチェックせよとしか書いてない)
  • JWT
    • 電子署名は認可サーバーの 秘密鍵 で暗号化される (認可サーバーの 公開鍵 で復号する) ★
    • 本来の秘密鍵/公開鍵の使い方とは逆
  • JWK: 公開鍵を算出するための情報群
  • JWT を使うときはアクセストークンの有効期限を短くする ★
    • 認可サーバーに問い合わせないため、認可サーバー側では無効化することができない
    • リフレッシュトークンでリフレッシュする
  • Spring Security
    • 認可サーバーは OAuth2 未対応
    • 5.2 以降?

Spring Boot with Kotlin, functional configuration and GraalVM

  • Kotlin
  • WebFlux, Spring Data Reactive
  • Spring Fu
    • faster, lighter な Spring Boot
  • Lambda を lazy な factory bean として使う
  • Auto Configuration を functional bean として使う
  • セルフドキュメンテーション
  • Kofu, Jafu
  • functional に configuration する
  • Reactive API vs Coroutines API
  • Spring Boot & GraalVM

業務で使いたいWebFluxによるReactiveプログラミング

スライドが公開されたら要復習。

所感など

前回は Spring 5 がリリースされたあとだったので、そのあたりの話題で盛り上がりましたが、正直、今回は前回ほどの目新しい情報はないかなとか思ってました。が、いろいろと実験的な機能含めてどんどん新しい機能が追加されている/今後追加されていくようで、キャッチアップするのが大変そう...。とはいえ、今後の Spring の動向が知れてよかったです。今後の Spring において優先度の高い観点としては、簡潔さ、容易さ、省メモリ、(起動時間含めて) 高パフォーマンスあたりであると思われます。特に Spring アプリをコンテナ化したときに必要に応じてすぐに立ち上がることは大事。

いよいよ R2JDBC で DB 側がリアクティブサポートされるようです。ただ、WebFlux あたりはあまり使ったことがないので、要復習。あと、WebFlux は js フレームワークと組み合わせたときはどうなるんだろうか。要調査。

Kofu, Jafu の話はきちんと理解できず。要復習。

Google の話は聴いてよかったです。最近は AWS ばかり調べてましたが、Googleクラウドサービスもウォッチした方がよさそう。