#jjug_ccc fall 2014 #ccc_r53 spring bootハンズオン~spring...

31
Java SE 8 JAVA_HOME PATH Maven PATH Git Bash (Windows ) jq ( ) Redis

Upload: toshiaki-maki

Post on 26-Jun-2015

1.001 views

Category:

Software


2 download

DESCRIPTION

JJUG CCC Fall 2014 [R5-3] Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!の手順書です。 講義資料は後日アップロードします。

TRANSCRIPT

Page 1: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

JJUG CCC Fall 2014 [R5‒3] Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書 #jjug̲ccc#ccc̲r53

目次

事前準備

必要なソフトウェアのインストールMavenリポジトリのコピー

演習の全体像

演習1 Spring Bootで「URL短縮サービス」を作る演習プロジェクトの作成・インポート課題1 TODOを埋めてプログラムを完成させてください課題2 Redisを使ってConcurrentHashMap使用部分を書き換えましょう

演習2 Spring Cloud Configで動的コンフィギュレーション演習プロジェクトのインポートGitbucketの起動 & Config Repositoryの作成Config Server起動「URL短縮サービス」向けのコンフィギュレーション作成「URL短縮サービス」(Config Client)の起動課題3 「URL短縮サービス」(Config Client)をRefreshスコープに変更

演習3 Spring Cloud Netflixでマイクロサービスアーキテクチャ構築演習プロジェクトのインポートConfig Serverの起動Service Discovery (Eureka Server)の起動Circuit Breaker Monitor (Hystrix Dashboard)の起動「URL短縮サービス」の起動「URL短縮サービス」UIの起動「URL短縮サービス」のスケールアウト

まとめ

事前準備

必要なソフトウェアのインストール

Mac/Windowsユーザー向けに記述しています。Linuxで実施する場合は同等の手順を実施してください。

Java SE 8

http://www.oracle.com/technetwork/java/javase/downloads/jdk8‒downloads‒2133151.html から Java  SE  DevelopmentKit 8u25 (8以上であればおそらくOK)をダウンロードして、 インストールしてください。

環境変数JAVA_HOMEの設定とPATHの追加を必ず行ってください。

Maven

http://ftp.meisei‒u.ac.jp/mirror/apache/dist/maven/maven‒3/3.2.3/binaries/apache‒maven‒3.2.3‒bin.tar.gz からMavenをダウンロードして、 展開したディレクトリのbinフォルダを環境変数PATHに追加してください。

尚、(ハンズオン資材のルートフォルダ)/software/apache‒maven‒3.2.3‒bin.tar.gzにダウンロード済みです。

Git Bash (Windowsの場合)

Windowsの場合、

http://git‒scm.com/download/winからGitをダウンロードしてインストールしてください。

以下で実行するコマンドは全てGitに付属しているGit Bashを用いて実行してください。

jq (オプション)

必須ではないですが、JSON出力の整形用にhttp://stedolan.github.io/jq/をインストールしておくと良いです。

Redis

Page 2: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

Macの場合は、以下を実行してください。(要:XCode)

$ cd (ハンズオン資材のルートフォルダ)/software/redis-2.8.17$ tar xzvf redis-2.8.17.tar.gz$ cd redis-2.8.17$ make

Windows 64ビットの場合は、(ハンズオン資材のルートフォルダ)/software/redis‒2.8.17/redis‒2.8.17.zipを展開してください。

Windows 32ビットの場合は、(ハンズオン資材のルートフォルダ)/software/redis‒2.8.17/edisbin.zipを展開してください。

Gitbucket

https://github.com/takezoe/gitbucket/releases/download/2.5/gitbucket.war より、Gitbucketをダウンロードしてください。

尚、(ハンズオン資材のルートフォルダ)/software/gitbucket.warにダウンロード済みです。

IntelliJ IDEA

https://www.jetbrains.com/idea/download/ より、IntelliJ IDEA 14のCommunity EditionまたはUltimate Editionをダウンロードしてインストールしてください。

