- Spring Fest 2018に参加してきました。
springfest2018.springframework.jp
KFCHall | KFCHall Annex | KFCHall 2nd | Room111 |
---|---|---|---|
KEYNOTE SébastienDeleuze(Pivotal) |
- | - | - |
決済システムの内製化への旅 ‒ SpringとPCFで作るクラウドネイティブなシステム開発 槙 俊明(Pivotal) 鈴⽊ 順也(ソフトバンク・ペイメント・サービス株式会社) |
エンタープライズ・マイクロサービスの格⾔ ⻑⾕川 裕⼀(Starlight&Storm/⽇本Springユーザ会) |
Spring Data for Apache GeodeでRDBいらずのアプリ開発をしよう! ⼭河 征紀(ウルシステムズ株式会社) |
これからSpringを使う開発者が知っておくべきこと ⼟岐 孝平(⽇本Springユーザ会スタッフ) |
Rakuten Travel and Spring Kalburgi Gajraj(楽天株式会社) |
Spring ♥ GCP ー SpringとGCPの素敵な関係 福⽥ 潔(Google) |
実際のプロジェクトでSpringアプリをKotlinで開発して得た気づき集 ⻑澤 太郎(Ubie株式会社) |
Thymeleafさいしょの⼀歩 伊賀 敏樹 |
Knative:Serving your Serverless Java Serviceon Kubernetes the 12-Factor way Kamesh Sampath(Redhat) |
Observability with Spring-Based Distributed Systems Thomas Ludwig(楽天株式会社) |
AmazonCognito使って認証したい?それならSpring Security使いましょう! 内⽴ 良介(コイニー株式会社 ⽇本Javaユーザーグループ) |
SpringBootで作るRESTful Web Service ⼤野 渉(Starlight & Storm/JSUGスタッフ) |
Pivotal認定講師が解説!基礎からのOAuth2.0とSpring Security5.1による実装 多⽥ 真敏(株式会社カサレアル) |
500+のサーバーで動くLINE Ads PlatformをささえるSpring 渡邉 直樹(LINE株式会社) |
SpringTools4の機能とその実装 岩塚 卓弥/堅⽥ 淳也(NTTソフトウェアイノベーションセンタ) |
Spring5でSpring Testのここが変わる 平栗 勇⼈(株式会社NTTデータ) |
Spring Boot with Kotlin, functional configuration and GraalVM SébastienDeleuze(Pivotal) |
⼤規模⾦融系SaaSを⽀えるSpring〜活⽤の変遷と新時代のアーキテクチャ〜 ⽝塚 裕介(株式会社野村総合研究所) |
Spring Data RESTとSpring Cloud Contract ⼩川 岳史/⼭﨑 ⼤(株式会社タグバンガーズ) |
Spring BootでHello Worldのその先へ〜ウェブDBプレスのSpring Boot特集で伝えたかったこと&伝えきれなかったこと~ 藤野 真聡(ソニーネットワークコミュニケーションズ株式会社) |
業務で使いたいWebFluxによるReactiveプログラミング ⾕本 ⼼(Acroquest Technology株式会社) |
- | Micrometer/Prometheusによる⼤規模システムモニタリング〜ヤフーインターネット広告システムでの導入事例〜 池⽥ 誠(ヤフー株式会社) |
Angularを⽤いたデザインスプリント開発と設計⼿法 佐川 夫美雄(アシラス株式会社) |
KEYNOTE - The State of Spring, Java and Kotlin
- SébastienDeleuze(Pivotal)
Javaの現状
- Java8が広く使われるようになってきた
- 2017/10で75%くらい使われてる
- 残りはほとんど7
- 9はLTSじゃないから少ない
- JavaSE Lifecycle
- LTSは3年ごと
- 次は11その次は17
- 6ヶ月ごとにリリース
- LTSは3年ごと
Java LTS Version
- Java8
- Java8がベースになっていく
- 2023+までサポート
- Java11
- 2023+までサポート
- Java17
- 2021リリース予定
SpringとJava
- v4.3はJava8まで
- EOLは2020/6
- v5.0はJava10まで
- EOLは2019/3
- v5.1はJava11まで
- EOLは2019/12
- v5.2はJava12までサポート
New VM
- GraalVM
- High performance polyglot VM
Kotlinの現状
- 今一番伸びている言語
- stack overflowやgithubのデータより
- 1.3がつい最近リリース
- コルーチンが目玉
- Kotlin/Nativeがbetaに
Springの現状
SpringFramework5.1
- v5.1でJava8と11をサポート
- non-LTSはベストエフォート
SpringBoot2.1
Roadmap
- SpringFrameworkのv5.2でKotlinのv1.3をベースにする
- コルーチンもサポート
- 公式ドキュメントにKotlinのサンプルコードも含めるようにする
R2DBC
- Reactive SQL SPI
- Reactive Streamベース
- PostgreSQL driver more to come
Spring Data R2DBC
GraalVM
- SpringBootが一瞬で起動するデモ
- 0.006s?
RSocket
- ネットワークをReactiveにする
- facebookを中心に4社で作ってる
- モデル
- request response
- fire and forget
- request - stream
- channel
- クライアント
- SpringFramework v5.2から
Spring Fu
- SpringをFunctionalに書く
- Faster and Lighter
- Kofu
- KotlinによるSpring Fuのconfiguration
- Kotlin DSL
- Jafu
- JavaによるSpring Fuのconfiguration
まとめ
- パフォーマンスを上げることとReactiveに力を入れてる
決済システムの内製化への旅 ‒ SpringとPCFで作るクラウドネイティブなシステム開発
- 槙 俊明(Pivotal)
- 鈴⽊ 順也(ソフトバンク・ペイメント・サービス株式会社)
内製化に至る過程
2016
2017
2018
- 決済システムの内製スタート
- 求められてたこと
- スピード感
- 継続的な改善
- 監視が容易で障害に強い
- -> ベンダーに頼ると実現できないので内製で
- PCF上に構築することに
- 槙さんがサポート
なぜPCF
- PCF
- Pivotal Container Service
- Pivotal Application Service
- Cloud Foundry
- Pivotal Function Service
- Knative, riffがベース
- この事例ではPvotal Application Serviceを採用
- 3つのうちどれが良いかはチーム構成ややりたいことによる
- チーム体制
- ops2名 - PCFの面倒見る
- dev3名 - アプリ作る
- 12factorに従って作ればPCFを意識しなくてもPCFで動く
- PaaS vs Kube
- 開発者視点で
- いろんなことをやりたくなかった
- 開発者視点で
技術の話
全体アーキテクチャ
- CI周り
- PAS
- RabbitMQ
- 監視周り
- Prometheus
- Grafana
- ログ周り
- Logstash
- Elasticserch
- Kibana
- Dev環境とProd環境を用意
- PAS以外のコンポーネントはBOSHで管理
アプリのアーキテクチャ
- マイクロサービスで作ってる
- PCFによるAutoscaler
- 急な負荷に対応する
- スケールに関してアプリ側が何か意識する必要はない
- 12factor
- 環境に依存する設定項目は環境変数に
- ログはファイルではなく標準出力に
- 絶対にロストしてはいけないデータはDBへ
CI/CD
- Concouseで動かす
- 負荷テスト、E2Eテストも自動で
- JMeterで負荷テスト
- 開発環境で毎日
- E2Eテスト
- JMeterで負荷テスト
- Javaの複数バージョン対応
- 複数のバージョンでのテストをConcourseで同時に実行
- docker使ってるので複数バージョン並列実行を簡単にできる
Observability
- Observability
- Tracing
- Metrics
- Logging
- Zipkin使ってる
- Grafanaダッシュボードでメトリクス監視
- BOSHで入れるとダッシュボードやアラートがデフォルトで入ってる
- micrometerの依存追加するだけで使える
- Kibanaでログを見てる
実際のプロジェクトでSpringアプリをKotlinで開発して得た気づき集
- ⻑澤 太郎(Ubie株式会社)
- jkug代表
KotlinでSpringを始める
- Spring InitializrでKotlinを選べるようになってる
クラスにつけるアノテーション
- Kotlinのクラスはデフォルトfinal
- アノテーションの解析ないから速い
バリデーション
- これだとダメ
class Xxx ( @NotNull val age: Int, @NotBlank val name: String )
- Javaを意識してこう書かないといけない
class Xxx ( @field:@NotNull val age: Int, @field:@NotBlank val name: String )
- デフォルトではもともとnull許容しないので注意
- ?つけるとnull許容型
class Xxx ( @field:@NotNull val age: Int?, @field:@NotBlank val name: String )
WebFluxとコルーチン
- ReactorはAPIとか覚えることたくさん
- Reactorとコルーチンを組み合わせると書きやすい
- Reactorの世界とKotlinの世界を処理の途中でいったりきたりできる
- async/awaitとか使って書く
アノテーションをやめる
テスト
- Spring Test - WebTestClient
- AssertJ
- MockK
- DbSetup-kotlin
JUnit5
- @Nestedでグルーピングしやすくなった
assertThrows<MyException>
って感じで型引数渡せる
AssertJ
- .isNotNullした後でもnullableな値だと?つけないといけない
assertThat(got).isNotNull
assertThat(got?.name).isEqualTo('test')
- そもそもデータクラスで比較したほうがエラーのときの情報量が豊富でみやすい
MockK
- コルーチンは通常特定の場合じゃないと呼び出せない
- けど、呼び出せるような仕組みがある
- mock生成は重いから繰り返さないように注意
- 各テストの前にclearMokcksすればいい
周辺ツール
コーディングガイドライン
- ktlint
- eslint的な
- Linter 兼 formatter
- gradleプラグインある
- シンプルさを保つ
- Kotlinの思想として簡潔さではなく読みやすさ重視
まとめ
- Kotlinでも普通にSpringアプリ作れる
- Javaとの違い意識しないと行けない部分はまだある
- Reactorとコルーチン相性良し
- アノテーションやめてKotlin DSL
- データクラスでテスト結果読みやすく
- モックはmockKがよい
Observability with Spring-Based Distributed Systems
- Thomas Ludwig(楽天株式会社)
Observability概要
Observabilityとは
- ツールと手段を組み合わせてデータとコンテキストから気づきを得る
- 単純なモニタリングだけでなくもっと深いところまで
- システムが大きくなると必ずどこかで障害が起きる
- 最近Observability流行ってるらしい
なぜObservability
- UXを改善するため
- 本番に似せた環境があっても全てが同じではない
- ユーザも違う
- 自身をもって運用するならサービスの状態を把握しないといけない
- MTTR(mean time to recovery)が重要
- 障害が起きた時にどれだけ速く検知して直せるか
分散システム
- 別のプロセスで並行して処理
- 複数のプロセスを跨るので難易度が高い
- 全てのプロセスの情報を見ないといけない
- スケーリングでそのインスタンスにしかない情報が消えるかも
Observabilityの3要素
- 3要素かぶってる領域もあれば特化した領域もある
- どれか一つだけで全部できるというものではない
- 使い分けるのがベスト
Logging - Events
- メッセージを残して後でそれを見つけられるようにする
- 分散システムだと各サービスがログをはくからどこを見ればいいか複雑
- ログを一箇所に収集して見られるようにしたい
- Spring Cloud Sleuth
- ログにIDを振ってくれるのでサービスをまたがってもリクエストの流れを特定することができる
- 楽天トラベルでは
- Spring Cloud Config
- Travel Auto-configuration
- 独自ライブラリ
- セッションIDみたいなものを振って同じユーザが何度もアクセスした時に紐付ける
- ELK
- Elasticsearch
- Logstash
- Kibana
Metrics - Aggregatable
- 時系列のデータを集計した値
- 集計した値なのでリクエストが多くてもサイズは変わらない
- 可視化したい時やトレンドを分析したい時に使う
- インスタンスが多いとスケールしない
- 各インスタンスからデータを収集してひとまとめにしたい
- Micrometer
- SpringBoot2から入ってる
- SLAがあればその値をセットしてアラート上がるようにとかできる
- 楽天トラベルでは
- Micrometer
- Prometeus
- Grafana
- Alert
- あらゆるサービスにアラート入れると多重アラートが発生してしまう
- ユーザのリクエストを受けるところだけ設定しておくとよい
Tracing - Request scoped
- パフォーマンス遅延の原因を調査するために使う
- リクエストの流れがどうなっているか見るために使う
- Spring Boot Actuator
- トレーシングの情報がとれるエンドポイントを自動で作ってくれる
Destributed Tracing
- インスタンスを跨いだトレーシングをしないといけない
- 一つのリクエストでどのサービスにどれくらい時間がかかったか把握できる必要がある
- Zipkin
- Soring Cloud Sleuth: spring-cloud-starter-zipkin
- 楽天トラベルでは
- 全てのデータをzipkinに送ると負荷があるのでサンプリングしてる
Putting It All Together
- 3要素はそれぞれ連携してる
- 検知 -> 調査 -> 復旧 のサイクルが回せるようになる
500+のサーバーで動くLINE Ads PlatformをささえるSpring
- 渡邉 直樹(LINE株式会社)
LINEのAds Platform
- LINEの中に出てる広告
- LINE NEWSとかLINE Blogとか
- LINEに広告配信できる唯一のPlatform
- MAU7800万人
- 運用型広告
- リアルタイムに予算やターゲットを変更できる
- 何を表示するかリアルタイムにオークションにかけて選んでる
- 全て50ms以内にやらないといけない
- Real Time Bidding
- 関係者のニーズを満たす必要がある
- Advertiser
- ROI
- Media
- 利益
- Audience
- UX
- Advertiser
- 指標
- CTR(Click Through Rate)
- 簡単な数式
- CTRを機械学習で事前に予測する
- CTR(Click Through Rate)
Spring in LINE Ads Platform
SSP(Supply Side Platform)
- メディア側の情報を管理するプラットフォーム
- Real Time Bidding
- リアルタイムにオークションする
- Real Time Bidding
- Spring Boot2
- CMS側はサーバがKotlinクライアントがNuxt
DSP(Demand Side Platform)
- ROIが最大化する広告を選ぶ役割
- 50ms以内に返さないと広告が表示されない
- Goで作ってる
- 50ms満たすため
- G1GCでも数十msかかることある
- CMS側はサーバがSpringBootクライアントがReact
データの持ち方
- 広告情報をMySQLに入れてる
- 毎回取りに行くと50msこえちゃう
- 基本はメモリに乗せておく
- 乗らないようなものはRedis
DMP(Data Management Platform)
- 広告配信する対象を管理する
- 広告を出す相手の情報があるとより効果的な広告を選べる
- Look-a-like
- 似ているユーザの行動をもとに広告を出す
- 技術
- SpringBoot
- Kafka
- HBase
- Redis
- ユーザの操作の度にイベントを飛ばしてそれを受けたらKafkaに書き込む
Data Pipeline/Analytics Cluster
LINEの技術トレンド
Kafka
- 高速で安定したStreaming Platform
- queueやjob schedulerとしても利用
- 各サービスはKafkaに書き込むまでが責務
- 一度書き込んでおけば誰でも取れる
- spring-kafkaあるけど公式のkafka_clientおすすめ
- springの方は自由にバージョン変えられない
SpringBoot2
- Reactor
- Reactive Streams
- Non-blocking
- back pressure
- Kafka使ってるからあんまり使ってない
- Lettuce5
- Reactive API
- kafka
- actuator + micrometer
- 使いやすい
- それまではprometeusにデータ入れてGrafanaで見てた
LINEの開発体制
- データ
- 2 Country
- 日本と韓国
- 60 Developer
- 100 Co-worker
- 2 Country
- コミュニケーション
- 通訳挟んでTV会議
- 翻訳bot入れてLINEで
- 気軽に出張も
今後
- 機械学習とか
- ARとか
Spring BootでHello Worldのその先へ〜ウェブDBプレスのSpring Boot特集で伝えたかったこと&伝えきれなかったこと~
- 藤野 真聡(ソニーネットワークコミュニケーションズ株式会社)
Web+DB Pressに寄稿した
- 2018/8号
- 内容
- SpringBootの概要
- HelloWorldの一歩先
- 伝えきれなかったこと
- 変化に強いWebアプリの作り方
- 寄稿したのはプロトタイプレベルだった
- 今回のない湯
バージョン番号の表示
- qiitaのAPIを叩くアプリ
- qiitaのAPIのバージョンを返すエンドポイントを作る?
- pom.xmlに定義しているバージョン情報に紐づくようapplication.propertiesに定義しておく
- それをJavaから呼ぶ
モジュール分割
- プロジェクトフォルダ内に子プロジェクトのフォルダを作る
- 親プロジェクトも各子プロジェクトもpom.xmlを持つ
ActiveMQ
MongoDB
- ドキュメント指向のDB
Angularを⽤いたデザインスプリント開発と設計⼿法
- 佐川 夫美雄(アシラス株式会社)
Web Application Design
WebアプリとWebサイト
- Webサイト
- 一方向
- Webアプリ
- 双方向
- デザイナーはWebサイト的なものを作る傾向?
- インタラクティブなUXまで考慮できる人は少ない
Webアプリ
よいプログラム
- 可読性
- テスト
- 再利用性
- リファクタリング
コンポーネント
- よいプログラムにするにはコンポーネントを作って組み合わせるとよい
- Atmic Design
- 大きなものを作ってそこからパーツを抽出しそれらを組み合わせてページをつくる
Design Sprint
- デザインカンプ(画面設計書)を作るのが目標
- WebのUIは細かいとこまで柔軟に作れてしまう
- イラレで書いたのをXDに貼り付けたレベルでユーザに評価してもらう
- これをスプリントで回す
Web Application Implementation
WebComponents
- Custom Elements
- 自分でHTMLのタグを作れる
- Shadow DOM
- CSSにスコープを作れる
- HTML Template
- 独立したHTMLかたまりを定義できる
- (HTML Import) -> 仕様廃止ES Modulesへ
- テンプレート化されたHTMLをimportできる
JS Frameworkの比較
DevOps for Frontend
- デザインしたものをすぐに確認してフィードバックできるサイクル
- Github Enterpriseでプロジェクト管理リソース管理
- クラウドでさくっと環境作ってそこにあげる
- デモはすぐ見れる
- Swagger使うとAngularの通信周り自分で書かなくていい
- Swagger Codegenで生成できる