Spring Fest 2018に参加して気になった技術

# はじめに
[Spring Fest 2018](https://springfest2018.springframework.jp/)に参加し、いくつかのセッションを聞いてきました。
その中で「もっと知りたい」「自分の開発にも取り入れてみたい」と思った技術などを紹介します。
※どんなセッションがあったか、参加したセッションの内容説明は今回はしません。（[Spring Fest 2018 の公式サイト](https://springfest2018.springframework.jp/)に開催されたセッションとその発表スライドなどがあります。）

**まだ途中なのでちょっとずつ更新します**

# JVM、Kotlin関連

## [GraalVM](https://www.graalvm.org/)
クラウド環境で動かすことを想定すると、すごくメリットがありそうな機能で注目したい。

- JavaScript, Python, Ruby, R, JVM, JVM言語(Java, Scala, Kotlin, Clojure), C, C++ などの多くの言語が動くVM
- Nativeイメージにコンパイルすることができ、JVMベースアプリの起動時間やメモリのフットプリントを減らせる
- Keynoteでのアプリのデモでは、GraalVMとNettyで0.007秒で起動し、メモリ使用量もすごく少ないよという話があった

## [Spring Fu](https://github.com/spring-projects/spring-fu)
[Kotlin](https://kotlinlang.org/)はSpringでも積極的にサポートしてるよ！とのこと。

- Kofuと呼ばれるKotlin DSLで、アノテーションではなくコードベースの設定記法(functional configuration)で軽量なSpringアプリケーションを作成できる実験的プロジェクト
- Java向けのJafuというのもある
- Jafu,Kofuを総称してSpring Fuと呼ぶみたい

# ReactiveなWebアプリケーション
この界隈の技術は今後盛んになりそう。[Spring 5に備えるリアクティブプログラミング入門](https://www.slideshare.net/TakuyaIwatsuka/spring-5)がかなり参考になった。

## [Spring WebFlux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html)

- ノンブロッキングのイベントループモデルで動く[Reactive Streams](http://www.reactive-streams.org/)で作成されたアプリケーションフレームワーク

## [R2DBC](https://r2dbc.io/)

- RDBをreactive programming APIで利用できる

## [RSocket](http://rsocket.io/)

- TCP, WebSocket, Aeronのようなバイトストリームト転送で使用するためのバイナリプロトコル

# モニタリング
早期的なサービスの問題検知、性能改善や新機能の効果測定の可視化など、継続的なサービス運用をするにはもはや必須と感じた！

## [Prometheus](https://prometheus.io/)

- もともと[SoundCloud](https://soundcloud.com/)社で作られた、OSSのシステム監視/アラート通知ツール
- メトリクス名とkey/valueのペアごとの時系列データを持つ、多次元データモデル
- 多次元データモデルを利用するための柔軟なクエリが用意されている
- 分散ストレージに依存しない、自立型の単一サーバノード
- pull型監視(Prometheus -> 監視対象サーバ)による時系列コレクション
- ゲートウェイを介したpush型の時系列モデルもサポートしてる
- [O'REILYのSRE本](https://www.oreilly.co.jp/books/9784873117911/)でも紹介されてる
- バイナリ実行するだけで動く

## [Micrometer](https://micrometer.io/)

- 様々なモニタリングシステムに対して、共通のインターフェースで利用できる機能を提供している
- SLF4Jのメトリクス版のようなもの
- Prometheusもサポートしている

## [Spring Boot Actuator](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-actuator)

https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html

- `/actuator/***`というエンドポイントへアクセスするだけで、Spring Bootアプリケーションのモニタリングなどができる機能
- 内部でMicrometerを利用している

## [Grafana](https://grafana.com/)

- 簡単にかっこいいグラフが作れる、ログやデータの可視化ツール

# マイクロサービス/分散システムの構築に役立つ技術

## [Hystrix](https://github.com/Netflix/Hystrix/wiki)

- 分散システム上で発生するレスポンス遅延やサービスダウン時の挙動を制御するライブラリを提供しているOSS
- サーキットブレーカーの機能が有名
- 外部サービスの呼び出しの失敗、遅延が発生してリクエストが詰まりそうになった場合、設定したエラーを返したり直前の値をキャッシュしたものを返すなどができる
- Netflixが開発している

## [Zipkin](https://zipkin.io/)

- 分散システムで、あるリクエストが複数のサーバをまたがって処理している場合にどこで時間がかかっているかなどのデータを収集して原因調査などに役立てることができる

## [Apache Kafka](https://kafka.apache.org/)

- MQやPub/Subなどを利用できる分散メッセージングシステム

# CI周りとか
あまりSpringとは関係ないが面白いなと思ったのでメモ。

## [Concourse](https://concourse-ci.org/)でのUTをJavaの複数バージョンで並列で実施

- 将来的にJavaをバージョンアップする時にすぐ移行できるように、実施しているとのこと
- 実際にTLS証明書のハンドシェイク周りのバグで、jdk11ではテスト失敗し、jdk12では成功するという状態を発見したこともあったらしい

## [JMeter](https://jmeter.apache.org/)で毎日負荷テストとレポート出力

- 綺麗なレポートを作成できるらしい
- テスト環境などで毎日実施して、Slackでレポート通知などすることもできる