はじめに
以下のサイトに書いてある内容を勉強した時のメモです。
Eureka Client
設定項目
基本的には設定はほとんどいらない。
gradle等でspring-cloud-starter-netflix-eureka-client
が依存関係に含まれていれば
AutoConfigureが動作し、設定してくれる
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サーバーを指定する
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);
}
}
server:
port: 8761
起動するとhttp://localhost:8761
にアクセスすることで管理コンソールが開くようになっている
application.ymlでeureka.client.serviceUrl.defaultZone
にこのサーバーを指定しているクライアントがあり、
それが起動している場合コンソールに表示される
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の設定をしたい場合は以下のようにする
@Configuration
@RibbonClient(name = "custom", configuration = CustomConfiguration.class )
public class RibbonConfiguration {
}
CustomConfigurationの内容はRibbonClientConfiguration
で設定された内容に上書きされる
他にもRibbonに関する設定内容は以下のBeanを設定することで上書きすることができる
↓以下のような感じ
@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を使う
@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クラスに適用することで有効になる
@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
application.ymlでルーティングができる
以下の例はXXX/apples/**で来たリクエストをappleにfowardするという指定
zuul:
routes:
apple: /apples/**
参考サイト
Spring Boot 2.0でSpring Cloud Netflix -Hystrix編-
Spring特別勉強会レポート(後編)