ぱぱっと理解するSpring Cloudの基本

Post on 07-Feb-2017

1.011 views 0 download

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!