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