楽天トラベルとSpring(Spring Day 2016)

Post on 16-Apr-2017

5.411 views 3 download

Transcript of 楽天トラベルとSpring(Spring Day 2016)

楽天トラベルとSpring

Nov/18/2016Takahiro Fujii / Thomas LudwigTravel Service Development Department, Rakuten Inc

自己紹介 – Takahiro Fujii

藤井貴浩(@taka_ft)トラベルサービス開発・運用部

Hotel Booking チームAssistant manager

仕事・ 海外ホテル関連システム・ インバウンドサイトの開発・ コネクティビティ・ 予約システムの開発・ 最近はフロントエンド

趣味・ Design・ Web Design・ Basketball

自己紹介 – Tommy Ludwig

Tommy Ludwig (@TommyLudwig)トラベルサービス開発・運用部

Booking Platformチーム

仕事Walt Disney Parks & Resorts

・ 予約システムの開発Rakuten (現在)

・ 楽天トラベルの予約システムの開発

Open source• Spring Boot• Spring Session

撮影者:藤井貴浩 (Spring One 2015)

• Zipkin

Past Slides

• Spring REST Docsを利用して鮮度の高いDocumentを運用しよう

• Cloud Native:PaaS編 / Spring Cloud at Netflix

• Spring CloudとZipkinを利用した分散トレーシング

• JSUG SpringOne Platform 2016 報告会 - New in Spring Data

• SpringOnePlatform 2016報告会 Case study

Agenda

• 楽天トラベルの説明

• 楽天トラベルのarchitectureの変化

• 直面した課題と解決へのアプローチ

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• Microservice化する中でログの追跡を可能にするには

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

楽天トラベルの説明

本セッションでは、楽天トラベルのシステム開発についてお話しさせて頂きます。楽天では、各サービス(カンパニー)毎でシステム設計が異なります。今回は、楽天トラベルというサービスにおいて、Springをどのように利用している/したいというお話しになります。

本日お話しする楽天のシステムについて

楽天市場 楽天銀行楽天証券

共通系のサービスは基本的に横断で管理

決済Platform

広告Platform

メールPlatform

会員Platform

楽天市場

楽天トラベルとJava• 楽天トラベルでは、メイン言語の1つとしてJavaを利用。

• 古くはStruts, SAStruts, Seasar等のフレームワークを利用していましたが、約5年前からSpringを利用し始めました。

• 現在では、自部署のJavaアプリケーションの多くがSpring, SpringBootを利用しています。

• 部署の開発環境・サービスに興味がある方は2年前の弊社カンファレンスでの発表資料をご覧ください。※ある程度古い為、現在の状態とは異なる場合があります。

サービス• ユーザサービス

– 楽天トラベルのサイトを構成するプロダクト

• 施設向けサービス(管理画面)– 楽天トラベルで商品を販売される

– クライアント(ホテル・レンタカー会社・バス会社など)向けのシステムのプロダクト

• 社内向けサービス

• 共通系サービス– 決済・会員・ポイント・広告・通知・メールなど

– 横断系の部署でサービス(市場・トラベル・金融系)を跨いで管理されるものが多い

楽天トラベルのarchitectureの変化

(ダイジェスト版)

国内ホテル 海外ホテル 航空券 レンタカー バス

施設管理画面

インバウンド外言語サイト

DP(ホテル+航空券)

etc…

HugeMonolithic

App

海外ホテル

MonolithicApp

MonolithicApp

MonolithicApp

施設ページ

(海外ホテル)

予約(海外ホテル)

検索(海外ホテル)

Front-EndApp

Front-EndApp

Front-EndApp

Back-EndApp

Back-EndApp

Back-EndApp

施設ページFront

予約Front

検索Front

施設API

予約API

検索API

国内ホテル 海外ホテル 航空券 レンタカー バス

施設管理画面

インバウンド外言語サイト

DP(ホテル+航空券)

etc…

似てるAPIができてる

国内ホテル

海外ホテル

予約API 1

予約API 2

分割と再構築

予約API1

予約(情報)

通知

決済(共通基盤)

在庫

予約API2

管理画面