Spring Tool SuiteやEclipseを使用してもハンズオンを実施できますが、ハンズオンの説明はIntelliJ IDEAを用いて行います。

Mavenリポジトリのコピー

ハンズオンはオフライン環境で行います。

必要なライブラリをインターネットからダウンロードせず直接Mavenリポジトリにコピーします。

(ハンズオン資材のルートフォルダ)/repository以下を(ホームディレクトリ)/.m2/repository以下にコピーしてください。

$ cp -rf (ハンズオン資材のルートフォルダ)/repository/* ~/.m2/repository/

overwrite /Users/maki/.m2/repository/antlr/antlr/2.7.2/_maven.repositories? (y/n [n])というように上書きするかどうか聞かれる場合は

$ \cp -rf (ハンズオン資材のルートフォルダ)/repository/* ~/.m2/repository/

を実行してください。

演習の全体像

本演習で「URL短縮サービス」を題材にマイクロサービスアーキテクチャを構築します。

最終的に構築するアーキテクチャを以下に示します。

演習1ではSpring Bootを用いて単一の「URL短縮サービス」を作成します。

Page 3: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

演習2ではSpring Cloud Configを用いて「URL短縮サービス」に動的コンフィギュレーションを追加します。

演習3では「URL短縮サービス」のUIを追加し、Spring Cloud Netflixを用いて「URL短縮サービス」にマイクロサービスアーキテクチャのための様々なパターンを追加します。

Page 4: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

本来は複数のマシンを用いて構築しますが、本演習では1つのマシン上で全てのサービスを起動します。

演習1 Spring Bootで「URL短縮サービス」を作る

演習1ではマイクロサービス界でのFizzBuzz問題である、「URL短縮サービス」を作ります。

課題1でConcurrentHashMapを使った実装。課題2でRedisを使った実装を行います。

インポートするプロジェクトにほとんどのコードが実装されているので、課題で実装するコードはほんの数行です。

演習プロジェクトの作成・インポート

新規プロジェクト作成

IntelliJ IDEAを開いて「New Project」で新規プロジェクトを作成します。 以下のように「Empty Project」を選択してください。

Page 5: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

以下の設定値を入力してください。デフォルト値から変更するので注意してください 。

Project name jjugccc‒handson

Project location (ハンズオン資材のルートフォルダ)/exercise

Page 6: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

「Project Structure」で以下の設定値を入力してください。

Project SDK 1.8

Project language level 8

JDKが未設定の場合は、「New」を押してJDKを設定してください。JAVA̲HOMEに相当するフォルダを選択すれば良いです。

演習プロジェクトのインポート

「File」‒>「Import Module」で演習プロジェクトをインポートします。

「(ハンズオン資材のルートフォルダ)/exercise/01‒urlshortener」を選択してください。

Page 7: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

「Import module from external model」で「Maven」を指定してください。

「Search for projects recursively」と「Import Maven projects automatically」にチェックを入れて、次に進んでください。

「Next」を繰り返すと、以下のように演習1用のMavenプロジェクトがインポートされます。

Page 8: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

課題1 TODOを埋めてプログラムを完成させてください

demo.UrlShortenerを編集してください。

以下TODO部分を埋めてください。

@RequestMapping(value = "/", method = RequestMethod.POST)ResponseEntity<String> save(@RequestParam String url) { if (urlValidator.isValid(url)) { String hash = ""/* TODO (1) URLをハッシュ化。ハッシュアルゴリズムには 32-bit murmur3 algorithm を使用する。 */; // ヒント: com.google.common.hash.Hashing.murmur3_32()を使う // TODO (2) urlMapにhashに紐づくURLを追加する。 return new ResponseEntity<>(urlShortenUrl + "/" + hash, HttpStatus.OK); } else { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); }}

UrlShortenerクラスを右クリックして、Run UrlShortener.main()をクリックしてください。

