ぱぱっと理解するSpring Cloudの基本
-
Upload
kazuki-kumagai -
Category
Software
-
view
1.011 -
download
0
Transcript of ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloud の基本2017/01/23 JJUG ナイトセミナー
はじめに
2
3
数百件のプロジェクトの基盤を支える社内APフレームワークの整備・普及展開をやっています ・熊谷 一生 社内 AP フレームワークのグローバル展開担当 ・ JIA XIAOZHOU 社内APフレームワークのクラウド対応担当
自己紹介SIer で AP フレームワークの整備・展開を
やっています
4
• Spring Cloud 傘下の主なプロジェクト
• 最新の動向• 2017 年 1 月 12 日 Spring Cloud Camden.SR4 リリース
Spring Cloud とはクラウドネイティブなアプリを作るための
便利なツールの集合体
Spring Cloud Config Spring Cloud Netflix Spring Cloud Data Flow
Spring Cloud Consul Spring Cloud Zookeeperなどなど…
参加のプロジェクトがどんどん増え活発に成長しています
5
•変化に強いこと•性能のスケールアウト•障害に強いなどなど語りだすと奥が深くきりがありません・・・・・・
クラウドネイティブなメリット各メリットごとに奥が深すぎて語り切れない
すべての概念・機能を使いこなすのは時間がかかる
6
Spring Cloud で・・・•おさえておきたい基本技術•使ってみると感じる疑問を初心者向けに解説していきます
本日のアジェンダこれからクラウドネイティブなアプリを
作りたい人向けに基礎に絞って解説
Spring Cloudおさえておきたい基本技術
7
8
このパートでは、 Spring Cloud の基本技術を用いたアプリ作成を
ステップ・バイ・ステップで解説します
9
そもそも、 Spring Cloud でできることは・・・
10
クラウドネイティブなアプリケーションの作成
11
クラウドネイティブアプリの特徴小さな単位にアプリに分かれている( マイクロサービスアーキテクチャ )
Service A
Service B
クライアント
Service C
12
クラウドネイティブアプリのメリット(1/2)疎結合で変化・機能追加に強い
Service A´
Service B
クライアント
Service C
Service D
Service D を追加しても
影響箇所が限定される
13
クラウドネイティブアプリのメリット(2/2)サービスの多重化による
処理性能向上・対障害性向上
Service A
Service B
クライアント
Service C
Service AService AService AService A
処理性能:多数サービスで負荷分散対障害性:障害時、別サービスが代
替
14
今回は最大限簡素化したテーマに沿ってSpring Cloud の基本技術を使ったアプリ
を作成
15
今回説明に用いる題材説明のため要素を簡素化した題材で
基本技術を説明します
16
今回説明に用いる題材説明のため要素を簡素化した題材で
基本技術を説明します
結合した文字列を返すサービスの作成
17
題材のサービス構成 (1/3)構成要素①
単純な文字列を返すサービス
りんご
ペン
18
題材のサービス構成 (2/3)構成要素②
ほかのサービスの出力を結合するサービス
りんご
ペン
Uh
他のサービスの出力を結合
19
題材のサービス構成 (3/3)結合した文字列をクライアントに返す
りんご
ペン
Uhクライアント
20
今回のシナリオ
もし爆発的な人気が出て、世界中から数億のアクセスがあったら・・・
Service Discovery 、Client-side Load Balancingでサービスの多重化
21
22
発生しうる問題急激なリクエスト増加によるアクセスの集
中
Uhクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ント
りんご
ペン
23
発生しうる問題機能追加による負荷の偏り
Uhクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ントクライア
ント パイナップル
Uh②ペン
りんご
24
解決策の一つとしてサービスの多重化Spring Cloud は容易に多重化出来る
枠組みを提供
25
Spring Cloud による負荷分散Eureka サービスの導入
DNS の様な働き
りんご
ペンUhクライアント
Eurekaサービ
ス
26
負荷分散の仕組み (1/4)負荷分散のための別のサービスを起動
りんご
ペンUhクライアント
Eurekaサービ
ス
サービスのリスト
ペン -1 ⇒ 192.168.X.Y:80・・・・・・・・・
ペン -2
27
負荷分散の仕組み (2/4)起動後、自分の情報を Eureka サービスに登録
(Service Registration)
りんご
ペンUhクライアント
Eurekaサービ
ス
ペン -2
サービスのリスト
ペン -1 ⇒ 192.168.X.Y:80
ペン -2 ⇒ 192.168.A.B:80・・・・・・
自分の情報 ・アプリ名 ・ IP アドレス ・ポート番号を登録
28
負荷分散の仕組み (3/4)要求元は Eureka からサービス一覧を取得
(Service Discovery)
りんご
ペンクライアント ペン -2
Eurekaサービ
ス
サービスのリスト
ペン -1 ⇒ 192.168.X.Y:80
ペン -2 ⇒ 192.168.A.B:80・・・・・・
サービスの一覧リストを返す
Uhサービスのリス
トペン -1 ⇒
192.168.X.Y:80ペン -2 ⇒
192.168.A.B:80・・・・・・
29
サービスのリスト
ペン -1 ⇒ 192.168.X.Y:80
ペン -2 ⇒ 192.168.A.B:80・・・・・・クライアント
負荷分散の仕組み (4/4)アクセスサーバーを要求元が決定する
(Client-side Load Balancing)
りんご
ペン
Eurekaサービ
ス
ペン -2Uhサービスのリス
トペン -1 ⇒
192.168.X.Y:80ペン -2 ⇒
192.168.A.B:80・・・・・・
決められたロジックでアクセス先サーバーを分散
30
負荷に応じた柔軟な多重化が可能「ペン」サービス以外にも
他のサービスも負荷に応じて多重化可能
りんご
ペンUhクライアント
Eurekaサービ
スりんごりんご
ペンペンペンペン
実際のコーディング
31
32
1. @EnableEurekaService で Eureka サービス作成
2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散
多重化を実現する 3 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス
33
1. @EnableEurekaService で Eureka サービス作成
2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散
多重化を実現する 3 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス
34
Eureka サービスプロジェクトの作成①start.spring.io暗記しましょう!!!
② 依存関係にEureka Server を追加
③ 作成
35
Eureka サービスの設定server.port=8761
Application.properties の編集
@EnableEurekaServer を追記
Eureka のデフォルトのポート番号
@EnableEurekaServer@SpringBootApplicationpublic class EurekaApplication {
//…
36
Eureka サービスの起動STS の Bashboard から Spring Boot アプリ起動
37
Eureka サービスの起動確認ブラウザで http://localshot:8761にアクセス
Eureka のダッシュボード登録されているサービスを確認できる
38
1. @EnableEurekaService で Eureka サービス作成
2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散
多重化を実現する 3 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス
39
Eureka クライアントの作成
Eureka Discovery を選択
40
ソースファイルの編集@SpringBootApplication@EnableEurekaClient@RestControllerpublic class AppleApplication {{
//…
@EnableEurekaClient を追記
41
設定ファイルの編集
server.port=8002spring.application.name=appleeureka.client.serviceUrl.defaultZone=
http://localhost:8761/eureka/
① 起動ポート
③ 登録先の Eureka サービス
② アプリ名
application.properties の編集
42
Eureka クライアントの起動起動するとダッシュボードに登録されている
サーバー名とポート番号
43
Eureka クライアントの複数起動
同じアプリ名で複数起動すると多重度が上がる
44
1. @EnableEurekaService で Eureka サービス作成
2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散
多重化を実現する 3 ステップ
りんご
ペンUhクライアント
Eurekaサービ
スりんご
45
「 Uh 」サービスの作成
Ribbon を追加
46
ロードバランシングの有効化
@LoadBalanced@BeanRestTemplate restTemplate() {
return new RestTemplate();}
この RestTemplate を介して負荷分散される
@LoadBlanced を追記
47
「 Uh 」の処理の実装@GetMapping("/")public String getValue() { return restTemplate. getForObject( "http://apple", String.class) + " "+ restTemplate. getForObject( "http://pen", String.class);
アプリ名で名前解決
48
1. @EnableEurekaService で Eureka サービス作成
2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散
多重化を実現する 3 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス
Circuit Breaker で障害検知・対応
49
50
発生しうる問題一か所の障害でサービス全体が
応答しなくなる可能性
りんご
ペン
クライアント
Eurekaサービ
ス りんごりんご
ペンペンペン
UhUh
障害発生応答しな
い
他サービスへ
影響
51
解決策の一つとして障害時の既定の動作を定義
障害時は既定の動作を呼び出しサービス全体としては継続する枠組みを提供
52
Circuit Breaker の仕組み(1/2)
他のサービスの障害を検知
ペン
クライアント
Eurekaサービ
ス りんごりんご
ペンペンペン
りんご
UhUh
応答しないエラーを応答する
53
りんごりんご
Circuit Breaker の仕組み(2/2) 障害を検知した場合事前に定義した既定の応答を返す
ペン
クライアント
Eurekaサービ
ス
ペンペンペン
りんご
UhUh
既定の応答を返す
実際のコーディング
54
55
1. @EnableCircuitBreaker で CircuitBreakerの有効化
2. @HystrixCommand で障害時の既定動作を定義
Circuit Breaker を実現する 2 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス既定の応答
を返す
56
1. @EnableCircuitBreaker で CircuitBreakerの有効化
2. @HystrixCommand で障害時の既定動作を定義
Circuit Breaker を実現する 2 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス
57
Hystrix への依存性を追加
Hystrix を追加
58
CircuitBreaker の有効化
@EnableCircuitBreaker@EnableEurekaClient@RestController@SpringBootApplicationpublic class UhApplication {
@EnableCircuitBreaker を追記
59
1. @EnableCircuitBreaker で CircuitBreakerの有効化
2. @HystrixCommand で障害時の既定動作を定義
Circuit Breaker を実現する 2 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス既定の応答
を返す
60
障害時の既定の動作の指定
@GetMapping("/") @HystrixCommand(fallbackMethod = "returnDefaultValue")public String getValue() {
@ HystrixCommand のfallbackMethod属性に障害時の呼ばれるメソッドを指定
61
1. @EnableCircuitBreaker で CircuitBreakerの有効化
2. @HystrixCommand で障害時の既定動作を定義
Circuit Breaker を実現する 2 ステップ
りんご
ペンUhクライアント
Eurekaサービ
ス既定の応答
を返す
Config Server で設定情報の集中管理
62
63
りんご
発生しうる問題サービスの数だけ設定ファイルが存在設定変更が大変、不整合の恐れあり
ペンUhクライアント
Eurekaサービ
スりんごりんご
Uh ペンペンペンペン
64
解決策の一つとして設定ファイルの集中管理
設定ファイルを集中管理して各サービスの設定値を更新する仕組みを提供
65
Configサービ
ス
設定情報の集中管理git で設定ファイルの保管
Config サービスで設定ファイルの取次
りんご
ペンUhクライア
ント
Eurekaサービ
ス
りんごりんご
ペンペンペンペンUh
66
設定情報集中管理の仕組み (1/2)各サービスは起動すると
Config サービスにアクセス
りんご
ペンUhクライア
ント
Eurekaサービ
ス
りんご
ペンペンペンペンUh
りんごConfigサービ
スパラメータとして、・自分のアプリ名・ profile 名 ( デプロイ環境指定のため )を渡す
67
設定情報集中管理の仕組み (2/2)Config サービスは git から設定情報取得
要求元に返して適用
りんご
ペンUhクライア
ント
Eurekaサービ
ス
りんご
ペンペンペンペンUh
りんごConfigサービ
ス①設定情報の取得
③適用②送付
68
設定情報の更新設定の更新時でも再デプロイせずに
サービス断続最小限で設定更新することも可能
りんご
ペンUhクライア
ント
Eurekaサービ
ス
りんご
ペンペンペンペンUh
りんご
管理者Configサービ
ス
①更新
②Refresh 要求
③設定の再取得
実際のコーディング
69
70
1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成
設定集中管理を実現する 2 ステップ
Configサービ
スりんご
Uhクライアント
Eurekaサービ
ス
ペン
71
Configサービ
ス
1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成
設定集中管理を実現する 2 ステップ
りんご
Uhクライアント
Eurekaサービ
ス
ペン
72
Config サービスプロジェクトの作成
Config Server の追加
73
Git レポジトリの指定server.port=8888spring.cloud.config.server.git.uri=http://localhost/git/root/config-files.git
application.properties の編集
任意の Git のアドレスを指定
74
Git レポジトリへ設定ファイルをPUSHアプリ名 .properties で設定ファイルを登録
設定値例message=apple
75
Config サービス経由で値取得
Config サービスから設定値が取得可能
http://[Config サービスの URI]/ アプリ名 /default
76
1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成
設定集中管理を実現する 2 ステップ
りんご
Uhクライアント
Eurekaサービ
ス
Configサービ
ス
ペン
77
Config クライアントの設定
Config ClientActuator
の追加
78
Config サービスの指定
spring.cloud.config.uri=http://localhost:8888
application.properties の編集
79
Actuator 経由で環境変数の確認http://[ サービス名 ]/env にアクセスしてサービスの環境変数を取得する
Config サーバーから
設定値が反映されmessega=apple
となっている
80
サービス内で設定値の利用@Value("${message}")private String message;
@Value アノテーションで値が注入される
@GetMapping("/")public String getValue() {
return message;}
81
1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成
設定集中管理を実現する 2 ステップ
Configサービ
スりんご
Uhクライアント
Eurekaサービ
ス
ペン
Spring Cloud を使ってみて感じた疑問
82
83
このパートでは、 Spring Cloud を使って感じた疑問とその考えについて
4 つを説明します
84
•問題• Single point of failure
•実際には、 LB の後に複数の Config インスタンスをおく場合が多い
1. 設定を集約管理して信頼性は大丈夫?必要に応じて冗長化の必要がある
事象 対処性能がたりない 冗長化
オペミス 運用ルール
85
•Eureka 同士の間に、お互い登録し、常に情報共有をしている•障害時、 Eureka 同士が持ってる情報がずれている場合がある
2. Eureka 冗長化の考え方Availability > Consistency( 可用性 ) ( 整合性 )
• Pattern 1 Config First Bootstrap
• Pattern 2 Discovery First Bootstrap
3. Config First or Discovery First?
86
Config First でしょう
Configを起動
Config からEureka の情
報を取得
Eurekaへ登録
Eureka を起
動
Configを
Eurekaへ登録
Eureka から Config
の情報を取得
Configへ
問合せ
87
4. Eureka と DNS どう違う ?DNS より、 Service Registry と負荷分散が
簡単にできること
初期手間 負荷分散
Eureka Annotation
Annotation
DNS 事前登録 設定必要
88
疑問部のまとめSpring Cloud は入門は簡単だが
深く考えるといろいろなパターンがあって奥が深く、興味深い
おわりに
89
90
本セッションではSpring Cloud の基礎に絞って解説しまし
た
91
JSUG では Spring Cloud の応用についてはもちろんのこと
様々な Spring 技術の勉強会を行っています
92
•ほぼ毎月開催「 Spring 勉強会」• 2016/07/06:Cloud Native Java • 2016/06/22:Spring Cloud と Zipkin を利用した分散トレーシング• 2016/03/09:Microservices /w Spring Security OAuth• 2016/02/01:Spring Cloud Netflix を使おう
• Spring の日本最大級イベント「 Spring Day 」• 2016 年は 24 セッションにも及ぶ Spring 関連技術の講演
Spring Cloud に興味をもたれた方へJSUG で Spring の勉強会やってます!
最近のSpring Cloud
関連テーマ
93
今年も Spring Day やります!Spring Day 2017 は
10月中旬(平日)を予定しています
Thank you!