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

94
ぱぱぱぱぱぱぱぱ Spring Cloud ぱぱぱ 2017/01/23 JJUG ナナナナナナナ

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

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

ぱぱっと理解するSpring Cloud の基本2017/01/23 JJUG ナイトセミナー

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

はじめに

2

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

3

数百件のプロジェクトの基盤を支える社内APフレームワークの整備・普及展開をやっています ・熊谷 一生 社内 AP フレームワークのグローバル展開担当 ・ JIA XIAOZHOU 社内APフレームワークのクラウド対応担当

自己紹介SIer で AP フレームワークの整備・展開を

やっています

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

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などなど…

参加のプロジェクトがどんどん増え活発に成長しています

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

5

•変化に強いこと•性能のスケールアウト•障害に強いなどなど語りだすと奥が深くきりがありません・・・・・・

クラウドネイティブなメリット各メリットごとに奥が深すぎて語り切れない

すべての概念・機能を使いこなすのは時間がかかる

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

6

Spring Cloud で・・・•おさえておきたい基本技術•使ってみると感じる疑問を初心者向けに解説していきます

本日のアジェンダこれからクラウドネイティブなアプリを

作りたい人向けに基礎に絞って解説

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

Spring Cloudおさえておきたい基本技術

7

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

8

このパートでは、 Spring Cloud の基本技術を用いたアプリ作成を

ステップ・バイ・ステップで解説します

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

9

そもそも、 Spring Cloud でできることは・・・

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

10

クラウドネイティブなアプリケーションの作成

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

11

クラウドネイティブアプリの特徴小さな単位にアプリに分かれている( マイクロサービスアーキテクチャ )

Service A

Service B

クライアント

Service C

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

12

クラウドネイティブアプリのメリット(1/2)疎結合で変化・機能追加に強い

Service A´

Service B

クライアント

Service C

Service D

Service D を追加しても

影響箇所が限定される

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

13

クラウドネイティブアプリのメリット(2/2)サービスの多重化による

処理性能向上・対障害性向上

Service A

Service B

クライアント

Service C

Service AService AService AService A

処理性能:多数サービスで負荷分散対障害性:障害時、別サービスが代

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

14

今回は最大限簡素化したテーマに沿ってSpring Cloud の基本技術を使ったアプリ

を作成

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

15

今回説明に用いる題材説明のため要素を簡素化した題材で

基本技術を説明します

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

16

今回説明に用いる題材説明のため要素を簡素化した題材で

基本技術を説明します

結合した文字列を返すサービスの作成

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

17

題材のサービス構成 (1/3)構成要素①

単純な文字列を返すサービス

りんご

ペン

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

18

題材のサービス構成 (2/3)構成要素②

ほかのサービスの出力を結合するサービス

りんご

ペン

Uh

他のサービスの出力を結合

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

19

題材のサービス構成 (3/3)結合した文字列をクライアントに返す

りんご

ペン

Uhクライアント

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

20

今回のシナリオ

もし爆発的な人気が出て、世界中から数億のアクセスがあったら・・・

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

Service Discovery 、Client-side Load Balancingでサービスの多重化

21

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

22

発生しうる問題急激なリクエスト増加によるアクセスの集

Uhクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ント

りんご

ペン

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

23

発生しうる問題機能追加による負荷の偏り

Uhクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ントクライア

ント パイナップル

Uh②ペン

りんご

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

24

解決策の一つとしてサービスの多重化Spring Cloud は容易に多重化出来る

枠組みを提供

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

25

Spring Cloud による負荷分散Eureka サービスの導入

DNS の様な働き

りんご

ペンUhクライアント

Eurekaサービ

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

26

負荷分散の仕組み (1/4)負荷分散のための別のサービスを起動

りんご

ペンUhクライアント

Eurekaサービ

サービスのリスト

ペン -1 ⇒ 192.168.X.Y:80・・・・・・・・・

ペン -2

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

27

負荷分散の仕組み (2/4)起動後、自分の情報を Eureka サービスに登録

(Service Registration)

りんご

ペンUhクライアント

Eurekaサービ

ペン -2

サービスのリスト

ペン -1 ⇒ 192.168.X.Y:80

ペン -2 ⇒ 192.168.A.B:80・・・・・・

自分の情報 ・アプリ名 ・ IP アドレス ・ポート番号を登録 

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

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・・・・・・

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

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・・・・・・

決められたロジックでアクセス先サーバーを分散

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

30

負荷に応じた柔軟な多重化が可能「ペン」サービス以外にも

他のサービスも負荷に応じて多重化可能

りんご

ペンUhクライアント

Eurekaサービ

スりんごりんご

ペンペンペンペン

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

実際のコーディング

31

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

32

1. @EnableEurekaService で Eureka サービス作成

2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散

多重化を実現する 3 ステップ

りんご

ペンUhクライアント

Eurekaサービ

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

33

1. @EnableEurekaService で Eureka サービス作成

2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散