以下のようにも実行できます。

$ cd (ハンズオン資材のルートフォルダ)/exercise/01-urlshortener$ mvn spring-boot:run -f urlshortener/pom.xml

以下の結果が返るか確認してください。

Page 9: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

$ curl -X POST http://localhost:8080 -d "url=http://google.com"http://localhost:8080/58f3ae21$ curl -X GET http://localhost:8080/58f3ae21http://google.com

UrlShortenerTestクラスを右クリックして、Run UrlShortenerTestをクリックしてください。

テストが成功したら課題1は完了です。

テストは以下のようにも実行できます。

$ mvn test -f urlshortener/pom.xml

課題2 Redisを使ってConcurrentHashMap使用部分を書き換えましょう

次にConcurrentHashMap の部分をRedisを使用するように書き換えます。 Spring BootによるAutoconfigurationでいかに簡単にRedis (Spring Data Redis)を使用できるか体験します。

Redisの起動

Macの場合

Page 10: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

Windowsの場合、redis‒server.exeを実行してください。

ソースコードの修正

以下の3カ所を書き換えてください。

final ConcurrentHashMap<String, String> urlMap = new ConcurrentHashMap<>();// ↓@Autowired StringRedisTemplate redisTemplate;

に書き換えてください。

urlMap.putIfAbsent(hash, url);// ↓redisTemplate.opsForValue().set(hash, url);

に書き換えてください。

String url = urlMap.get(hash);// ↓String url = redisTemplate.opsForValue().get(hash);

に書き換えてください。

書き換えた後に、課題1同様にテストが通れば課題2も完了です。

起動したアプリケーションは終了しておいてください。Redisは起動したままにしてください。

演習2 Spring Cloud Configで動的コンフィギュレーション

演習2ではSpring Cloud Configを使った動的コンフィギュレーションを体験します。

演習2で扱うシステムのアーキテクチャ図を以下に示します。

$ cd (ハンズオン資材のルートフォルダ)/software/redis-2.8.17$ ./src/redis-server[34286] 09 Nov 05:27:07.455 # Warning: no config file specified, using the default config. In order to specify a config file use ./src/redis-server /path/to/redis.conf[34286] 09 Nov 05:27:07.457 * Increased maximum number of open files to 10032 (it was originally set to 2560). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 2.8.17 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 34286 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'

[34286] 09 Nov 05:27:07.465 # Server started, Redis version 2.8.17[34286] 09 Nov 05:27:07.466 * DB loaded from disk: 0.001 seconds[34286] 09 Nov 05:27:07.466 * The server is now ready to accept connections on port 6379

Page 11: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

Config Clientとして演習1で作成した「URL短縮サービス」を使用し、Config Server(作成済み)から設定を取得します。

Config ServerはデフォルトでGithubに接続しますが、今回はオフライン環境で実施するため、ローカルに立ち上げたGitbucketを使用します。

演習プロジェクトのインポート

「File」‒>「Import Module」で演習プロジェクトをインポートします。 「(ハンズオン資材のルートフォルダ)/exercise/02‒distributed‒config」を選択してください。

configserverはConfig Serverを設定したプロジェクトです。urlshortenerは演習1にConfig Clientの依存関係を追加したプロジェクトです。

どちらも既に設定済みで、新規にコーディングする必要はありません。

Gitbucketの起動 & Config Repositoryの作成

Gibucketを起動しましょう。8080番ポートを使用するので、このポートを使用しているアプリがあれば終了してください。

$ cd (ハンズオン資材のルートフォルダ)/software$ java -jar gitbucket.war

http://localhost:8080にアクセスしユーザー名/パスワードともに「root」でログインしてください。

Page 12: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

右上のメニューから「New repository」をクリックしてください。

Repository nameに「config‒repo」を入力し、「Initialize this repository with a README」にチェックを入れ、「Createrepository」をクリックしてください。

Page 13: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

これでConfig Respositoryが作成できました。

