Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53

  • 249 views
Uploaded on

Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53

Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment

Views

Total Views
249
On Slideshare
185
From Embeds
64
Number of Embeds
2

Actions

Shares
Downloads
0
Comments
0
Likes
6

Embeds 64

https://twitter.com 66
https://tweetdeck.twitter.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. [R5-3] Spring Bootハンズオン ∼Spring Bootで作る マイクロサービスアーキテクチャ! 槙 俊明 (@making) JJUG CCC 2014 Fall 2014-11-15
  • 2. ハッシュタグ #jjug_ccc #ccc_r53
  • 3. 自己紹介 • @making • http://blog.ik.am • ガチSpringユーザー
  • 4. http://www.kohgakusha.co.jp/books/detail/978-4-7775-1865-4
  • 5. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 6. 演習のゴール URL Shortener UI Config Server (Spring Cloud Config) Service Discovery (Eureka) Circuit Breaker Monitor (Hystrix) URL Shortener load balancer(Ribbon) Browser URL Shortener URL Shortener Redis Config Repository (Gitbucket)
  • 7. 演習のゴール URL Shortener UI Config Server (Spring Cloud Config) Service Discovery (Eureka) Circuit Breaker Monitor (Hystrix) URL Shortener load balancer(Ribbon) Browser URL Shortener URL Shortener Redis Config Repository (Gitbucket) 演習1
  • 8. 演習のゴール URL Shortener UI Config Server (Spring Cloud Config) Service Discovery (Eureka) Circuit Breaker Monitor (Hystrix) URL Shortener load balancer(Ribbon) Browser URL Shortener URL Shortener Redis Config Repository (Gitbucket) 演習2 演習1
  • 9. 演習のゴール URL Shortener UI Config Server (Spring Cloud Config) Service Discovery (Eureka) Circuit Breaker Monitor (Hystrix) URL Shortener load balancer(Ribbon) Browser URL Shortener URL Shortener Redis Config Repository (Gitbucket) 演習2 演習1 演習3
  • 10. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 11. Spring Bootとは? フレームワークというよりプラットフォーム 現在1.1.9.RELEASE 簡単に言うと、Spring Framework でアプリケーションを簡単に作る ための仕組み もうすぐ1.2.0
  • 12. Spring Bootを使うことで・・ モダンでいけてるJava アプリケーションを 簡単に構築できる
  • 13. Spring Bootの特徴 • あらかじめオススメの組み合わせが決 まる • 依存ライブラリを同梱するだけで自動 で設定が決まる • 組み込みサーバーを同梱し、アプリを 即実行可能 アプリケーション自体は Spring MVCやSpring Batchで書く
  • 14. Spring Bootの特徴 • あらかじめオススメの組み合わせが決 まる • 依存ライブラリを同梱するだけで自動 で設定が決まる • 組み込みサーバーを同梱し、アプリを 即実行可能 アプリケーション自体は Spring MVCやSpring Batchで書く 小さなアプリを迅速に開発& デプロイするのに向いている (≠ 大きなアプリに向かない)
  • 15. <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.1.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <properties> <java.version>1.8</java.version> </properties> この設定を追加 するだけ
  • 16. いろいろな依存関係が追加され ている
  • 17. package com.example; ! import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; ! @RestController @EnableAutoConfiguration public class App { ! @RequestMapping("/") String home() { return "Hello World!"; } ! public static void main(String[] args) { SpringApplication.run(App.class, args); } } 魔法のアノテーション mainメソッドでアプリ実行
  • 18. まずは実行 • 実行方法は2通り または $ mvn spring-boot:run $ gradle bootRun Gradleの場合
  • 19. http://localhost:8080 にアクセス
  • 20. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 21. マイクロサービスアーキテクチャ • 小さなサービスを組み合わせて1つ のアプリケーションを作成するア プローチ • サービス間はメッセージング (HTTP/AMQP等)で通信
  • 22. • James Lewisが2012年に発表した 「Java, the Unix way」 という発表がマイクロサービスアーキテク チャの始まり。 • http://2012.33degree.org/talk/show/67 マイクロサービスアーキテクチャの出典
  • 23. マイクロサービスアーキテクチャの出典 • Martin Fowler氏と共著で書いた記 事「Microservices」で有名に • http://martinfowler.com/articles/microservices.html
  • 24. Java, the Unix way (1/4) • 1つの機能だけ持つ、多くの小さなア プリケーションで構成 • 全て頭に入っている/使い捨てできるく らいに十分小さいサイズ Small with Single Responsibility http://www.slideshare.net/SpringCentral/springboot-groovyより
  • 25. Java, the Unix way (2/4) •組み込みコンテナ(APサーバー) •実行可能jar •パッケージマネージャ(RPM等)でインストール •Unixのサービススクリプトで実行 Containerless Unix Process http://www.slideshare.net/SpringCentral/springboot-groovyより
  • 26. Java, the Unix way (3/4) •1アプリ1リポジトリ •共通モジュールは外出し(OSSラ イブラリのような扱い) Dedicated VCS roots http://www.slideshare.net/SpringCentral/springboot-groovyより
  • 27. Java, the Unix way (4/4) •アプリ内メトリクス •ヘルスチェック •外部のウォッチドッグプロセス •必要に応じてスケール Status Aware and Auto-Scaling http://www.slideshare.net/SpringCentral/springboot-groovyより
  • 28. Spring Bootは 「Java, the Unix way」 のほとんどの要素を満 たしている!
  • 29. http://techlife.cookpad.com/entry/2014/09/08/093000
  • 30. http://www.publickey1.jp/blog/14/post_246.html
  • 31. 2014年バスワード大賞 有力候補(適当) IoTと良い争い?(笑)
  • 32. 伝統的なアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 モノリシックアーキテクチャ
  • 33. 伝統的なアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 モノリシックアーキテクチャ システムが大きくなると、全体 を把握するのが大変で、保守が 難しい。
  • 34. 伝統的なアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 モノリシックアーキテクチャ システムが大きくなると、全体 を把握するのが大変で、保守が 難しい。 技術の変更は難しい(リスキー) =ほぼ全体書き換え
  • 35. 伝統的なアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 モノリシックアーキテクチャ システムが大きくなると、全体 を把握するのが大変で、保守が 難しい。 技術の変更は難しい(リスキー) =ほぼ全体書き換え 技術的に発展的成長が難しい アーキテクチャ
  • 36. マイクロサービスアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 Single Responsibility Principle (SRP) に基づきドメイン単位でサービスを分割す
  • 37. マイクロサービスアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 Single Responsibility Principle (SRP) に基づきドメイン単位でサービスを分割す HTTPやAMQPで通信
  • 38. マイクロサービスアーキテクチャ http://www.infoq.com/articles/microservices-intro より図を拝借 Single Responsibility Principle (SRP) に基づきドメイン単位でサービスを分割す HTTPやAMQPで通信 Amazon Netfilx eBay などが採用
  • 39. マイクロサービスアーキテクチャの メリット・デメリット メリット デメリット 自担当のサービスのコードを 理解しやすい システム全体を見なくなる 新しい技術を採用しやすい・ 失敗してもやり直しやすい 分散システムの整合をとる のが難しい サービス単位でスケールできる サービス間の通信オーバー ヘッドがある 1 ーク等 他サービスの障害をふまえ た設計が必要 IDE
  • 40. マイクロサービスアーキテクチャの メリット・デメリット メリット デメリット 自担当のサービスのコードを 理解しやすい システム全体を見なくなる 新しい技術を採用しやすい・ 失敗してもやり直しやすい 分散システムの整合をとる のが難しい サービス単位でスケールできる サービス間の通信オーバー ヘッドがある 1 ーク等 他サービスの障害をふまえ た設計が必要 IDE Service Registration and Discovery Distributed Configuration Load Balancing Circuit Breaker
  • 41. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 42. Netflix社の例 • すでにマイクロサービスアーキテクチャを用いてサービス を運用 • マイクロサービスアーキテクチャに必要ないくつかのデザ インパターンを実装してOSSに公開 • Service registration and discovery • Routing • Load balancing • Circuit Breaker • …
  • 43. Netflix OSS http://netflix.github.io/
  • 44. Eureka 各サービスの登録・検出を担う。各サービスはそれぞ れのサービスのIP/PORTを知らなくて良くなる。 負荷分散やフェールオバー等に用いられる。 https://github.com/Netflix/eureka
  • 45. AWSのELBはフロントエンドの負荷分散向けであるが、 Eurekaはミドルウェア間の負荷分散に対応 AWSのマルチAZで複製可能
  • 46. 30秒毎のheartbeat AWSのELBはフロントエンドの負荷分散向けであるが、 Eurekaはミドルウェア間の負荷分散に対応 AWSのマルチAZで複製可能
  • 47. Hystrix Circuit Breakerパターンを実現する処理を コマンドパターンで実装するライブラリ https://github.com/Netflix/Hystrix
  • 48. Circuit Breakerパターン • 障害が起きているサービスにアク セスし続けることで、他のサービ スへの障害へ伝播することを防ぐ。 → 一定期間でエラーやタイムア ウトのしきい値を超えたら、そ の処理を常にエラーにする。
  • 49. http://springinpractice.com/2010/07/06/annotation-based-circuit-breakers-with-spring 正常 エラーやタイムアウトがしきい 値を超えるとリクエストを遮断 する状態に移行する 時間が経過すると、正常 に戻っているか確認
  • 50. Hystrix Dashboard
  • 51. Hystrix Dashboard
  • 52. Turbine Hystrixのイベントストリームを集約する https://github.com/Netflix/turbine
  • 53. Ribbon クライアントサイドでロードバランス(ラウンドロ ビン)するためのライブラリ。EurekaやHTTP/TCP/ UDPクライアントと連携する。 https://github.com/Netflix/ribbon
  • 54. Zuul Java製ルーター&サーバーサイドロードバランサ https://github.com/Netflix/zuul
  • 55. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 56. マイクロサービス界のFizzBuzz • 「URL短縮サービス」をいかに簡単 に作成できるか?がフレームワーク のベンチマークとなっている? • bit.lyやgoo.glみたいなやつ。
  • 57. 課題1: TODOを埋めてプログラム を完成させてください String hash = ""/* TODO (1) URLをハッシュ化。ハッシュアル ゴリズムには 32-bit murmur3 algorithm を使用する。 */; // ヒント: com.google.common.hash.Hashing.murmur3_32() // TODO (2) urlMapにhashに紐づくURLを追加する。 demo.UrlShortenerクラスを編集してください。 35行目 37行目 exercise/01-urlshortener/urlshortener
  • 58. 課題2: Redisを使ってConcurrentHashMap 使用部分を書き換えましょう $ cd software/redis-2.8.17 $ make $ ./src/redis-server Redisのビルド&起動
  • 59. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 60. Spring Cloud • 分散システムの共通的なパターンを簡単に使え るようにしたプロジェクト • Spring Cloud Config • Spring Cloud Netflix • Spring Cloud for Amazon Web Services • Spring Cloud Connectors 等 • 現在1.0.0.M2バージョン(正式版はまだ) http://projects.spring.io/spring-cloud/
  • 61. Spring Cloud Config • 分散システムにおけるコンフィギュレーション の仕組み(Distributed Configuration Management)を提供するプロジェクト • ClientとServerで構成される。 • コンフィギュレーションを再読み込みする仕 組みも提供する。
  • 62. Spring Cloud Configの最小構成 @EnableConfigServer@EnableAutoConfiguration foo Main Application (Client) port:8888port:8080 Config Server Git Properties Config Repository Spring Cloud Config Client Spring Cloud Config Server 設定の取得元をGitま たはPropertiesファイル を選択できる
  • 63. Config Serverの作り方 package demo; ! import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.config.server.EnableConfigServer; import org.springframework.context.annotation.ComponentScan; ! @EnableConfigServer @EnableAutoConfiguration @ComponentScan public class ConfigServer { ! public static void main(String[] args) { SpringApplication.run(ConfigServer.class, args); } }
  • 64. Config Serverの作り方 package demo; ! import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.config.server.EnableConfigServer; import org.springframework.context.annotation.ComponentScan; ! @EnableConfigServer @EnableAutoConfiguration @ComponentScan public class ConfigServer { ! public static void main(String[] args) { SpringApplication.run(ConfigServer.class, args); } } アノテーションつけるだけ
  • 65. Config Serverの作り方 • org.springframework.cloud.c onfig.server.ConfigServerAp plicationクラスが用意されている ため、実はConfigServerクラスを作 成する必要が無い。
  • 66. Config Repositoryの指定方法 spring: platform: config: server.uri: https://github.com/making/config-repo
  • 67. Config Repositoryの指定方法 spring: platform: config: server.uri: https://github.com/making/config-repo Server側のbootstrap.ymlに spring.platform.config.server.uriプロパティ指定
  • 68. コンフィギュレーション取得方法 http://localhost:8888/{app}/{env}/{label} にアクセスすることでアプリケーション毎の環境(profile)毎 のコンフィギュレーションを取得できる • app=アプリケーション名 • env=profile名 (デフォルトはdefault) • label=branch名 (デフォルトはmaster, 省略可)
  • 69. Githubでの設定例 https://github.com/making/config-repo
  • 70. Githubでの設定例 https://github.com/making/config-repohttp://localhost:8888/foo/default で取得できる
  • 71. Githubでの設定例 https://github.com/making/config-repohttp://localhost:8888/foo/default で取得できる http://localhost:8888/foo/development で取得できる(defaultの値を上書き)
  • 72. Githubでの設定例 https://github.com/making/config-repohttp://localhost:8888/foo/default で取得できる http://localhost:8888/foo/development で取得できる(defaultの値を上書き) 演習で試しましょう
  • 73. Config Serverのセキュリティ • http://cloud.spring.io/spring-cloud- config/spring-cloud- config.html#_spring_cloud_config_server • Spring Securityによる認証/認可やプロパ ティの暗号化/復号にも対応
  • 74. Clientの作り方 ! <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency> !
  • 75. Clientの作り方 ! <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency> ! 依存関係いれるだけ
  • 76. Clientの使い方 @RestController @ComponentScan @EnableAutoConfiguration public class ClientApp { @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } ! public static void main(String[] args) { SpringApplication.run(ClientApp.class, args); } }
  • 77. Clientの使い方 @RestController @ComponentScan @EnableAutoConfiguration public class ClientApp { @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } ! public static void main(String[] args) { SpringApplication.run(ClientApp.class, args); } } Springの普通の プロパティ解決の仕組み
  • 78. アプリケーション名の指定 spring.application.name: foo
  • 79. アプリケーション名の指定 spring.application.name: foo Client側のbootstrap.ymlに spring.application.nameプロパティ指定
  • 80. 設定例
  • 81. 設定例 @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; }
  • 82. 設定例 @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello 123456!
  • 83. 設定変更 @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; }
  • 84. 設定変更 @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello 123456!
  • 85. 設定変更 @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello 123456! 反映されていない!?
  • 86. Refreshエンドポイント $ curl -X POST http://localhost:8080/refresh ["bar"] $ curl -X GET http://localhost:8080/env/bar Spring Boot @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; }
  • 87. Refreshエンドポイント $ curl -X POST http://localhost:8080/refresh ["bar"] $ curl -X GET http://localhost:8080/env/bar Spring Boot @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello 123456!
  • 88. Refreshエンドポイント $ curl -X POST http://localhost:8080/refresh ["bar"] $ curl -X GET http://localhost:8080/env/bar Spring Boot @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello 123456! DI済みのプロパティには 反映されない!?
  • 89. Restartエンドポイント $ curl -X POST http://localhost:8080/restart {"message":"Restarting"} @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } DIコンテナを再起動
  • 90. Restartエンドポイント $ curl -X POST http://localhost:8080/restart {"message":"Restarting"} @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello Spring Boot! DIコンテナを再起動
  • 91. Restartエンドポイント $ curl -X POST http://localhost:8080/restart {"message":"Restarting"} @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } Hello Spring Boot! 再DIによりプロパティが 反映された。 (でも、起動に時間がかかる) DIコンテナを再起動
  • 92. Adhocな コンフィギュレーション変更 $ curl -X POST http://localhost:8080/env -d bar="Spring Cloud" {"bar":"Spring Cloud"} $ curl http://localhost:8080/env/bar Spring Cloud EnvエンドポイントにPOST
  • 93. Adhocな コンフィギュレーション変更 $ curl -X POST http://localhost:8080/env -d bar="Spring Cloud" {"bar":"Spring Cloud"} $ curl http://localhost:8080/env/bar Spring Cloud EnvエンドポイントにPOST $ curl -X POST http://localhost:8080/refresh [] $ curl -X GET http://localhost:8080 Hello Spring Boot!
  • 94. Adhocな コンフィギュレーション変更 $ curl -X POST http://localhost:8080/env -d bar="Spring Cloud" {"bar":"Spring Cloud"} $ curl http://localhost:8080/env/bar Spring Cloud EnvエンドポイントにPOST $ curl -X POST http://localhost:8080/refresh [] $ curl -X GET http://localhost:8080 Hello Spring Boot! Refreshしてもやはり変わらず
  • 95. Refreshスコープ @RestController @ComponentScan @EnableAutoConfiguration @RefreshScope public class ClientApp { @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } ! public static void main(String[] args) { SpringApplication.run(App.class, args); } } BeanのスコープをSpring Cloud Configで追加されたRefreshスコープ に変更
  • 96. Refreshスコープ @RestController @ComponentScan @EnableAutoConfiguration @RefreshScope public class ClientApp { @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } ! public static void main(String[] args) { SpringApplication.run(App.class, args); } } BeanのスコープをSpring Cloud Configで追加されたRefreshスコープ に変更
  • 97. 設定例 $ curl -X POST http://localhost:8080/env -d bar="Spring Cloud Config" {"bar":"Spring Cloud Config"} $ curl http://localhost:8080/env/bar Spring Cloud Config
  • 98. 設定例 $ curl -X POST http://localhost:8080/env -d bar="Spring Cloud Config" {"bar":"Spring Cloud Config"} $ curl http://localhost:8080/env/bar Spring Cloud Config $ curl -X POST http://localhost:8080/refresh [] $ curl -X GET http://localhost:8080 Hello Spring Cloud Config!
  • 99. 設定例 $ curl -X POST http://localhost:8080/env -d bar="Spring Cloud Config" {"bar":"Spring Cloud Config"} $ curl http://localhost:8080/env/bar Spring Cloud Config $ curl -X POST http://localhost:8080/refresh [] $ curl -X GET http://localhost:8080 Hello Spring Cloud Config! Refreshでプロパティが 即再DIされた
  • 100. Spring Cloud Netflix • Netflix OSS群とSpringとの連携モジュール • Eureka • Hystrix • Turbine • Ribbon • Feign • Zuul • Archaius
  • 101. @ComponentScan @EnableAutoConfiguration @EnableEurekaServer public class EurekaServer { ! public static void main(String[] args) { SpringApplication.run(EurekaServer.class, args); } } Eureka (Server)
  • 102. @ComponentScan @EnableAutoConfiguration @EnableEurekaServer public class EurekaServer { ! public static void main(String[] args) { SpringApplication.run(EurekaServer.class, args); } } Eureka (Server)
  • 103. Eureka (Client) @RestController @ComponentScan @EnableAutoConfiguration @RefreshScope @EnableEurekaClient public class ClientApp { @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } ! public static void main(String[] args) { SpringApplication.run(ClientApp.class, args); } }
  • 104. Eureka (Client) @RestController @ComponentScan @EnableAutoConfiguration @RefreshScope @EnableEurekaClient public class ClientApp { @Value("${bar:World}") String bar; ! @RequestMapping("/") String home() { return "Hello " + bar + "!"; } ! public static void main(String[] args) { SpringApplication.run(ClientApp.class, args); } }
  • 105. Eureka(Server)のダッシュボード
  • 106. Eureka(Server)のダッシュボード Eureka Serverに登録し ているサービス(Client)
  • 107. Hystrix @ComponentScan @EnableAutoConfiguration @EnableEurekaClient @EnableHystrix public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } @Component public class StoreIntegration { ! @HystrixCommand(fallbackMethod = "defaultStores") public Object getStores(Map<String, Object> parameters) { // do stuff that might fail } ! public Object defaultStores(Map<String, Object> parameters) { return /* something useful */; } } Circuitが Openな状態 に実行するメ ソッド Circuit Breakerパターンに対 応したコマンドを作成できる
  • 108. Hystrix @ComponentScan @EnableAutoConfiguration @EnableEurekaClient @EnableHystrix public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } @Component public class StoreIntegration { ! @HystrixCommand(fallbackMethod = "defaultStores") public Object getStores(Map<String, Object> parameters) { // do stuff that might fail } ! public Object defaultStores(Map<String, Object> parameters) { return /* something useful */; } } Circuitが Openな状態 に実行するメ ソッド Circuit Breakerパターンに対 応したコマンドを作成できる
  • 109. Hystrix Dashboard @ComponentScan @EnableAutoConfiguration @EnableHystrixDashboard public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
  • 110. Hystrix Dashboard @ComponentScan @EnableAutoConfiguration @EnableHystrixDashboard public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
  • 111. Hystrix Dashboard @EnableHystrixをつけたアプ リのevent-streamを登録
  • 112. Hystrix Dashboard
  • 113. Ribbon@Component public class MyClass { @Autowired LoadBalancerClient loadBalancer; ! public Object getStores(Map<String, Object> parameters) { ServiceInstance instance = loadBalancer.choose("stores"); URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort())); // do something with the URI } } Eurekaに登録したサービス名 @Component public class MyClass { @Autowired RestTemplate restTemplate; ! public Object getStores(Map<String, Object> parameters) { String results = restTemplate.getForObject("http://stores", String.class); return results; } } RestTemplateにRibbonを使用した Interceptorが埋め込まれている hostname:port指定不要
  • 114. Spring Cloudを用いたマイクロサー ビスアーキテクチャのBoilerplate UI Service B Config Server Service Discovery Circuit Breaker Monitor Service A load balancer load balancer Browser
  • 115. Spring Cloudを用いたマイクロサー ビスアーキテクチャのBoilerplate UI Service B Config Server Service Discovery Circuit Breaker Monitor Service A load balancer load balancer Browser Spring Cloud Config Eureka Ribbon Hystrix
  • 116. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 117. 演習で扱うシステムの アーキテクチャ Config Server (Spring Cloud Config) URL Shortener Config Repository (Gitbucket) 8080 8888 8081 Config Client
  • 118. コンテンツ • Spring Bootとは? • マイクロサービスアーキテクチャとは? • マイクロサービスアーキテクチャのためのNetflix OSS群 • 演習1 Spring Bootで「URL短縮サービス」を作る • Spring Cloudとは? • 演習2 Spring Cloud Configで動的コンフィギュレーション • 演習3 Spring Cloud Netflixでマイクロサービスアーキテク チャ構築
  • 119. 演習で扱うシステムの アーキテクチャ URL Shortener UI Config Server (Spring Cloud Config) Service Discovery (Eureka) Circuit Breaker Monitor (Hystrix) URL Shortener load balancer(Ribbon) Browser URL Shortener URL Shortener Redis Config Repository (Gitbucket)
  • 120. URL Shortener UI Config Server (Spring Cloud Config) Service Discovery (Eureka) Circuit Breaker Monitor (Hystrix) URL Shortener load balancer(Ribbon) Browser URL Shortener URL Shortener Redis 9999 Config Repository (Gitbucket) 8080 8888 8761 63797979 8083 8082 8081 演習で扱うシステムの アーキテクチャ
  • 121. まとめ • 後で書く