SpringOne 2GX 2015の報告会
・ Cloud Native: PaaS編
・ Spring Cloud at Netflix
Tommy Ludwig
@TommyLudwig
1
2
PLATFORM AS A SERVICE
An exploratory look at Lattice as an example of a PaaS
いくつかの前提
• 信頼できないコンポネントで、信頼できるシステムを構築する
必要がある
– インスタンス単位では100%の稼働率は不可能だろう
• 運用コストは開発コストより何倍も大きい
– 開発が数ヶ月かかったプロダクトは数年間以上運用するだろう
– 継続的デリバリーでコスト削減
– Platformがあると運用コストを激しく削減できる
3
PaaSを始めよう
• PaaSを使ってみたーい!
• でも、BOSHやCloud
Foundryをローカルにインス
トールしようと思っても…
– なかなか難しい
– 手間がかかる
4
そのためのLattice
• http://lattice.cf/
• 簡単に始められる
• 負担が少ない
• Cloud Foundryの多くのコン
ポーネントをそのまま利用
• ただし、欠けているところも
あります
– 後で説明します
5
6
LET’S DO IT LIVE!
Lattice demo
Latticeをインストールしましょう
必要なもの
• Linux or OSX
• Vagrant 1.7+
• Virtual Box
• Lattice release
• ltc CLI
Guide
• HPにあるGetting started
• GitHubにあるREADME
7
Latticeのセットアップの流れ
• GitHubのリリースページからlattice-bundleをダウンロード
– https://github.com/cloudfoundry-incubator/lattice-release/releases
• CLIであるltcをダウンロード
• ltc target local.lattice.cf
8
$ curl -O http://receptor.local.lattice.cf/v1/sync/linux/ltc
# 上がLinux用 -or- 下がOSX用
$ curl -O http://receptor.local.lattice.cf/v1/sync/osx/ltc
# then:
$ chmod a+x ltc
# 希望であれば、ltcをパスに入れたらさらに使いやすい
Deploy to Lattice
Docker hubから
• Goで書かれた簡単なサンプル
アプリをデプロイ
• http://lattice-app.local.lattice.cfからアクセス
Docker hubにないプロジェクトをデ
プロイしたい場合はBuilding and
Launching Droplets
9
ltc create lattice-app cloudfoundry/lattice-app
Monitoring / Operations
• ログをtail
–
– lattice-appの各インスタンスのログを収集して表示する
• 稼働中のアプリを確認
–
• スケール(アップ・ダウン)
– #インスタンスを3つに変更
• アプリ詳細
–
10
ltc logs lattice-app
ltc list
ltc scale lattice-app 3
ltc status lattice-app
Visualization(可視化)
• CLIで
–
–
• 見づらくないですか?!
11
ltc visualize
ltc cells
X-Ray登場
• http://xray.cf/
• Latticeのreceptorに向けて、同じデータをキレイな可視化
12
失敗テスト
• lattice-appのインスタンスを10個までスケール
• http://lattice-app.local.lattice.cfに数回アクセス
– Indexが変わることを確認
• http://lattice-app.local.lattice.cf/exitに数回アクセス
– アクセスしたインスタンスはシャットダウンする
• X-Rayなどで監視しながらhttp://lattice-app.local.lattice.cfをリフレッシュし
続ける。
– インスタンスいくつか落ちたのにもかかわらずエラーなくページがロード
– 10秒くらいで落ちたインスタンスがもう一回立ち上がっている
13
ltc scale lattice-app 10
Lattice cluster
• ローカルはすごく簡単で便利ですが、一つのVMに過ぎない
ローカルには限界があります。
• ClusterをデプロイしたいならTerraformが必要です。
• 現在、最新版0.6.0はAWSしか対応していない。
• 0.5.0以前はAWS、DigitalOcean、Google Compute Engine、
Openstackを対応していた。
• ここのドキュメンテーションを参考にしてください。
14
最後にCloudFoundryとの比較
Cloud Foundry
• マルチテナント
• 全コンポネントがHA
• セキュリティの設定豊富
• ローリングデプロイ
• Data serviceを提供している
Lattice
• シングルテナント
• コンポネントによりHA
• セキュリティは少ない
• Red/blackデプロイが可能
• Data serviceがない
15
本番にはおすすめしない
SPRING CLOUD @ NETFLIX
16
目次
• サービスディスカバリ (Eureka)
• Client側ロードバランシング (Ribbon)
• サーキットブレーカー (Hystrix)
• ストリーム統合(Turbine)
• メトリックス
– Spectator
– Atlas
17
18
サービスディスカバリ (Eureka)
• サービスディスカバリ (Eureka)
– Spring Boot + Netflix Eureka (by 谷本さん:@cero_t)
• Server
– Dependency org.springframework.cloud:spring-cloud-starter-eureka-server
– Annotation @EnableEurekaServer
• Client
– Dependency org.springframework.cloud:spring-cloud-starter-eureka
– Property eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
– Annotation @EnableEurekaClient / @EnableDiscoveryClient
Eureka dashboard
19
更に便利に使いましょう
• spring-cloud-netflix-contrib – 今後Spring Cloud Netflixに移行する予定の
Netflix OSS。
– Springの標準@EventListenerでステータス変更通知を受け取れる
– EurekaStatusChangedEvent
– RESTサービス以外にも便利
• 例えば、MessagingサービスがOUT_OF_SERVICEになった時、そこへのメッセージを止める
• EurekaはただのSpring Bootアプリなので好きなだけカスタマイズできる
– 自社の運用に便利なエンドポイントが追加できる
• EurekaサーバにHystrixのダッシュボードを追加したり、継続的デリバリー
との連携したり、メトリックスのダッシュボードなど
20
Client側ロードバランシング (Ribbon)
• RestTemplateがAuto-configurationでRibbonを使用
• Eurekaに登録されたサービスIDを利用し、実際のホスト名・ポート
が知らなくていい。例えば、membershipというサービスを呼ぶ時:
• 様々なロードバランシングのルール:
– RoundRobinRule ←デフォルト
– AvailabilityFilteringRule
– WeightedResponseTimeRule
• デフォルトでGETリクエストは失敗した場合、リトライされる
– もちろん、コンフィグで変えられます。
21
サーキットブレーカー (Hystrix)
• 障害し出したら関係するシステムまで影響し悪循環が始まる
– Hystrixを通して、問題があるシステムを呼ばず悪循環を止められる
• 注意:Exceptionが発生しても、正常時処理の代わりにできる
ことが特にないサービスは使えない(例:ペイメントサービス)
• 追加するのは簡単
– Dependency org.springframework.cloud:spring-cloud-starter-hystrix
– Annotation @EnableHystrix / @EnableCircuitBreaker
– 守りたいメソッドに @HystrixCommand(fallbackMethod = “myFallback”)
– myFallback(…)というフォールバックのメソッドを実装
22
Hystrix
• メソッドのtimeoutをコンフィグできる
– @HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”,
value = “5000”)
• 注意:@HystrixCommandは別のthread poolで実行される
– なので、デフォルトでThreadLocalなどを使ってはいけない
– @HystrixProperty(name = “execution.isolation.strategy”, value =
“SEMAPHORE”)
• これで解決できますが、@HystrixCommandが実行中にスレッドがブロックされます
• 日本語資料:NetflixのHystrixにも使われるCircuit Breaker patternを
調べてみた
23
Turbine
• Hystrixの複数Streamを統合する
– あるアプリの各インスタンスの/hystrix.streamを/turbine.streamに
– Eureka Serverからダッシュボードを提供すると良いでしょう。
• ちなみに、Netflixではインスタンスが多すぎてあまり使われ
ないらしいです。
– その代わりに、メトリックスとして同じ情報を提供します。
24
Hystrix dashboard
25
Metrics
• Spectator
– Spring Cloud Netflixでの対応はBrixton.M3から
– Java 8+での使用、従来のメトリックス・ライブラリServoがdeprecated
– AutowiredでRegistryをインジェクト
– 使い方:
• 注意事項
– タグ名がユニークになるように作ってください。ユーザ名などを避けるべき
• そうしないとタグの数が爆発する恐れがある
• Spring Boot Actuatorの/metricsで見られます。
26
Atlas – メトリックス可視化
• Atlas
• URLでqueryを投げてグラフを表示をするという仕組み
• そのURLをすぐに共有できて、他の人も同じものが見れます
• 例えば
• 情報元
27
/api/v1/graph?
e=2012-01-01T00:00
&q=
name,sps,:eq,
nf.cluster,nccp-silverlight,:eq,
:and,
:sum
Atlas graph
28
情報元
Lattice: A Cloud-Native
Platform for Your Spring
Applications
– Slides
– Video
– http://lattice.cf/
29
情報元
Spring Cloud at Netflix
– Slides
– Video
– Netflix OSS
– Spring Cloud Netflix
30

SpringOne 2015 報告会 - Lattice + Spring Cloud Netflix