多重化を実現する 3 ステップ

りんご

ペンUhクライアント

Eurekaサービ

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

34

Eureka サービスプロジェクトの作成①start.spring.io暗記しましょう!!!

② 依存関係にEureka Server を追加

③ 作成

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

35

Eureka サービスの設定server.port=8761

Application.properties の編集

@EnableEurekaServer を追記

Eureka のデフォルトのポート番号

@EnableEurekaServer@SpringBootApplicationpublic class EurekaApplication {

//…

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

36

Eureka サービスの起動STS の Bashboard から Spring Boot アプリ起動

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

37

Eureka サービスの起動確認ブラウザで http://localshot:8761にアクセス

Eureka のダッシュボード登録されているサービスを確認できる

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

38

1. @EnableEurekaService で Eureka サービス作成

2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散

多重化を実現する 3 ステップ

りんご

ペンUhクライアント

Eurekaサービ

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

39

Eureka クライアントの作成

Eureka Discovery を選択

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

40

ソースファイルの編集@SpringBootApplication@EnableEurekaClient@RestControllerpublic class AppleApplication {{

//…

@EnableEurekaClient を追記

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

41

設定ファイルの編集

server.port=8002spring.application.name=appleeureka.client.serviceUrl.defaultZone=

http://localhost:8761/eureka/

① 起動ポート

③ 登録先の Eureka サービス

② アプリ名

application.properties の編集

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

42

Eureka クライアントの起動起動するとダッシュボードに登録されている

サーバー名とポート番号

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

43

Eureka クライアントの複数起動

同じアプリ名で複数起動すると多重度が上がる

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

44

1. @EnableEurekaService で Eureka サービス作成

2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散

多重化を実現する 3 ステップ

りんご

ペンUhクライアント

Eurekaサービ

スりんご

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

45

「 Uh 」サービスの作成

Ribbon を追加

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

46

ロードバランシングの有効化

@LoadBalanced@BeanRestTemplate restTemplate() {

return new RestTemplate();}

この RestTemplate を介して負荷分散される

@LoadBlanced を追記

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

47

「 Uh 」の処理の実装@GetMapping("/")public String getValue() { return restTemplate. getForObject( "http://apple", String.class) + " "+ restTemplate. getForObject( "http://pen", String.class);

アプリ名で名前解決

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

48

1. @EnableEurekaService で Eureka サービス作成

2. @EnableEurekaClient でサービス登録3. @LoadBalanced で負荷分散

多重化を実現する 3 ステップ

りんご

ペンUhクライアント

Eurekaサービ

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

Circuit Breaker で障害検知・対応

49

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

50

発生しうる問題一か所の障害でサービス全体が

応答しなくなる可能性

りんご

ペン

クライアント

Eurekaサービ

ス りんごりんご

ペンペンペン

UhUh

障害発生応答しな

他サービスへ

影響

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

51

解決策の一つとして障害時の既定の動作を定義

障害時は既定の動作を呼び出しサービス全体としては継続する枠組みを提供

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

52

Circuit Breaker の仕組み(1/2)

他のサービスの障害を検知

ペン

クライアント

Eurekaサービ

ス りんごりんご

ペンペンペン

りんご

UhUh

応答しないエラーを応答する

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

53

りんごりんご

Circuit Breaker の仕組み(2/2) 障害を検知した場合事前に定義した既定の応答を返す

ペン

クライアント

Eurekaサービ

ペンペンペン

りんご

UhUh

既定の応答を返す

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

実際のコーディング

54

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

55

1. @EnableCircuitBreaker で CircuitBreakerの有効化

2. @HystrixCommand で障害時の既定動作を定義

Circuit Breaker を実現する 2 ステップ

りんご

ペンUhクライアント

Eurekaサービ

ス既定の応答

を返す

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

56

1. @EnableCircuitBreaker で CircuitBreakerの有効化

2. @HystrixCommand で障害時の既定動作を定義

Circuit Breaker を実現する 2 ステップ

りんご

ペンUhクライアント

Eurekaサービ

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

57

Hystrix への依存性を追加

Hystrix を追加

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

58

CircuitBreaker の有効化

@EnableCircuitBreaker@EnableEurekaClient@RestController@SpringBootApplicationpublic class UhApplication {

@EnableCircuitBreaker を追記

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

59

1. @EnableCircuitBreaker で CircuitBreakerの有効化

2. @HystrixCommand で障害時の既定動作を定義

Circuit Breaker を実現する 2 ステップ

りんご

ペンUhクライアント

Eurekaサービ

ス既定の応答

を返す

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

60

障害時の既定の動作の指定

@GetMapping("/") @HystrixCommand(fallbackMethod = "returnDefaultValue")public String getValue() {

@ HystrixCommand のfallbackMethod属性に障害時の呼ばれるメソッドを指定

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

61

1. @EnableCircuitBreaker で CircuitBreakerの有効化

2. @HystrixCommand で障害時の既定動作を定義

Circuit Breaker を実現する 2 ステップ

りんご

ペンUhクライアント

Eurekaサービ

ス既定の応答

を返す

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

Config Server で設定情報の集中管理

62

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

63

りんご

発生しうる問題サービスの数だけ設定ファイルが存在設定変更が大変、不整合の恐れあり

ペンUhクライアント

Eurekaサービ

スりんごりんご

Uh ペンペンペンペン

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

64

解決策の一つとして設定ファイルの集中管理

設定ファイルを集中管理して各サービスの設定値を更新する仕組みを提供

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

65

Configサービ

設定情報の集中管理git で設定ファイルの保管

Config サービスで設定ファイルの取次

りんご

ペンUhクライア

ント

Eurekaサービ

りんごりんご

ペンペンペンペンUh

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

66

設定情報集中管理の仕組み (1/2)各サービスは起動すると

Config サービスにアクセス

りんご

ペンUhクライア

ント

Eurekaサービ

りんご

ペンペンペンペンUh

りんごConfigサービ

スパラメータとして、・自分のアプリ名・ profile 名 ( デプロイ環境指定のため )を渡す

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

67

設定情報集中管理の仕組み (2/2)Config サービスは git から設定情報取得

要求元に返して適用

りんご

ペンUhクライア

ント

Eurekaサービ

りんご

ペンペンペンペンUh

りんごConfigサービ

ス①設定情報の取得

③適用②送付

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

68

設定情報の更新設定の更新時でも再デプロイせずに

サービス断続最小限で設定更新することも可能

りんご

ペンUhクライア

ント

Eurekaサービ

りんご

ペンペンペンペンUh

りんご

管理者Configサービ

①更新

②Refresh 要求

③設定の再取得

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

実際のコーディング

69

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

70

1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成

設定集中管理を実現する 2 ステップ

Configサービ

スりんご

Uhクライアント

Eurekaサービ

ペン

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

71

Configサービ

1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成

設定集中管理を実現する 2 ステップ

りんご

Uhクライアント

Eurekaサービ

ペン

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

72

Config サービスプロジェクトの作成

Config Server の追加

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

73

Git レポジトリの指定server.port=8888spring.cloud.config.server.git.uri=http://localhost/git/root/config-files.git

application.properties の編集

任意の Git のアドレスを指定

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

74

Git レポジトリへ設定ファイルをPUSHアプリ名 .properties で設定ファイルを登録

設定値例message=apple

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

75

Config サービス経由で値取得

Config サービスから設定値が取得可能

http://[Config サービスの URI]/ アプリ名 /default

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

76

1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成

設定集中管理を実現する 2 ステップ

りんご

Uhクライアント

Eurekaサービ

Configサービ

ペン

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

77

Config クライアントの設定

Config ClientActuator

の追加

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

78

Config サービスの指定

spring.cloud.config.uri=http://localhost:8888

application.properties の編集

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

79

Actuator 経由で環境変数の確認http://[ サービス名 ]/env にアクセスしてサービスの環境変数を取得する

Config サーバーから

設定値が反映されmessega=apple

となっている

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

80

サービス内で設定値の利用@Value("${message}")private String message;

@Value アノテーションで値が注入される

@GetMapping("/")public String getValue() {

return message;}

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

81

1. @EnableConfigService で Config サービス作成2. @EnableConfigClient で Config クライアント作成

設定集中管理を実現する 2 ステップ

Configサービ

スりんご

Uhクライアント

Eurekaサービ

ペン

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

Spring Cloud を使ってみて感じた疑問

82

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

83

このパートでは、 Spring Cloud を使って感じた疑問とその考えについて

4 つを説明します

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

84

•問題• Single point of failure

•実際には、 LB の後に複数の Config インスタンスをおく場合が多い

1. 設定を集約管理して信頼性は大丈夫?必要に応じて冗長化の必要がある

事象 対処性能がたりない 冗長化

オペミス 運用ルール

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

85

•Eureka 同士の間に、お互い登録し、常に情報共有をしている•障害時、 Eureka 同士が持ってる情報がずれている場合がある

2. Eureka 冗長化の考え方Availability  >  Consistency( 可用性 )        ( 整合性 )

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

• 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へ

問合せ

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

87

4. Eureka と DNS どう違う ?DNS より、 Service Registry と負荷分散が

簡単にできること

初期手間 負荷分散

Eureka Annotation

Annotation

DNS 事前登録 設定必要

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

88

疑問部のまとめSpring Cloud は入門は簡単だが

深く考えるといろいろなパターンがあって奥が深く、興味深い

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

おわりに

89

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

90

本セッションではSpring Cloud の基礎に絞って解説しまし

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

91

JSUG では Spring Cloud の応用についてはもちろんのこと

様々な Spring 技術の勉強会を行っています

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

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

関連テーマ

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

93

今年も Spring Day やります!Spring Day 2017 は

10月中旬(平日)を予定しています

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

Thank you!