SlideShare a Scribd company logo
Spring Boot +

Netflix Eureka
∼ Microservices時代のサービスディスカバリ
Acroquest Technology株式会社

谷本 心 ( @cero_t )
Microservices
Microservices

Oriented

Architecture
Microservices

Oriented

Architecture
MOAMETAL
いいとして
今日のテーマ
Spring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
そっちじゃなくて💢
Netflix OSS
いまOSS界隈で

一番アツいやつ
Netflixのgithubリポジトリは
Web技術の百貨店だった
http://d.hatena.ne.jp/LaclefYoshi

/20150719/netflix_github
eureka : サービスディスカバリ

ribbon : ロードバランシング
Hystrix : サーキットブレイカー
govenator : Google Guice拡張

feign : 宣言的HTTPクライアント
vector : リソース監視&可視化

SimianArmy : AWSのサーバを落とす
…
eureka : サービスディスカバリ

ribbon : ロードバランシング
Hystrix : サーキットブレイカー
govenator : Google Guice拡張

feign : 宣言的HTTPクライアント
vector : リソース監視&可視化

SimianArmy : AWSのサーバを落とす
…
Eurekaという名の

サービスディスカバリ
NGワード:

エウレカセブン
僕らのユリイカ
禁断の地@FF3
アルキメデス
いいとして(再)
まずは、経緯。
Web/AP
DB
1台構成
Web/AP
DB
2台構成
Web/AP
Web/AP
DB
2台構成
Web/AP
LB
Web/AP
DB
サービス2層構成
Web/AP
LB
Service Service
Web/AP
DB
サービス2層構成
Web/AP
LB
Service Service
LB
Web/AP
DB
SOA/MOA
Web/AP
LB
Service1 Service1
LB
Service2 Service2
LB
Service3 Service3
LB
内部DNS
サービスの数だけ

サーバがある
サービスの数だけ

LBがある
もうちょっと

絞りたいよね
1台のサーバに

複数サービスを

同居させてはどうか?
観点
1サービス

1サーバ
複数サービス

1サーバ
URLの

構成要素
IPアドレス
IPアドレス + 

ポート番号
サーバ台数
サービス数

* 冗長数
冗長数∼
台数は減らせるけど

ポート番号まで含めて

管理するのは面倒
そもそもAWSの

オートスケーリングで

IPアドレスが変わると

動かなくなる
という話は

少し置いといて
LBも減らしたいよね
SW/HW

LB
自前実装

LB
開発工数 なし 大
費用
サービス数と

比例
サービス数に

影響せず
でも

自作LBは地雷
そう、そこで
Spring Boot + Netflix Eureka
今日はNetflixって

言ってるでしょ💢
Eureka
平たく言えば

内部DNSの代わり
内部DNSの場合
Web/AP
Service
内部DNS
1. 事前にIPを登録

hoge1.internal = 192.168.0.1
2. 呼び出し時に参照
3. 呼び出し

http://hoge1.internal:8081/hoge
Eurekaの場合
Web/AP
Service
Eureka
1. サービス起動時に

IPとPortを登録

hoge-service = 192.168.0.1:8081
2. 呼び出し時に参照

getNextServerFromEureka( hoge-service )
3. 呼び出し

http://2の戻り値/hoge
OK、理屈は分かった
でも、自前でEurekaに

アドレスを取りに行く

コード書かなきゃ

いけないじゃん?
それだったら

DNSの方が楽じゃない?
あと

ロードバランシングも

自前でやるの?

それとも毎回Eurekaに

問い合わせるの?
そこで、

Ribbon
説明が難しいんだけど

Eurekaと協調して

ロードバランシングする

仕組み
Ribbonを使った場合
Web/AP
Service
Eureka
1. サービス起動時に

IPとPortを登録

hoge-service = 192.168.0.1:8081
2. Ribbonが参照
3. 呼び出し

http://hoge-service/hoge
4. Ribbonが変換

http://192.168.0.1:8081/hoge
ServiceService
複数台もOK
Web/AP
Service
Eureka
1. サービス起動時に

IPとPortを登録

hoge-service = 192.168.0.1:8081
hoge-service = 192.168.0.2:8081
hoge-service = 192.168.0.3:8082
2. Ribbonが参照
3. 呼び出し

http://hoge-service/hoge
4. Ribbonが変換

http://192.168.0.2:8082/hoge
変換後のアドレスは
アクセスごとに変わる
これらを使うと
Web/AP
DB
これが
Web/AP
LB
Service1 Service1
LB
Service2 Service2
LB
Service3 Service3
LB
内部DNS
Web/AP
DB
こうなる
Web/AP
LB
Service1Service1
Service2 Service3
Eureka
Service2 Service3
OK、理屈は分かった
※なんということでしょう

とか言わない
でも正味、実装が

面倒そう
わがままばっかり

言うな💢
そこで

Spring Cloud Netflix
Spring Bootで

開発していたら

ほぼ設定だけで利用可能
Spring Bootで

Eurekaを使うための

3ステップ
1. Eurekaサーバを

つくる
@SpringBootApplication
@EnableEurekaServer
public class OreNoEureka {
public static void main(String[] args) {
SpringApplication.run(OreNoEureka.class, args);
}
}
OreNoEureka.java
server.port: 8781
eureka:
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
application.yml
これだけでEurekaの

サーバが動く
2. 呼び出される

サービスの設定を変える
@SpringBootApplication
@EnableEurekaClient
public class OreNoService {
public static void main(String[] args) {
SpringApplication.run(OreNoService.class, args);
}
}
OreNoService.java
spring.application.name: ore-no-service
server.port: 8081
eureka:
client:
serviceUrl.defaultZone: http://localhost:8761/eureka
instance:
hostname: localhost
application.yml
これだけで起動時に

Eurekaに登録に行く
3. 呼び出す側の

設定を変える
@SpringBootApplication
@EnableEurekaClient
public class OreNoWeb {
public static void main(String[] args) {
SpringApplication.run(OreNoWeb.class, args);
}
}
OreNoWeb.java
public class OreNoWeb {
@Autowired

RestTemplate restTemplate;

// application.ymlに入れるほうがオススメ

String url = "http://ore-no-service/hoge";



public Hoge call() {
restTemplate.getForEntity(url, Hoge.class);
}
}
OreNoWeb.java
spring.application.name: ore-no-web
server.port: 8082
eureka:
client:
serviceUrl.defaultZone: http://localhost:8761/eureka
instance:
hostname: localhost
application.yml
これだけで
RestTemplateが

Ribbonを使って

Eurekaを見に行く
簡単でしょう?
参考:

習得コストと適用コスト
Eureka + Ribbon

Hystrix

Spring Cloud Netflix

の把握:1日
https://github.com

/making/jjugccc-handson/
既存プロジェクトへの

Eureka + Ribbon

の展開:1人日
Spring Cloud Netflix

まじ有用
今すぐ使おう

Netflix!
Spring Boot + Netflix Eureka
なお、僕は
hulu派です
以上!

More Related Content

Spring Boot + Netflix Eureka