SpringOne 2020 Day 2 視聴ログ

SpringOne 2020 のセッション動画が公開されたのを視聴して面白かったポイントをメモ。こちらは Day 2。Day 1 はこちら

タイトルの 👍 の数は面白かった度合いです。



Connect Your Functions with RSocket 👍👍

Conect Your Function with RSocket

www.slideshare.net

RSocket と Spring CLoud Function を連携する話。

RSocket の基本的な説明

Spring Cloud Function と RSocket の関係

  • 別人かってくらいやる気がなくなってるけどライブコーディング始めたら少し元気になってきた
    • spring-cloud-stream-binder-rabbit を依存ライブラリに追加するだけで RabbitMQ につながる!
    • 起動引数だけで有効化する Function Bean を制御できる --spring.cloud.function.definition=nnn
  • RSocket を使うには spring-cloud-function-rsocket を依存ライブラリに追加する
    • Function Bean は4種類のどのコミュニケーションモデルでも利用できる
    • Function Routing という考え方が登場する
      • functionRouter という組み込みの部品を使う
      • メッセージに応じて Function Bean を分配するための仕組み
        • 例: ヘッダーで判断する spring.cloud.function.routing-expression=headers.func (func というキーの値で制御する)
        • コンテンツタイプとかいろいろ制御できる

Spring Cloud Function の Function Routing の制限をどうにかする仕組み

  • Spring Cloud Gateway から分離して rsocket の incubator プロジェクトとしてやっている RSocket Routing Broker という部品の機能 (rsocket-routing-client-spring という依存ライブラリ)
  • n 対 n 同期型のブローカークラスタを形成できるみたい
    • RabbitMQ で見たやつだ

Introduction to WebMvc.fn 👍👍

Introduction to WebMvc.fn

www.slideshare.net

WebMvc.fn の基本要素を紹介。

Spring Web MVCアノテーション中心の設計をプログラミングで実現するような感じで面白い。

メソッド引数への自動的なバインディングは無くなるけど、ルーティングの自由度は高まる。

Handler Functions

  • ServerRequest から ServerResponse へ変換する役割
  • RequestEntity を ServetRequest に、ResponseEntity を ServerResponse に書き換えるだけのような感じ
    • 便利アノテーションが使えなくなるけどそれは Router Function や Filter Function で対応する
    • Validated が使えなくなるのは不便だなぁ

Router Functions

  • ServerRequest に HandlerFunction を対応付ける役割
  • アノテーション @RequestMapping(vakye=”/path”, method={”GET”}) をビルダー route().GET(“/path”, handlerFunction) に置き換えるような感じ
  • ビルダーを構成する RequestPredicate にはもっと柔軟な制御をする機能がある

Request Predicates

  • 機能
    • リクエストメソッドの判断 RequestPredicates.method(HttpMethod.GET)
    • パスの判断 RequestPredicates.path(“/path”)
    • パスの拡張子の判断 RequestPredicates.pathExtension(“json”)
    • ヘッダーの判断 RequestPredicates.accept(APPLICATION_JSON)
    • リクエストパラメーターの判断 RequestPredicates.param(“type”, “json”)
  • 特徴
    • Predicate は合成できる predicateA.and(predicateB) predicateA.or(predicateB)

Filter Functions

  • Router Function の機能の一部
  • Spring Web MVC の ExceptionHandler をビルダーの onError で置き換える感じ

Spring Security Patterns 👍👍

Spring Security Patterns

www.slideshare.net

Spring Security の始め方から簡単な使い方までの紹介

Spring Security の始め方

  • 依存ライブラリに spring-boot-starter-securityを追加するだけで basic 認証が有効になる
    • 自前のエンドポイントだけでなく組み込みのエンドポイントにも
  • Secure by Default という考え方を覚えておくこと
  • 初期ユーザーは user、初期パスワードはランダム文字列
  • デフォルトプロファイルを本番プロファイルにしておくとよい
    • プロファイルの指定を忘れたときのため
    • ローカルファイルや h2 を使うプロファイルは dev とかにしておく
  • 未知のエンドポイントへのアクセスには 404 ではなく 401 を返すほうがいい
    • エンドポイントが存在するかどうかも秘匿すべき情報
  • パスワード再発行ページでは ユーザーが存在しない エラーを伝えるべきではない
    • ユーザーが存在してたらメールを送信しておくね くらいがちょうどいい