動作確認用のコンフィギュレーションを作成しましょう。レポジトリ名の右に「+」マークをクリックしてください。

ファイル名を「foo.properties」にし、以下の内容を記入し、「Commit changes」をクリックしてください。

foo: 123456bar: abcdef

Page 14: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

もう一つファイルを作成します。  ファイル名を「foo‒development.properties」にし、以下の内容を記入し、「Commitchanges」をクリックしてください。

foo: Hello!

Config Server起動

「configserver」のbootstrap.ymlに以下の設定が行われていることを確認してください。

spring.cloud.config.server.uri: http://localhost:8080/git/root/config-repo.git

以下のコマンドでConfig Serverを起動してください。

$ cd (ハンズオン資材のルートフォルダ)/exercise/02-distributed-config$ mvn spring-boot:run -f configserver/pom.xml

動作確認しましょう。

$ curl http://localhost:8888/admin/env

以下ではjqを使って整形した結果を示します。

Page 15: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

$ curl http://localhost:8888/admin/env | jq .{ "defaultProperties": { "spring.config.name": "configserver" }, "applicationConfig: [classpath:/bootstrap.yml]": { "spring.cloud.config.server.uri": "http://localhost:8080/git/root/config-repo.git" }, "applicationConfig: [classpath:/configserver.yml]": { "management.context_path": "/admin", "spring.application.name": "configserver", "server.port": 8888, "info.component": "Config Server", "spring.jmx.default_domain": "cloud.config.server" }, // ... 省略}

spring.cloud.config.server.uriが反映されていることを確認してください。

次にコンフィギュレーションを取得します。app名はfoo、profile名はdefaultにします。

$ curl http://localhost:8888/foo/default

以下ではjqを使って整形した結果を示します。

$ curl http://localhost:8888/foo/default | jq .{ "propertySources": [ { "source": { "foo": "123456", "bar": "abcdef" }, "name": "http://localhost:8080/git/root/config-repo.git/foo.properties" } ], "label": "master", "name": "default"}

次にprofileを変更して取得しましょう。

$ curl http://localhost:8888/foo/development

以下ではjqを使って整形した結果を示します。

$ curl http://localhost:8888/foo/development | jq .{ "propertySources": [ { "source": { "foo": "Hello!" }, "name": "http://localhost:8080/git/root/config-repo.git/foo-development.properties" }, { "source": { "foo": "123456", "bar": "abcdef" }, "name": "http://localhost:8080/git/root/config-repo.git/foo.properties" } ], "label": "master", "name": "development"}

foo-development.propertiesで上書きしていることが分かります。

「URL短縮サービス」向けのコンフィギュレーション作成

同様に、URL短縮サービス向けのコンフィギュレーションを「urlshortener.yml」に作成します。設定内容は以下の通りです。

urlshorten: url: http://localhost:${server.port}spring: redis: host: localhost # server host password: # server password port: 6379 # connection port pool: max-idle: 8 # pool settings ... min-idle: 0

Page 16: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

max-active: 8 max-wait: -1endpoints.restart: enabled: true

動作確認しましょう。(Config Serverの再起動は不要です)

$ curl http://localhost:8888/urlshortener/default

以下ではjqを使って整形した結果を示します。

$ curl http://localhost:8888/urlshortener/default | jq .{ "propertySources": [ { "source": { "spring.redis.pool.max-idle": 8, "spring.redis.password": "", "spring.redis.host": "localhost", "spring.redis.port": 6379, "urlshorten.url": "http://localhost:${server.port}", "endpoints.restart.enabled": true, "spring.redis.pool.max-active": 8, "spring.redis.pool.min-idle": 0, "spring.redis.pool.max-wait": -1 }, "name": "http://localhost:8080/git/root/config-repo.git/urlshortener.yml" } ], "label": "master", "name": "default"}

Git上の変更が即反映されています。

「URL短縮サービス」(Config Client)の起動

