Spring Fest 2019 まとめ

# Spring Fest 2019

- Spring Festの公演をメモレベルでまとめます。
    - 公式： https://springfest2019.springframework.jp/
- 各Session
    - https://springfest2019.springframework.jp/#session

## 目次
- [基調講演](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#%E5%9F%BA%E8%AA%BF%E8%AC%9B%E6%BC%94)
- [Spring Boot 爆速開発超絶技工](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#spring-boot-%E7%88%86%E9%80%9F%E9%96%8B%E7%99%BA%E8%B6%85%E7%B5%B6%E6%8A%80%E5%B7%A5)
- [LINE公式アカウントのチャットシステムにおけるSpringおよびWebFluxの活用事例](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#line%E5%85%AC%E5%BC%8F%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bspring%E3%81%8A%E3%82%88%E3%81%B3webflux%E3%81%AE%E6%B4%BB%E7%94%A8%E4%BA%8B%E4%BE%8B)
- [実践 Spring Boot Actuator + Micrometer](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#%E5%AE%9F%E8%B7%B5-spring-boot-actuator--micrometer)
- [Spring と GraalVM Native Image - 2019/12時点](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#spring-%E3%81%A8-graalvm-native-image---201912%E6%99%82%E7%82%B9)
- [RSocket徹底入門 ~Spring 5.2の目玉機能であるRSocket対応とは~](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#rsocket%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-spring-52%E3%81%AE%E7%9B%AE%E7%8E%89%E6%A9%9F%E8%83%BD%E3%81%A7%E3%81%82%E3%82%8Brsocket%E5%AF%BE%E5%BF%9C%E3%81%A8%E3%81%AF)
- [Spring Social でソーシャルログインを実装する](https://qiita.com/yoshiki-0428/items/815870cd6ffddcb28dd7#spring-social-%E3%81%A7%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B)

# 基調講演
### 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
    - ６ヶ月ごとのリリース
        - 来年２回リリースされる

### 槙さん
- GraalVM Native Image
    - 通常のJITよりも起動速度と消費メモリが優れている
        - ただし、コンパイル遅い
    - Spring Cloud Release Train
        - ロンドンの駅順でリリースされている
            - 現在はGreenwich
            - NetflixのバージョンがMaintenance Modeに
    - Spring Cloud Stream
        - Messaging Framework
            - Functionでかけるようになった
    - Buildpack pack	
        - 作成したSpringBootアプリケーションから自動的にDockerimageを作成してくれる
        - Pack CLI
        - https://github.com/buildpacks/pack

# 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

### スライド
https://speakerdeck.com/yusuke/spring-boot-and-intellij-idea-technique

# LINE公式アカウントのチャットシステムにおけるSpringおよびWebFluxの活用事例
> LINE株式会社 長谷部さん

## 内容
- LINEでは大体Spring Frameworkを使用しているプロジェクトは5000プロジェクトくらいある
- Why
    - DI & Container & AOP
    - 豊富なインテグレーション
        - Mybatis, FreeMerker Thymeleaf, SpringBootActuater, prometeus
- 活用事例
    - LINE公式アカウント
        - 規模
            - サーバ１５０台
            - 月４億アクセス
            - MAU: ５万
- 設計/構成
    - もとめられる要素 その１
        - リアルタイム通信
            - 候補
                - Polling
                - SSE
                - WebSocket
                - gRPC RSocket
            - SSEを採用
                - 双方向通信は不要、テキスト形式でも問題ない
                - WebSocketと比較するとシンプル（HTTP 1.1 Chunckedベース）
            - Spring-webmbv で SSE
                - サーバとつなぎっぱなし
                - １リクエスト、１スレッド扱うことになり、高負荷
                - Spring MVCではBlocking I/O なので微妙
            - そこでWebflux
                - Non Blocking I/O
                - スレッド効率が良い
                - サーバの数が少ない
                - ただしBlockするコードは書いてはいけない、
        - リアルタイムに届くまでの流れ
            - Talk Server -> Event Receiver -> Kafka -> Event Procerssor -> Redis Cluster(PubSub) -> SSE -> ブラウザ
                - ※[Kafka](https://qiita.com/sigmalist/items/5a26ab519cbdf1e07af3)
    - もとめられる要素 その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に
            - 現在は修正済み
    - 困った話2
        - Blocking DNS Resolver
        - ２ヶ月に１回、threadがhangしてしまう現象があった
    - Tips: BlcockHound
        - https://github.com/reactor/BlockHound
        - 依存関係に入れる
        - Testで Blockhound.install() を入れるとBlocking Codeを検出してくれる

### スライド
https://speakerdeck.com/line_developers/examples-of-using-spring-and-webflux-in-the-chat-system-for-line-official-accounts

# 実践 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
- SpringBoot And Micrometer
    - Auto Configuration
        - なにもしなくても主要なmetricsを自動集計
    - Custom Metrics
        - ビジネスロジックなどのカウント、ゲージ、タイマーしたい値を簡単に追加できる

### スライド
https://docs.google.com/presentation/d/1ChFvgyxoqlA2eX4bwse1VC9vcFpiFYtFSVV1YqbBzt4/edit

# 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生成の流れ
        - セットアップ -> 静的解析 -> コンパイル -> リンク -> クリーンアップ
- Spring と Native image
    - Springではリフレクションが多用されている
    - ダイナミックプロキシが活用されている
    - Spring Feature
        - SpringアプリをNative Imageでビルドするときに必要な設定郡
            - Reflection Handler: 内部で利用するリフレクションの設定を扱える
            - Dynamic Ploxy Handler: 内部で利用するダイナミックプロキシの設定を扱う
            - Initialization Handler: クラス初期化タイミングの設定を扱う
            - Resource Handler: 内部的に利用するリソースの設定を扱う

### スライド
https://www.slideshare.net/TakuyaIwatsuka?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview

# RSocket徹底入門 ~Spring 5.2の目玉機能であるRSocket対応とは~
>  株式会社Pivotal 槙 俊明さん

### 内容
- RSocketとは？
    - Duplex 双方向でMultiplexなバイナリプロトコル
    - reactive.foundation
    - ４つのInteration model
        - Request Response
            - 1 メッセージ送信、1メッセージを受信
        - Request Stream
        - Request Chanel
            - メッセージのストリームを送信、メッセージのストリームを受信
        - Fire and forget
            - １メッセージを送信、受信なし
    - Duplex
        - 双方向通信
    - Reactive Streams 
        - 非同期ストリーム
        - Nを指定してN分リクエストをコントロールできる（処理する分だけ）
        - WebfluxのReactorの違いは、JVM外の外のネットワークでリアクターになった点
    - Session Resumption
        - 送信中にネットワークエラーになった際に、途中のデータから送信を送ってくれる
    - Leasing
        - ResponderがRequesterに対してリクエストを制限する
        - RequesterがResponderを圧倒しないようにする機構
    - 多言語対応
        - RSocketはJava, JS, Kotlin, go, Python, C+…etc
    - CLI
        - https://github.com/rsocket/rsocket-cli
        - https://github.com/making/rsc
    - Demo
        - https://github.com/making/demo-rsocket-jsug

``` java
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のエンドポイントを構成できる


``` java
@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を使用して途切れたデータを再送信することができる
- まとめ
    - 多くのサポートはされているが、まだまだ資料が少ないので路頭に迷う可能性大
    - Springがサポートしているのが心強い

### スライド
https://t.co/I5jXiw2hNr

# Spring Social でソーシャルログインを実装する
>  株式会社Rakuten 田中 竜介さん

### 内容
- 前段
    - 楽天ペイ(オンライン)の技術要素
        - 言語
            - Java11
        - ライブラリ
            - Spring boot
            - Spring secury
            - MyBatis
        - インフラ
            - Azure
            - Kubenetes
            - Docker
    - 大事なお知らせ
        - Spring Socialは EOL を迎えている
        - 終了してしまった
        - Spring Securiy OAuth2を使用するようにアナウンスが出ている
- デモ
    - https://github.com/jack-berkut/spring-security-oauth-demo
- OAuth2 / Open Id Connect
    - 背景
        - 様々なサービスが公開されてきた
        - 新しい価値を提供するため１つのサービスに統合させる必要が出てきた
    - Spring Security Oauth2 Client
        - 複雑なクライアント実装が不要
    - Spring Security Core
        - 具体的な認証は処理をClientに移譲
- 最後に
    - Spring OAuth2, Spring Boot Auto-configurationを利用することで実装コストをかけずに導入する
    - EOFきをつける

### スライド、参考資料
https://github.com/jack-berkut/spring-security-oauth-demo