認証情報の使い方

  • Security Context Holder の static メソッドにアクセスする
    • リクエストを処理するのは1つのスレッドに限定されている
    • 認証情報はリクエストごとに生成したスレッドローカルオブジェクトに保存している
    • スレッドローカルの情報が他のスレッドに漏れることはない
  • DI する
    • Authentication オブジェクト
    • @CurrentSecurityContext(expression=”authentication.name”) String name

例: OAuth2 のリソースサーバーを構成する

  • Basic 認証は弱いのでトークンベースの認証に切り替えたほうがいい
    • たとえば OAuth2
    • 依存ライブラリにspring-boot-starter-security-oauth2-authorization-server を追加する
    • UserDetailService の代わりに RegisteredClientRepository Bean を登録する
  • クライアントが認証・認可サーバーから取得したクレームに含まれるスコープを Authentication#authorities (認可情報)として利用できる
  • JwtGrantedAuthoritiesConverter という組み込み実装を利用すると便利
    • トークンを GrantedAuthority に変換する Converter を構成できる
  • 継承ではなくコンポジションで利用するのが Spring Security の作法なので注意
    • 段階的に機能を拡張できるのがいいところ

例: 認証・認可情報の判断をビジネスロジックから追い出す

  • 宣言的セキュリティモデル、という考え方
  • メソッドベースのセキュリティ
    • @PreAuthorize(“hasAuthority('captain')”) みたいなメソッドアノテーションを利用する
  • リクエストベースのセキュリティ
    • WebSecurityConfigureAdapter を継承した設定クラスで DSL により構成する

Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gatling 👍

Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gatling

www.slideshare.net

AVT (自動化仮想テスト?) という考え方の紹介

伝統的なテストの課題

  • 不安定な環境
  • システム間の依存性
  • テストできる期間が限られてる
  • 信頼できない結果

AVT

  • 外部環境との結合を分離してコンテナ環境でモックを対象にテストする考え方
  • Liberty Mutual では Bitbucket Server + Bamboo を利用してる
  • コンテナ環境は Docker Enterprise
  • 性能テストのクライアントも同じコンテナ環境で実行する
    • 十分に負荷をかけるのが大変そうだけどどうなんだろうな
  • kompose で docker-compose.yml をマニフェストに変換してる
    • テスト結果は S3 経由で InfluxDB に記録して Grafana ダッシュボードで確認できるようにしてる、など

Enabling Cloud Native Buildpackas for Windows Containers 👍

Enabling Cloud Native Buildpackas for Windows Containers

www.slideshare.net

Build a Windows app · Cloud Native Buildpacks

Windows Container をビルドできる CNB を作った話

  • pack-cli によるビルダーイメージの構築部分を改修するためいろいろ頑張った
  • ライフサイクル管理の実装は bash を前提にしてたので改修するのがとてもとても大変だった
  • Windows イメージのレイヤリングは Linux イメージと全然違う
    • 特別な形式の TAR が必要になった
    • C:\Windows\System32\tar.exe を利用してるのかな
  • いろいろ大変だったけど完成した
    • Tanzu Build Service でベータ版を利用できる
    • pack-cli から利用できる
  • nanoserver のコンテナイメージは 4GB くらいある

Spring Boot Omakase: A First-Paced “Chef’s Choice” Dive into Fun and Useful Topics! 👍👍

Spring Boot Omakase: A First-Paced “Chef’s Choice” Dive into Fun and Useful Topics!

www.slideshare.net

SpringOne 2020 最後のセッション。Omakase = シェフのおまかせ。コンフィギュレーションやデプロイメントのおすすめレシピを紹介する話。

全編ライブコーディングなので動画を見ないとわからないやつ。🎥

Configuration

プロパティファイル、環境変数、アプリケーション引数をいい感じに利用する話。

  • Dtoクラスに ConigurationProperties で対応するプロパティキーを束縛できる
    • ConfigurationPropertiesScan も忘れずに
    • すると IDE がプロパティキーの型をクラスのフィールド型から推測できるようになる
      • コンストラクタにConstructorBinding を指定、引数にName でフィールド名とは異なるキー名を指定できる
    • 便利
  • Bean メソッドにも ConfigurationProperties を指定できる
    • 便利

Deployment

  • Shaded jar と Spring Boot の Executable Jar の違い
    • Shaded Jar や Uber Jar は依存ライブラリを展開して単一の jar ファイルに格納する
    • Spring Boot の Executable Jar は依存ライブラリをネストするのでクラスの読み込みとかが少し速い
  • Value で DI した値の取得元は Actuator で参照できる
    • 便利