Spring Cloud Netflix メモ


## はじめに

以下のサイトに書いてある内容を勉強した時のメモです。

[Spring Cloud Netflix](https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.M1/single/spring-cloud-netflix.html)

## Eureka Client
### 設定項目
基本的には設定はほとんどいらない。
gradle等で`spring-cloud-starter-netflix-eureka-client`が依存関係に含まれていれば
AutoConfigureが動作し、設定してくれる

```gradle:build.gradle(dependenciesのみ抜粋)
dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web')
	implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}
```

Eurekaサーバーを指定する

```yaml:application.yml
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
```

また、アプリケーション名は`spring.application.name`が使用される。
上記以外は基本的にはdefaultでOK
変えたい場合は以下でデフォルト値が設定されているので要カスタマイズ(application.ymlで設定する場合は`eureka.instance.*`に指定)

- EurekaClientConfigBean
- EurekaInstanceConfigBean


## Eureka Server

依存関係に`spring-cloud-starter-netflix-eureka-server`を追加
@EnableEurekaServerを指定することでAutoConfigureが動作する

```
@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}
```

```yaml:application.yml
server:
  port: 8761
```
起動すると`http://localhost:8761`にアクセスすることで管理コンソールが開くようになっている
application.ymlで`eureka.client.serviceUrl.defaultZone`にこのサーバーを指定しているクライアントがあり、
それが起動している場合コンソールに表示される

![ass.JPG](https://qiita-image-store.s3.amazonaws.com/0/112584/32126ad4-d190-7069-410d-aae9f869cee0.jpeg)




## Ribbon
HTTPおよびTCP上で動作するクライアントロードバランサー
クライアントがクライアントをコールする際等に使用する
それぞれのRibbonは名前を持っており`RibbonClientConfiguration`で設定される
Ribbon を使うと http://hoge-service/api のように、サービス名を直接URLに指定できるようになります。
Ribbon を導入することで、 Spring の REST API である RestTemplateにサービス名のURLを記述可能になります。


### 使用方法
`org.springframework.cloud:spring-cloud-starter-netflix-ribbon`を依存関係に追加


RibbonClientの設定をしたい場合は以下のようにする

```java
@Configuration
@RibbonClient(name = "custom", configuration = CustomConfiguration.class )
public class RibbonConfiguration {

}
```
CustomConfigurationの内容は`RibbonClientConfiguration`で設定された内容に上書きされる
他にもRibbonに関する設定内容は以下のBeanを設定することで上書きすることができる

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/112584/9422bba0-d020-383d-2d02-5a9b171cc2c4.jpeg)

↓以下のような感じ

```java
@Configuration
protected static class FooConfiguration {
	@Bean
	public ZonePreferenceServerListFilter serverListFilter() {
		ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
		filter.setZone("myTestZone");
		return filter;
	}

	@Bean
	public IPing ribbonPing() {
		return new PingUrl();
	}
}
```

全てのRibbonClientに対してdefaultの設定をしたければ
defaultConfigurationを使う

```java

@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {

	public static class BazServiceList extends ConfigurationBasedServerList {
		public BazServiceList(IClientConfig config) {
			super.initWithNiwsConfig(config);
		}
	}
}

@Configuration
class DefaultRibbonConfig {

	@Bean
	public IRule ribbonRule() {
		return new BestAvailableRule();
	}

	@Bean
	public IPing ribbonPing() {
		return new PingUrl();
	}

	@Bean
	public ServerList<Server> ribbonServerList(IClientConfig config) {
		return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config);
	}

	@Bean
	public ServerListSubsetFilter serverListFilter() {
		ServerListSubsetFilter filter = new ServerListSubsetFilter();
		return filter;
	}

}

```

**Eurekaは上記の設定を上書きしたRibbonを使ってClientの情報を管理している**

## Zuul
Zuul は 各サービスとクライアントの間に立ちシステムの門番のような働きをするエッジサービスという位置づけのライブラリ
用途として、サービスを呼び出す前のセキュリティチェックやデータ変換、シングルサインオン、 URL書き換えといった様々なものがある
リバースプロキシ的な役割として使えるのでZuulを適用しているサービスのみを外部に公開することで
他サービスへの直接アクセスを防ぐことできる

### 使い方
`org.springframework.cloud:spring-cloud-starter-netflix-zuul`を依存関係に追加
@EnableZuulProxyをSpringBootのmainクラスに適用することで有効になる

```java
@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

application.ymlでルーティングができる
以下の例はXXX/apples/**で来たリクエストをappleにfowardするという指定

```yaml:application.yml
zuul:
  routes:
    apple: /apples/**
```


## 参考サイト
[Spring Boot 2.0でSpring Cloud Netflix -Hystrix編-](https://qiita.com/suke_masa/items/e33fc90a1a0fd39a60ec)
[Spring特別勉強会レポート(後編)](http://enterprisegeeks.hatenablog.com/entry/2015/11/02/000000)