Spring Boot + Netflix Eureka

83
Spring Boot + Netflix Eureka ~ Microservices時代のサービスディスカバリ Acroquest Technology株式会社 谷本 心 ( @cero_t )

Transcript of Spring Boot + Netflix Eureka

Spring Boot +Netflix Eureka

~ Microservices時代のサービスディスカバリ

Acroquest Technology株式会社 谷本 心 ( @cero_t )

Microservices

MicroservicesOriented

Architecture

MicroservicesOriented

Architecture

MOAMETAL

いいとして

今日のテーマ

そっちじゃなくて💢

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/HWLB

自前実装LB

開発工数 なし 大

費用 サービス数と比例

サービス数に影響せず

でも自作LBは地雷

そう、そこで

今日は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

複数台もOKWeb/AP

Service

Eureka1. サービス起動時に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 + RibbonHystrix

Spring Cloud Netflixの把握:1日

https://github.com/making/jjugccc-handson/

既存プロジェクトへのEureka + Ribbonの展開:1人日

Spring Cloud Netflixまじ有用

今すぐ使おうNetflix!

なお、僕は hulu派です

以上!