次にConfig Clientとして、「URL短縮サービス」を起動します。

インポートしたプロジェクト(exercise/02‒distributed‒config/urlshortener)のpom.xmlに以下の依存関係が追加されていることを確認してください。

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>

また、urlshortenerのbootstrap.ymlに

Page 17: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

spring: application: name: urlshortener

が設定されていることを確認してください。

「URL短縮サービス」を起動しましょう。8080番ポートは既に起動しているので、プログラム引数に --server.port=8081 をつけて8081番ポートで起動します。

$ cd (ハンズオン資材のルートフォルダ)/exercise/02-distributed-config$ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments="--server.port=8081"

演習1同様に以下のリクエストを送ってください。(ポート名が変更されていることに気をつけてください)

$ curl -X POST http://localhost:8081 -d "url=http://google.com"http://localhost:8081/58f3ae21$ curl -X GET http://localhost:8081/58f3ae21http://google.com

次にConfig Server(urlshortener.yml)の値を変えましょう。

http://localhost:8080/root/config‒repo/blob/master/urlshortener.yml にアクセスし、「Edit」ボタンをクリックしてください。

urlshorten.urlをhttp://localhost:9999に変更して「Commit changes」をクリックしてください。(この設定は演習3で使用します)。

Page 18: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

変更を反映する前に、Config Client上のプロパティを確認しましょう。

$ curl -X GET http://localhost:8081/env/urlshorten.urlhttp://localhost:8081

次にConfig Clientをrefreshします。

$ curl -X POST http://localhost:8081/refresh["urlshorten.url"]$ curl -X GET http://localhost:8081/env/urlshorten.urlhttp://localhost:9999

変更が反映されました。しかし、以下の通りDI済みのプロパティに再DIはされていません。

$ curl -X POST http://localhost:8081 -d "url=http://google.com"http://localhost:8081/58f3ae21

今度はConfig Clientをrestartします。

$ curl -X POST http://localhost:8081/restart{"message":"Restarting"}

restart後は、最新のプロパティで再DIされていることがわかります。

$ curl -X POST http://localhost:8081 -d "url=http://google.com"http://localhost:9999/58f3ae21

課題3 「URL短縮サービス」(Config Client)をRefreshスコープに変更

「URL短縮サービス(UrlShortener クラス)」へのプロパティインジェクション反映をrefreshで行えるように、 UrlShortener クラスをRefreshスコープに変更してください。

@EnableAutoConfiguration@ComponentScan@RestController@RefreshScope // ここを追加public class UrlShortener { // 略}

mvn spring-boot:runで起動した「URL短縮サービス」をCtrl+Cで終了して、再度実行してください。

$ mvn spring-boot:run -f urlshortener/pom.xml -Drun.arguments="--server.port=8081"

今回は以下のようにEnvエンドポイントにPOSTすることでコンフィギュレーションを変更しましょう。

$ curl -X POST http://localhost:8081/env -d urlshorten.url=http://127.0.0.1:9999{"urlshorten.url":"http://127.0.0.1:9999"}

Page 19: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

再度、refreshを行い、もう一度「URL短縮サービス」へリクエストを送りましょう。

$ curl -X POST http://localhost:8081/refresh[]$ curl -X POST http://localhost:8081 -d "url=http://google.com"http://127.0.0.1:9999/58f3ae21

restartすることなく、アプリケーションにプロパティが反映されたことがわかります。

Config Server、Config ClientともにCtrl+Cで終了してください。(Gitbucket, Redisは起動したままにしてください。)

演習3 Spring Cloud Netflixでマイクロサービスアーキテクチャ構築

演習3ではSpring Cloud Netflixを使った様々なパターンを体験します。

演習3で扱うシステムのアーキテクチャ図を以下に示します。

演習プロジェクトのインポート

「File」‒>「Import Module」で演習プロジェクトをインポートします。 「(ハンズオン資材のルートフォルダ)/exercise/03‒netflix」を選択してください。