・予約のドメインモデルを今一度理解する・予約するという行為を分解して共通化

Front-EndApp

Front-EndApp

Front-EndApp

Back-EndApp

Back-EndApp

Back-EndApp

Back-EndGeneric

App

Back-EndGeneric

App

Back-EndGeneric

App

Back-EndGeneric

App

予約Front1

予約Front2

Front-EndApp

予約API1

予約API2

Back-EndApp

通知API

決済API

施設情報API

Back-EndGeneric

App

予約Front1

予約Front2

Front-EndApp

予約API1

予約API2

Back-EndApp

通知API

決済API

施設情報API

Back-EndGeneric

App

予約API 1? 2?(もちろん本当はそんな名前ではないです笑)

予約するという(行為)は共通

国内ホテル

海外ホテル

航空券 レンタカー バス

予約する

分割と再構築

予約API1

予約(情報)

通知

決済(共通基盤)

在庫

予約API2

管理画面

分割と再構築

予約予約(情報)(REST)

通知(REST)

決済(共通基盤)

在庫(REST)

・行為として共通かできるものはできるだけ共通化する(したい)・機能を分割するだけではなく、同じにできるものは一つにしていく

・RESTfulに出来るならRESTfulに。APIを作るときは扱うリソースを意識する・BFF的なものを薄くする

管理画面

・APIの総数が増えてきた(新しいリソースの誕生・既存の機能の分割)

・APIの生まれ変わりが激しくなってきた(足りないAPIを作るから、最適なAPIを作るに)(APIをRESTfulに近づけていったり) +人も増えてきた

すると、多くの問題が(より)顕在化しました。

Issues

• APIの使い方がすぐには分からない

• セッション管理をもっと簡単にできないっけな、、

• アプリが増えてきて、プロパティファイルの変更が面倒…

• ログの追跡が面倒

• もっと簡単にAPIを実装できないっけな、、

• + 新しく来た人にSpringの色々を覚えてもらうのにコストがかかるな…

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• Microservice化する中でログの追跡を可能にするには

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• + 新しく来た人にSpringの色々を覚えてもらうには

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• Microservice化する中でログの追跡を可能にするには

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

Issue

APIの使い方習得するのに時間がかかる

「なんでこのAPIこんなに使うの大変なんだ…」「挙動がよく分からない…」「このパラメータの意味が、、」

API Documentation

• Documentが嘘をついている– 実際にデプロイされているものと異なる

– プロダクトの仕様変更を追えてない・更新漏れ

「このAPI, Documentに書いてある通りに呼ぶとエラーが返ってくるんだけど…??」

「ごめん、Documentには反映出来てないんだけど、最近API更新して、この項目にはこの値をセットすること

になったんだ」

Consumer Producer「まじか」

API利用者 API提供者

API Documentation

• APIのExampleの不足– 1パターンのRequest/Responseのサンプルしかない

– ※少ないExampleでAPIの使い方がConsumerに迷いなく伝わるべきではある

「このAPI、複数部屋の予約するときってこのこの項目のレスポンスの値ってどうなる?

Documentになかったんだけど」

「お疲れ様です。前に自分が送ったときのサンプルがあるので、見つけて送りますね。」

(そこきたかー)

「ありがとうございます。(たまに忘れられる)」Consumer

API利用者

Producer

API提供者

API Documentation

• 開発中のプロダクトのドキュメントが無い– DEV/STGなどにdeployされているAPIが本番と異なる仕様の場合の把握が難しい

「DEV環境の**API動いてなくない?」

「あ、今PJTで改修していて、インタフェースを変

更しています。○○にこの項目を追加してもらえれば呼べますよー」

「ありがとうございます・・・」Consumer

API利用者

Producer

API提供者

API Documentation

• 適正・役割・管理の問題– Documentの品質の不安定さ(ルールがなく、プロダクト担当のエンジニアに品質が依存する、特にエンジニアでは得手・不得手は結構はっきり分かれる)

– Documentを書く係の人なんていない(特に内部API)

– Documentが大切なのはみんな(たぶん)分かってる、が整備することができない(特に更新・維持)

