Spring Fest 2019
- Spring Festの公演をメモレベルでまとめます。
- 各Session
目次
- 基調講演
- Spring Boot 爆速開発超絶技工
- LINE公式アカウントのチャットシステムにおけるSpringおよびWebFluxの活用事例
- 実践 Spring Boot Actuator + Micrometer
- Spring と GraalVM Native Image - 2019/12時点
- RSocket徹底入門 ~Spring 5.2の目玉機能であるRSocket対応とは~
- Spring Social でソーシャルログインを実装する
基調講演
Stéphaneさん
- RSocket
- JUnit5
- パフォーマンス
- 起動時間の改善
- 遅延初期化(Lazy initiation)
- ランタイムのパフォーマンス改善
- 統計情報
- 1年で何プロジェクト?1ヶ月で100万プロジェクト
- ダウンロードTop3
- 中国
- アメリカ
- インド
- クライアントの内訳
- Web: 50%
- CLI: 3%
- IDE: 50%
- Spring Framework 5.3
- JDK 17 LTSに対応
- GraalVM native image対応
- 5.x テーマの改善 (RSocket Corouting)
- Spring Boot 2.3
- Containerサポート
- なるべく自動化、packとの連携、他のものも連携
- Kubenetesサポート
- KubenetesクラスターをSpringで実行した場合、選択肢が増える
- 依存ライブラリアップデート
- SpringData
- 6ヶ月ごとのリリース
- 来年2回リリースされる
- Containerサポート
槙さん
- GraalVM Native Image
- 通常のJITよりも起動速度と消費メモリが優れている
- ただし、コンパイル遅い
- Spring Cloud Release Train
- ロンドンの駅順でリリースされている
- 現在はGreenwich
- NetflixのバージョンがMaintenance Modeに
- ロンドンの駅順でリリースされている
- Spring Cloud Stream
- Messaging Framework
- Functionでかけるようになった
- Messaging Framework
- Buildpack pack
- 作成したSpringBootアプリケーションから自動的にDockerimageを作成してくれる
- Pack CLI
- https://github.com/buildpacks/pack
- 通常のJITよりも起動速度と消費メモリが優れている
Spring Boot 爆速開発超絶技工
株式会社サムライズム: 山本さん
内容
- TR;TD
- IntelliJで爆速で開発できるようになる
- IntelliJ IDEA初期設定
- Keymap はMac OS
- USキーボード設定
- タッチバーは無効化
- IntelliJ便利機能
- なんでも検索: shift * 2
- なんでも実行: ctr * 2
- 過去の開いていたファイル Cmd + E, Cmd + E
- 定義元、呼び出し元 Cmd + B
- 補完後のTabとEnterを使いこなす
- カッコ閉じるときはShift + Cmd + Enterで自動的にかっこ補完
- Postfix complestionを使いこなす
- strings.vars Enterで変数を書いてくれる
- isHoge.not.if でif文を作成してくれる
- デバッグ
- ブレークポイントに条件をつけれる
- ブレークポイントにメッセージをつくれる
- 実行
- Shift +( Ctr )+ R
- Git
- IntelliJのGitツールを使うと壊れたコードを確認できる
- おすすめプラグイン
- Key promoter X
- Presentation Assistant
- Rainbow Bracket
スライド
LINE公式アカウントのチャットシステムにおけるSpringおよびWebFluxの活用事例
LINE株式会社 長谷部さん
内容
- LINEでは大体Spring Frameworkを使用しているプロジェクトは5000プロジェクトくらいある
- Why
- DI & Container & AOP
- 豊富なインテグレーション
- Mybatis, FreeMerker Thymeleaf, SpringBootActuater, prometeus
- 活用事例
- LINE公式アカウント
- 規模
- サーバ150台
- 月4億アクセス
- MAU: 5万
- 規模
- LINE公式アカウント
- 設計/構成
- もとめられる要素 その1
- リアルタイム通信
- 候補
- Polling
- SSE
- WebSocket
- gRPC RSocket
- SSEを採用
- 双方向通信は不要、テキスト形式でも問題ない
- WebSocketと比較するとシンプル(HTTP 1.1 Chunckedベース)
- Spring-webmbv で SSE
- サーバとつなぎっぱなし
- 1リクエスト、1スレッド扱うことになり、高負荷
- Spring MVCではBlocking I/O なので微妙
- そこでWebflux
- Non Blocking I/O
- スレッド効率が良い
- サーバの数が少ない
- ただしBlockするコードは書いてはいけない、
- 候補
- リアルタイムに届くまでの流れ
- Talk Server -> Event Receiver -> Kafka -> Event Procerssor -> Redis Cluster(PubSub) -> SSE -> ブラウザ
- リアルタイム通信
- もとめられる要素 その2
- メッセージ送信、過去メッセージなどの検索
- Spring mvc でRest APIを構成
- Why
- JDBCを使用しなければいけなかったため
- いきなりWebFluxに置き換えるのはリスクが大きい
- もとめられる要素 その3
- Lineユーザの画像動画音声の取得
- 認証等の理由でProxyでアクセスする必要があった
- ここはweb flux
- 振り返り
- 運用して1年経過した。
- 障害なく運用できたため、技術選定は成功
- Webfluxになれてきた今としてはRestful APIサーバをWebfluxで構成すればよかった
- まとめ
- コンポーネントの役割に応じてwebflux, mvc を使い分けている
- Web flux
- SSEサーバ
- Event ReceiverContent Proxy
- Mvc
- 従来のビジネスロジックAPI
- 困った話1
- Netty OutOfMemory
- ReadTimeExceptionがSingltonだった
- Throwableが肥大してOOMに
- 現在は修正済み
- Netty OutOfMemory
- 困った話2
- Blocking DNS Resolver
- 2ヶ月に1回、threadがhangしてしまう現象があった
- Tips: BlcockHound
- https://github.com/reactor/BlockHound
- 依存関係に入れる
- Testで Blockhound.install() を入れるとBlocking Codeを検出してくれる
- もとめられる要素 その1
スライド
実践 Spring Boot Actuator + Micrometer
Acroquest Technology株式会社
進藤さん -> Tommy Ludwig
内容
- Micrometer
- Micrometer.io
- Actuator
- ライブラリを入れるだけで、SpringBootのmetricsや運用に必要な情報を提供してくれる
- 環境変数の切り分けで有効無効が選択できる
- Why metrics
- Alert は基本的にmetricsをもとに出している
- Analytics
- Alertを分析
- Lower Storage Cost
- Meter types
- Gauge (ゲージ)
- 減るかもしれないし、増えるかもしれない値
- CPU使用率…
- Counter (カウンター)
- 減ることのない数値
- リクエスト数,
- ※常にカウンターできるのであればゲージにする必要はない
- Timer
- かかった時間などをカウントする
- リクエストかかった時間
- Distribution summary
- Gauge (ゲージ)
- SpringBoot And Micrometer
- Auto Configuration
- なにもしなくても主要なmetricsを自動集計
- Custom Metrics
- ビジネスロジックなどのカウント、ゲージ、タイマーしたい値を簡単に追加できる
- Auto Configuration
スライド
Spring と GraalVM Native Image - 2019/12時点
NTTソフトウェアイノベーションセンター 岩塚 卓弥さん
※2019/12時点のものであり、変更される可能性があります
内容
- GraalVM Native概要
- Javaで書いたアプリケーションを使わずに実行可能
-
JVMを使わず
に実行できる! - AOTコンパイルが使われている
- JIT (Just in time) コンパイル
- AOT (Ahead of Time) コンパイル
- 共有ライブラリーを作れる
- JavaライブラリをCから実行できる
- Native Imageは高速??
-
起動は早い
が、実行が早い
わけではない- JDK: 30秒
- Graal: 40秒
-
- コンパイル時間がものすごくかかる
- Hello world が 1分、SpringBootアプリは1時間
- CE(Comunity Edition)とEE (Enterprise Edition)で実行時間に差がある
- コンパイルプロセス
- 実行可能Native Image生成の流れ
- セットアップ -> 静的解析 -> コンパイル -> リンク -> クリーンアップ
- 実行可能Native Image生成の流れ
- Spring と Native image
- Springではリフレクションが多用されている
- ダイナミックプロキシが活用されている
- Spring Feature
- SpringアプリをNative Imageでビルドするときに必要な設定郡
- Reflection Handler: 内部で利用するリフレクションの設定を扱える
- Dynamic Ploxy Handler: 内部で利用するダイナミックプロキシの設定を扱う
- Initialization Handler: クラス初期化タイミングの設定を扱う
- Resource Handler: 内部的に利用するリソースの設定を扱う
- SpringアプリをNative Imageでビルドするときに必要な設定郡
スライド
RSocket徹底入門 ~Spring 5.2の目玉機能であるRSocket対応とは~
株式会社Pivotal 槙 俊明さん
内容
- RSocketとは?
- Duplex 双方向でMultiplexなバイナリプロトコル
- reactive.foundation
- 4つのInteration model
- Request Response
- 1 メッセージ送信、1メッセージを受信
- Request Stream
- Request Chanel
- メッセージのストリームを送信、メッセージのストリームを受信
- Fire and forget
- 1メッセージを送信、受信なし
- Request Response
- Duplex
- 双方向通信
- Reactive Streams
- 非同期ストリーム
- Nを指定してN分リクエストをコントロールできる(処理する分だけ)
- WebfluxのReactorの違いは、JVM外の外のネットワークでリアクターになった点
- Session Resumption
- 送信中にネットワークエラーになった際に、途中のデータから送信を送ってくれる
- Leasing
- ResponderがRequesterに対してリクエストを制限する
- RequesterがResponderを圧倒しないようにする機構
- 多言語対応
- RSocketはJava, JS, Kotlin, go, Python, C+…etc
- CLI
- Demo
public interface RSocket extends Availability, Closeable {
Mono<Payload> requestResponse(Payload payload);
Flux<Payload> requestStream(Payload payload);
Flux<Payload> requestChannel(Publisher<Payload> payloads);
Mono<Void> fireAndForget(Payload payload);
Mono<Void> metadataPush(Payload payload);
}
- Spring FrameworkのRSocketサポート
- spring-messagingの@MessageMappingを使ったMessaging StyleのRSocketプログラミングモデルを提供
- Spring Boot Starter RSocket + WebFlux
- 同じポートの中にHttpとWebSocketのエンドポイントを構成できる
@Controller
public class HelloController {
@MessageMapping("hello") // Routing Metadata をサポート
public Mono<String> hello() {
return Mono.just("Hello World!");
}
@MessageMapping("hello.many")
public Flux<String> helloMany() {
return Flux.just("Hello!", "Hello!", "Hello!");
}
}
- RSocketの事例
- FaceBook
- GraphQL Live Queries
- Prometheus RSocket Proxy
- Kubenetes(k3s)
- RSocket Proxy
- Leasingを使用して途切れたデータを再送信することができる
- FaceBook
- まとめ
- 多くのサポートはされているが、まだまだ資料が少ないので路頭に迷う可能性大
- Springがサポートしているのが心強い
スライド
Spring Social でソーシャルログインを実装する
株式会社Rakuten 田中 竜介さん
内容
- 前段
- 楽天ペイ(オンライン)の技術要素
- 言語
- Java11
- ライブラリ
- Spring boot
- Spring secury
- MyBatis
- インフラ
- Azure
- Kubenetes
- Docker
- 言語
- 大事なお知らせ
- Spring Socialは EOL を迎えている
- 終了してしまった
- Spring Securiy OAuth2を使用するようにアナウンスが出ている
- 楽天ペイ(オンライン)の技術要素
- デモ
- OAuth2 / Open Id Connect
- 背景
- 様々なサービスが公開されてきた
- 新しい価値を提供するため1つのサービスに統合させる必要が出てきた
- Spring Security Oauth2 Client
- 複雑なクライアント実装が不要
- Spring Security Core
- 具体的な認証は処理をClientに移譲
- 背景
- 最後に
- Spring OAuth2, Spring Boot Auto-configurationを利用することで実装コストをかけずに導入する
- EOFきをつける
スライド、参考資料