Page 20: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

configserverはConfig Serverを設定したプロジェクトです。演習2と同じです。eureka‒serverはService DiscoveryであるEurekaを起動するプロジェクトです。ダッシュボードも提供します。hystrix‒dashboardはHystrixのダッシュボードを提供するプロジェクトです。urlshortenerは演習2にConfig Clientの依存関係を追加したプロジェクトです。urlshortener‒uiは「URL短縮サービス」の画面です。RestClient とClient LoadbalancerのRibboを使ってurlshortenerにアクセスします。

どれも既に設定済みで、新規にコーディングする必要はありません。上から順番に起動します。

演習2で起動したGitbucketが必要ですので、終了してしまった場合は再び実行してください。

Config Serverの起動

演習2同様に、以下のコマンドでConfig Serverを起動してください。

$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix$ mvn spring-boot:run -f configserver/pom.xml

Service Discovery (Eureka Server)の起動

Page 21: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

以下のコマンドでEureka Serverを起動してください。

$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix$ mvn spring-boot:run -f eureka-server/pom.xml

http://localhost:8761/でEureka Serverのダッシュボードにアクセスできます。

現時点ではEureka Serverに登録されているインスタンスはありません。

Circuit Breaker Monitor (Hystrix Dashboard)の起動

Page 22: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

以下のコマンドでHystrix Dashboardを起動してください。

$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix$ mvn spring-boot:run -f hystrix-dashboard/pom.xml

起動後、30秒経ったらEureka Serverのダッシュボードにアクセスしてください。

Hystrix DashboardがEurekaに登録されたことが分かります(アーキテクチャ図に記されていませんが、Circuit Breaker MonitorからService Discoveryへの線相当です)。

ではHystrix Dashboardにアクセスしましょう。http://localhost:7979にアクセスしてください。

Page 23: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

中央の入力フォームにはHystrixを利用したサービスの情報を取得するためのevent streamのURLを指定することで、 そのサービスをモニタリングすることができます。

ま だ Hystrix を 利 用 し た サ ー ビ ス が な い た め 、 こ こ で は デ モ 用 の Mock  Stream を 使 用 し ま

す。http://localhost:7979/mock.streamを入力して、「Monitor Stream」をクリックしてください。

Hystrixのイベントをモニタリングできます。

Page 24: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

後ほど「URL短縮サービス」のevent streamをモニタリングします。

「URL短縮サービス」の起動

次に演習1から使い続けている「URL短縮サービス」を起動します。

後ほどこの「URL短縮サービス」を3台起動します。Eurekaに別hostnameとして認識させるため、あらかじめ/etc/hostsに以下の設定を追加しておきます。

127.0.0.1 urlshortener1 urlshortener2 urlshortener3

尚、演習2のurlshortenに対して、以下の変更を加えています。

UrlShortenerクラスがEurekaのクライアントになるために@EnableEurekaClientを追加しています。

@EnableAutoConfiguration@ComponentScan@RestController@RefreshScope@EnableEurekaClient // 追加public class UrlShortener { // 略}

application.ymlにEurekaに関する情報を追加しています。

eureka:

Page 25: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: hostname: ${APPLICATION_DOMAIN:127.0.0.1} nonSecurePort: ${server.port}

それでは「URL短縮サービス」を起動しましょう。portとEurekaに登録するhostnameを指定します。

$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix$ mvn spring-boot:run -f urlshortener/pom.xml \ -Drun.arguments="--server.port=8081,--eureka.instance.hostname=urlshortener1"

起動後、30秒経ったらEureka Serverのダッシュボードにアクセスしてください。

urlshortenerがEurekaに登録されたことが分かります。

「URL短縮サービス」UIの起動

最後のサービスとして「URL短縮サービス」UIを起動します。

起動する前にUI用のコンフィギュレーションを作成します。

Config Repositoryにアクセスして、urlshortener‒ui.ymlを作成し、以下の内容を記述してください。