「Document書くのはエンジニアの仕事じゃないんじゃないかな…」「そうでなくとも、Document書くの苦手・・」

「あの人の書くコードは分かりやすいんだけど、Documentが何言ってるか分からない…」

Developer1 Developer2「これリリースしたらあそこのDocument更新しないと・・・」(忘れる)何回か忘れると維持するモチベーションがなくなる

API Documentation(あとで見てね)• Issues

– APIの使い方のキャッチアップに時間が掛かる(生産性の低下)– Documentが嘘をついている(実際にデプロイされているものの仕様変更を追えてない・更新漏れ)– Documentの品質の不安定さ(ルールがなく、プロダクト担当のエンジニアに品質が依存する、特にエンジニ

アでは得手・不得手は結構はっきり分かれる)– Documentを書く係の人なんていない(特に内部API)– Documentが大切なのはみんな(たぶん)分かってる、一方でなかなか整備することができない(特に更新・維

持)– APIでカバーされている機能の領域が不明瞭(機能がかぶるAPIが他につくられたり、使えると思ったAPIが

機能足りてなかったり、思っていたのとちょっと違うということがAPIを使い始めてから分かったり)– APIのExampleの不足(1パターンのRequest/ResponseのサンプルしかないAPIなど)– 開発環境・QA環境で動いているプロダクトのドキュメントがない(今動いているプロダクトのドキュメントが環

境毎にほしい)– APIのRoll(Vision)が不明瞭で、ある機能を作成するのに、新規のAPIを作成するべきか、既存の機能を改修

するべきか悩むことがある– 古いシステム、日本語サイト用の仕様が日本(語)に依存するところがあったりして、英語でちゃんとドキュメ

ントを書いておかないと日本(語・文化)に詳しくない人には分かりにくい仕様がある– (昔の話ですが)似ているけど違う、他のチームのAPIだと連携に時間がかかったりすることが理由の一端と

なり、機能がかぶるAPIが作成された– サービス設計者が必要なリソースを取得するのに利用するAPIをすぐに特定できない

API Documentation Tool

http://swagger.io/

{ }…Swagger

RAML

http://raml.org/

SpringREST Docs

https://projects.spring.io/spring-restdocs/

etc...

API Documentation Tool

https://projects.spring.io/spring-restdocs/

etc...

今日は、

Spring REST Docsについて話します。

Spring REST Docs

こんな感じのDocumentが作れます。

Spring REST Docs

自動生成

自動生成

API Documentation Tool

src/test/javaの下に

*Documentation.javaというクラスを作成します。※Document対象となるクラス名のルールは変更可能

spring mvc testのテストコードに、documentするためのmethodを追加するようなイメージ※REST Assuredでもできます

Actual code(Sample)

Build

この3つの.adocファイルがビルド時に生成される(デフォルト)

※ここを変更するとdocumentが

できるディレクトリを分けられます

adocって?

[source,bash]

----

$ curl 'http://localhost:8080/greeting?name=takahiro' –I

----

[source,http]

----

GET /greeting?name=takahiro HTTP/1.1Host: localhost

----

[source,http]----HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8Content-Length: 37{"id":1,"content":"Hello, takahiro!”}----

curl-request.adoc

http-request.adoc

http-response.adoc

adocを直接開くとこんな感じです。

adocって?

curl-request.adoc

http-request.adoc

http-response.adocadd-on,plugin

firefox : https://addons.mozilla.org/ja/firefox/addon/asciidoctorjs-live-preview/

chrome : https://chrome.google.com/webstore/detail/asciidoctorjs-live-

previe/iaalpfgpbocpdfblpnhhgllgbdbchmia

sublime : https://github.com/asciidoctor/sublimetext-asciidoc

atom : https://github.com/asciidoctor/atom-asciidoc-preview

対応しているブラウザ/ソフトで開くとこんな感じに表示されます。

Spring REST Docsって何してくれるの?

http://projects.spring.io/spring-restdocs/

snippet : 切れ端・断片

> Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test.

SpringRESTDocsは

snippets(断片)

を自動生成してくれるもの

snippetsの親は自分で用意

親adoc

src/main/asciidocの下に

*.adocというファイルを作成します。

api-guide.adocの中で、SpringRESTDocsで生成したsnippetsをincludeすることができます。

Spring MVC Test

1.SpringRESTDocsが部品(snippets)を作ってくれる(with SpringMVCTest)2. snippetsをincludeする.adocファイルを作ると、ビルド時に指定した形式に変換してくれる

SpringREST Docs

*-request.adoc

*-response.adoc*Documentation.java

api-guide.adoc

Asciidoctor

api-guide.html

snippets

*-request.adoc

*-response.adoc

targetフォルダ

targetの中にできるので、例えばJenkinsとかのbuildからドキュメントが参照できる

api-guide.html

appname.jar

アプリの中にドキュメントを組み込み、アプリ配下にドキュメントページ

を組み込める

api-guide.html

Why Spring RESTDocs for us now

テスト成功

Create document

start

end

false

true

・Documentの正確性が保証されることが大切だった(テストコードからDocumentを作る・テストが通らないとDocumentは生成されない)

・継続的な更新が仕組みとして提供される

・Documentをアプリに内包出来るので、各環境にデプロイされているアプリのDocumentが提供される

・Documentを作成するのに、テストコード側の修正しかいらない

・エンジニアはテストコードかける(テストコードを書く感覚で、APIを使うのに必要なサンプルケースはまず間違いなく揃うとかも)

・Hypermediaに対応してる

How we use Spring RESTDocs

• 利用促進/簡単に使ってもらえるためにabstruct classを提供(jarで + SpringInitializr経由で配布(後述))

• DefaultでアプリにDocumentがincludeされるようにする

• EndPointを統一

• Method名でsnippetが作られるように

• alwaysDo入れておいて、コード書く側は何も考えず(いや、考えるんですが)テスト書いたらsnippetsが出来るような状態

How we use Spring RESTDocs

@Beforepublic void setUp() {

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).apply(documentationConfiguration(this.restDocumentation)).alwaysDo(document("{method-name}/{step}/")).build();}

http://docs.spring.io/spring-restdocs/docs/current/reference/html5/

How we use Spring RESTDocs

this.mockMvc.perform(delete("/entry?parameter=hoge")).andExpect(status().isOK());

http://docs.spring.io/spring-restdocs/docs/current/reference/html5/

→ Snippetsが作成される

API Documentation

• 結果

– APIの使い方のキャッチアップに時間がかなり減った

– Documentが嘘をつかなくなった

– サンプルが充実(API console無いのが、少し悩ましい)

– アプリに内包、URIを統一することで、誰もが簡単に各環境で動いているアプリのdocumentを閲覧できる

– 他のチームのエンジニアに喜ばれた(嘘をつかない安心の価値が高かったと思う)

API Documentation• 所感

– 正しいDocumentが当たり前にある最初の一歩としてSpring REST Docsは良かった。

– もっと色々なことをやりたくなったら変えるかも(Swagger+Springfox/RAMLで作られているプロダクトもあります)

– 実際に使えるデータを使ったDocumentを作れないかなー– version差分を自動生成できないか。あるいはDocumentationのversioning– 基本的にテストコードだけいじればDocument作れるので、進めやすかった– Document作成より、REST DocsでDocument作るタスクの方がモチベートできそうな肌感覚

– API Documentを作りはじめるのに、REST Docsは少ない工数で始められた– トップダウンのときどうしようかな– 今回のDocumentationの範疇ではないが、1アプリのDocumentではないものについて(依存関係は可視化すれば十分?)

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• Microservice化する中でログの追跡を可能にするには

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

SESSION管理

Session management

Session管理

• セッション毎にデータを持ちたい(買い物かごやCSRFトークンなど)

• applicationのインスタンスをスケールしたい

• 標準のServlet APIを使い続けたい

– HttpServletRequest

– HttpSession

3つの解決方法

• Sticky sessions

• (アプリケーションサーバの)Session replication

• Spring Session

Sticky sessions

UsersApplication

instances

Session

dataバランサー

Sticky sessions

UsersApplication

instances

Session

dataバランサー

Sticky sessions

UsersApplication

instances

Session

dataバランサー

Session replication