urlshorten.api.url: http://urlshortener

Page 26: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

endpoints.restart: enabled: true

UIを9999番ポートで起動します。

$ mvn spring-boot:run -f urlshortener-ui/pom.xml -Drun.arguments="--server.port=9999"

起動後、30秒経ったらEureka Serverのダッシュボードにアクセスしてください。

urlshortener‒uiがEurekaに登録されたことが分かります。

それではhttp://localhost:9999にアクセスしましょう。

Page 27: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

url入力フォームに「http://google.com」を入力して、送信ボタンをクリックしましょう。

バックエンドの「URL短縮サービス」が呼ばれて短縮URLが表示されます。

Page 28: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

表示されたURLをクリックするとhttp://google.comへリダイレクトされます。

urlshorten‒uiではHystrix + Ribbonを使用して、urlshortenのサービスをcallしています。

Hystrixのevent streamはhttp://localhost:9999/hystrix.streamでアクセスできます。

Hystrix Dashboardにhttp://localhost:9999/hystrix.streamを入力してモニタリングしてみましょう。

Page 29: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

UIからサービスを呼び出すとモニタリング画面に反映されます。

「URL短縮サービス」のスケールアウト

Page 30: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

最後に「URL短縮サービス」をあと2インスタンス起動し、Ribbonによるロードバランシングを体験しましょう。

早速、「URL短縮サービス」を起動しましょう。

インスタンス2はport: 8082,hostname: urlshortener2で起動します。

$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix$ mvn spring-boot:run -f urlshortener/pom.xml \ -Drun.arguments="--server.port=8082,--eureka.instance.hostname=urlshortener2"

インスタンス3はport: 8083,hostname: urlshortener3で起動します。

$ cd (ハンズオン資材のルートフォルダ)/exercise/03-netflix$ mvn spring-boot:run -f urlshortener/pom.xml \ -Drun.arguments="--server.port=8083,--eureka.instance.hostname=urlshortener3"

ノード2、ノード3起動後30秒経ったら、Eureka Serverのダッシュボードにアクセスしてください。

urlshortenerサービスに対して3つのインスタンスが登録されました。

UIではRibbonを利用することで、特定のインスタンスにアクセスしているわけではなく、http://urlshortenerというようにサービス名に対してアクセスしており、 ラウンドロビンのロードバランシングが行われます。

いまの作りだと、どのインスタンスでURL短縮が行われているか分からないので、以下のような設定変更を行いましょう。

curl -X POST http://localhost:8081/env -d "urlshorten.url=http://localhost:\${server.port}"curl -X POST http://localhost:8081/refresh

Page 31: #JJUG_CCC Fall 2014 #ccc_r53 Spring Bootハンズオン~Spring Bootで作るマイクロサービスアーキテクチャ!手順書

curl -X POST http://localhost:8082/env -d "urlshorten.url=http://localhost:\${server.port}"curl -X POST http://localhost:8082/refreshcurl -X POST http://localhost:8083/env -d "urlshorten.url=http://localhost:\${server.port}"curl -X POST http://localhost:8083/refresh

これでUIから何度もリクエストを送ると、各インスタンスが順番に使用されていることが分かります。

どれかのインスタンスを落としたり、復旧させたりして何が起こるか試してみてください。

ノート:  単位時間辺りのエラー発生回数がしきい値を超えるとCiruitがOpen状態になり、一定時間ずっとエラーを返すようになります。

まとめ

本演習を通じて以下の内容を学びました。

 演習1ではSpring Bootを使って簡単にマイクロサービスを作成する方法を学びました。また数行でRedisに対応する方法も学びました。演習2ではSpring Cloud Configを使って動的コンフィギュレーションの行い方を学びました。演習3ではSpring Cloud Netflixを使ってマイクロサービスアーキテクチャにおけるいくつかのパターンを実現しました。

さらなる学習にはSpring CloudのReferenceを参照してください。