同期

同期

同期

UsersApplication

instances

Session

dataバランサー

Session replication

同期

同期

同期

UsersApplication

instances

Session

dataバランサー

Session replication

同期

UsersApplication

instances

Session

dataバランサー

Session clustering (Spring Session)

Data store cluster

UsersApplication

instances

Session

dataバランサー

Session clustering (Spring Session)

Data store cluster

UsersApplication

instances

Session

dataバランサー

Session clustering (Spring Session)

Data store cluster

UsersApplication

instances

Session

dataバランサー

解決方法の比較

方法 メリット デメリットSticky sessions バランサーの設定だけ

で済むHAではない

ASのSession replication

HA 設定・実装はASに依存する

Spring Session • HA• AS問わず利用可能• REST/WebSocket

必要なdependencyが増える?

Spring Session

• Servlet Filterで標準のHttpSessionをwrapする

• Sessionのデータストア(SessionRepository)

– Redis

– Hazelcast

– JDBC

– Mongo

– GemFire

Spring Session

• Spring Boot 1.4からAuto-configがある

– See Spring Boot documentation

–例えば

• Spring SessionとHazelcastをクラスパスに入れて

• spring.session.store-type=hazelcast

• Spring Bootでない場合は

– @EnableHazelcastHttpSession

Spring Session @ Rakuten Travel

• すべてのapplicationはセッション管理が必要というわけではない。

• セッション管理が必要とされるapplicationの一部がSpring Sessionを利用– データストアはHazelcast

– プラスSpring SecurityでCSRFトークン生成・チェック

• 残りはその他のソリューション

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• Microservice化する中でログの追跡を可能にするには

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

ログ追跡Log correlation with Spring Cloud Sleuth

問い合わせが来た時のログ調査は手間がかかりすぎる

Q

Issues

QAや他チームのデベロッパ

このリクエストのログが見たいんだけど…

A

呼んでるサービスからもらうわ

A

B〜Fさん、これ調べてくれない?

少々お待ちください!

。。。

F

Issues

問い合わせが来た時のログ調査は手間がかかりすぎる

全ログを収集して共通の場所から検索できたらええやんか

そうしても、一つのリクエストに関係するログは特定できないぞ

そんな人にログ追跡が必要ですよ

ログ追跡とは

• リクエストのstartからendまでの全サービスのログが見たい

• MDCというログの機能を利用し、ユニークIDをログに追加

• そのIDをサービスからサービスへ渡す

トレーシング用語

• Span –ひとつのサービス(境界)内の処理

• Trace – リクエストのstartからendまでのSpanを含む

それは分かった!自分のプロジェクトでどうやってするの?!

Spring Cloud Sleuthで実現

• Spring Bootが前提条件• spring-cloud-sleuth-starter

を追加するだけ

• ログを収集して分析ができる

それだけ?!

Sleuth Integrations

• HTTP

(RestTemplate)

• @Async

• @Scheduled

• Messaging

– Spring Integration

• Spring Cloud

– Zuul

– Hystrix

– Feign

• RxJava

• See Documentation

楽天トラベルでのログ追跡

• ログ追跡はまだ導入し始めた頃です。

• SleuthでIDを生成し、サービス間で伝搬させる

• Logstashでログ収集してElasticsearchに入れる

• Kibanaで簡単にTrace IDなどで検索できる

楽天トラベルでのログ追跡

• Spring Cloud Sleuthを利用するためにまずはSpring BootじゃないプロダクトをBoot化する

• slf4j・logback・ログフォーマットを統一した上でログ調査がしやすい

–共通コンフィグはSpring Cloud Configにある

楽天トラベルでのログ追跡

• (既に使っていなければ)Sleuthが対応しているIntegrationsを使うように修正する

• リクエストのフローの中に対応していないサービスがあれば、その先は追跡できなくなってしまう

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• Microservice化する中でログの追跡を可能にするには

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

Centralized Configuration

アプリの数が増えてプロパティ変更が辛い

「え、またURL, KEY, **変わるの・・??」

Issues

Spring Cloud Config

• コンフィグはGitにある– バージョニング– source-controlled

• Config serverはHTTP APIを提供する

• クライアントはclient libraryでそのAPIを呼び、 SpringEnvironmentにコンフィグを追加する

• プロパティを暗号化できる

• 再起動なしでコンフィグのリフレッシュさせることができる

• デフォルトはクライアントからコンフィグをプル

• Gitのコミットたびにプッシュするように変えられる

VM-03

Local PCVM-01

VM-02

Config Server

Client

Client

Client

Client

JSON

Centralized

Source-controlled

On-the-fly updates

• アプリ共通の値の重複

• 環境共通の値の重複

• デプロイ・再起動なしでプロパティーを変更したい

• どこで実行してもコンフィグが取得できたい

問題

AA

B

C

Actuatorの/refresh endpoint

Git repo

JSONJSON

JSON

重複の対策

• SpringのProfileで環境別のプロパティを分ける

• 共通のプロパティをグループ化

– 某app、某環境のプロパティ

– 某app、環境共通のプロパティ

– app共通、某環境のプロパティ

– appも環境も共通のプロパティ

一部のappで共通のプロパティはどうすればいいの?

一部共通のプロパティ

Issue

• 共通のコンフィグだが、一部のappだけに該当する

• 全appのEnvironmentに入れたくない

Solution

• ”Shared config”を作る

• appのように作成

• Clientでapp nameとshared config nameをspring.cloud.config.nameにコンマ区切りで設定する

• appA,shareAB

Cloud Config @ Rakuten Travel

• セキュリティ:外からアクセスする必要がないので、アクセス制限で充分

–本番のコンフィグサーバは本番のアプリケーションからしかアクセス出来ない

• パスワードやキーを暗号化してGitに保存して、サーバ側で復号化してクライアントに返す

Cloud Config @ Rakuten Travel

• 静的ファイルの機能も利用しています!

–ログコンフィグ(logback-spring.xml)

– Hazelcastのコンフィグ(hazelcast.xml)

• SpringのResourceで静的ファイルへのURI

• IDEのauto-completeが使えなくなるのは個人的に悲しいところです。

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• Microservice化する中でログの追跡を可能にするには

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

Create your scaffold from Spring Initializr

Issues(Improvement)

API

APIAPI

簡単に

共通化

API

API API

API

API・高品質なAPIを提供するには・Spring周りの機能を使えるように

・社内で共通の仕組み・ルールを適用する・色んなチームがAPIを作る中、最低限共通化したいところが出てきた(ロギングはこのライブラリで等)・毎回同じことやってる…??

http://start.spring.io/

https://start.spring.io/ https://github.com/spring-io/initializr

Spring Initializr

https://start.spring.io/ https://github.com/spring-io/initializr

Spring Initializr

https://start.spring.io/ https://github.com/spring-io/initializr

Spring Initializr

https://start.spring.io/ https://github.com/spring-io/initializr

Spring Initializr

https://start.spring.io/ https://github.com/spring-io/initializr

Spring Initializr

Spring Initializr• アプリケーションに必要なクラスライブラリ群がセット

されたプロジェクトをサクッと作ることができる

• これを使えば、様々なタイプのアプリをSpringで簡単に、素早く作ることができる。

• 簡単にカスタマイズ可能で、社内で利用しているライブラリをSpring Initializrから設定できるようにすることができる。

- name: Custom

content:

- name: Jasypt

id: jasypt

description: Provides Jasypt encryption support for property

sources

version: 1.6

groupId: com.github.ulisesbocchio

artifactId: jasypt-spring-boot-starter

Add a custom section(application.yml)

https://github.com/spring-io/initializr/blob/master/initializr-service/src/main/resources/application.yml

下記のファイル一度ご参照ください

自分で3rd partyのライブラリを追加できる(簡単に)社内のプライベートなライブラリを足したりとかも

このymlもclooud-configで管理すると更新が楽

Spring Initializrのカスタマイズとは

Dependencyに追加できるようになる

Spring Initializrのカスタマイズとは

IDEからでもカスタマイズしたInitializrを利用することが可能

Spring Initializr

RakutenTravel Initializr

InternalRepository

PublicRepository

lombok*.jarspring*.jar

rakuten*.jar

customize

Rakuten Travel Initializr

Spring Initializr

• 会社の環境にあったinitializrの作成が可能。

• 個人やOpenなプロジェクトに限った利用ではなく、各社のSpringアプリケーションのinitializrとしても 利用することができる。

• Spring Initializrを使って、簡単に社内の環境に即したアプリを作ることができる。

• Spring Initializrを使って新規プロジェクトを作るフローにするとある程度使われるライブラリやバージョンの統制がとれる。

・社内ライブラリを追加する・不要 / 使わせたくないライブラリ(SNAPSHOT等を取り除く)

・Initilizrのconfigをcloud configで管理・defaultのgroupを変更・利用促進中

こんな感じです。

Spring Initializr @ Rakuten Travel

Easy Consumption of Microservices(SpringOne Platform(2016))・Spring Initializrのカスタマイズについて触れています

Appendix

・spring-boot-actuatorを導入し、health checkerを自動実装、必要に応じてカスタマイズここのサービス毎にバラバラだったhealth checkを統一している

Appendix (Spring-Boot Actuator)

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#production-ready

<dependencies><dependency>

<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>

</dependency></dependencies>

・spring-boot-actuatorを導入し、health checkerを自動実装、必要に応じてカスタマイズ

Appendix (Spring-Boot Actuator)

Initializrでactuatorをチェックすればプロジェクト作ったタイミングからもうhealth checkエンドポイントが実装されている

直面した課題と解決へのアプローチ

• APIドキュメントを継続して最新の状態を維持するには

• シンプルにセッションを管理するために

• Microservice化する中でログの追跡を可能にするには

• 同じプロパティの値を複数のアプリでそれぞれ管理したくない

• メンバーに使って欲しいライブラリを使ってもらうには

• もっと簡単にAPIを実装する為に

• 新しく来た人にSpringの色々を覚えてもらうには

Issues・プロダクトも増えれば、人も増えている・最近はインターンの方もたくさん来てくれる

Issues

みんなが(最初から) Springに詳しいわけではない

:Springちょっとできる

Issues

教えるのに時間を結構使う

:Springちょっとできる

https://spring.io/guides

TRVDD tutorial

New comer 向けチュートリアルをasciidoc使って作りました :)

TRVDD tutorial

New comer 向けチュートリアルをasciidoc使って作りました :)

TRVDD tutorialGuideへのリンクがたくさん笑 + 補足

Result

緑色になる最初の一歩を加速!

+ 僕の素振りとして非常にいい機会に。。

まとめ

・ APIドキュメントを継続して最新の状態を維持するには(Spring RESTDocs)

・シンプルにセッションを管理するために(Spring Session)

・ Microservice化していく中でログの追跡を可能にするには (Spring Cloud Sleuth)

・同じプロパティの値を複数のアプリでそれぞれ管理したくない(Spring Cloud Config)

・メンバーに使って欲しいライブラリを使ってもらう・scaffoldを提供する(Spring

Initializr)

・ health checkなどの自動実装(Spring Boot Actuator)

・新しく来た人にSpringのいろいろを覚えてもらう(Spring guides)

まとめ

・ 課題を明確すること/課題に優先度をつけることは大切

解決策として新しい技術が使えるの方が導入しやすいし、結果がわかりやすい

(通常の業務と並行して勧めやすい)

課題に対する解決策として使えるツールがSpring周りに沢山ある。

・ Spring/Microservice周りでもまだまだ出来ることは沢山ある。

やろうとして出来ていないものもかなりある。

(Service Discovery / Circuit Breaker / CQRS / CDC / Event-Driven などなど…)

おまけ

・ ここ1,2年で、様々な会社がSpring Boot/Cloud/ CFなどのケーススタディを紹介するようになったイメージがあります。 ( SpringOne Platformでも色々な所のケーススタディの紹介がありました)

ケーススタディの情報交換など、大歓迎です。

気軽にお声がけいただけると嬉しいです。

We are hiring!

Java / Spring 好きな方大歓迎…!!

http://corp.rakuten.co.jp/careers/engineering/

直接お声がけいただいても!