Spring Cloud Commons: 一般的な抽象化

サービスディスカバリ、ロードバランシング、サーキットブレーカーなどのパターンは、実装 (たとえば、Eureka または Consul によるディスカバリ) に関係なく、すべての Spring Cloud クライアントによって使用できる共通の抽象化レイヤーに役立ちます。

@EnableDiscoveryClient アノテーション

Spring Cloud Commons は @EnableDiscoveryClient アノテーションを提供します。これは、META-INF/spring.factories を使用した DiscoveryClient および ReactiveDiscoveryClient インターフェースの実装を探します。検出クライアントの実装では、org.springframework.cloud.client.discovery.EnableDiscoveryClient キーの spring.factories に構成クラスを追加します。DiscoveryClient 実装の例には、Spring Cloud Netflix Eureka (英語) Spring Cloud Consul ディスカバリ (英語) Spring Cloud Zookeeper ディスカバリ (英語) があります。

Spring Cloud は、デフォルトでブロッキングサービスディスカバリクライアントとリアクティブサービスディスカバリクライアントの両方を提供します。spring.cloud.discovery.blocking.enabled=false または spring.cloud.discovery.reactive.enabled=false を設定することで、ブロッキングクライアントやリアクティブクライアントを簡単に無効にすることができます。サービス検出を完全に無効にするには、spring.cloud.discovery.enabled=false を設定するだけです。

デフォルトでは、DiscoveryClient の実装はローカル Spring Boot サーバーを リモート検出サーバーに自動登録します。この動作は、@EnableDiscoveryClient で autoRegister=false を設定することで無効にできます。

@EnableDiscoveryClient は不要になりました。クラスパスに DiscoveryClient 実装を配置して、Spring Boot アプリケーションをサービス検出サーバーに登録させることができます。

ヘルスインジケーター

Commons は、次の Spring Boot ヘルスインジケーターを自動構成します。

DiscoveryClientHealthIndicator

この正常性インジケーターは、現在登録されている DiscoveryClient 実装に基づいています。

  • 完全に無効にするには、spring.cloud.discovery.client.health-indicator.enabled=false を設定します。

  • 説明フィールドを無効にするには、spring.cloud.discovery.client.health-indicator.include-description=false を設定します。そうしないと、ロールアップされた HealthIndicator の description としてバブルアップする可能性があります。

  • サービスの取得を無効にするには、spring.cloud.discovery.client.health-indicator.use-services-query=false を設定します。デフォルトでは、インジケーターはクライアントの getServices メソッドを呼び出します。多くのサービスが登録されている デプロイでは、チェックのたびにすべてのサービスを取得するにはコストがかかりすぎる可能性があります。これにより、サービスの取得がスキップされ、代わりにクライアントの probe メソッドが使用されます。

DiscoveryCompositeHealthContributor

この複合ヘルスインジケーターは、登録されているすべての DiscoveryHealthIndicator Bean に基づいています。無効にするには、spring.cloud.discovery.client.composite-indicator.enabled=false を設定します。

DiscoveryClient インスタンスのオーダー

DiscoveryClient インターフェースは Ordered を継承します。これは、Spring アプリケーションによってロードされた Bean を順序付ける方法と同様に、返される検出クライアントの順序を定義できるため、複数の検出クライアントを使用する場合に便利です。デフォルトでは、DiscoveryClient の順序は 0 に設定されます。カスタム DiscoveryClient 実装に別の順序を設定したい場合は、セットアップに適した値を返すように getOrder() メソッドをオーバーライドするだけです。これとは別に、プロパティを使用して、ConsulDiscoveryClientEurekaDiscoveryClientZookeeperDiscoveryClient などの Spring Cloud によって提供される DiscoveryClient 実装の順序を設定できます。これを行うには、spring.cloud.{clientIdentifier}.discovery.order (Eureka の場合は eureka.client.order ) プロパティを目的の値に設定するだけです。

SimpleDiscoveryClient

クラスパスに Service-Registry に基づく DiscoveryClient がない場合は、プロパティを使用してサービスとインスタンスに関する情報を取得する SimpleDiscoveryClient インスタンスが使用されます。

利用可能なインスタンスに関する情報は、プロパティを介して次の形式で渡される必要があります: spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s11:8080、ここで spring.cloud.discovery.client.simple.instances は共通のプレフィックス、service1 は問題のサービスの ID を表し、[0] はインスタンスのインデックス番号を示します (表示されているように) この例では、インデックスは 0 で始まり、uri の値がインスタンスを使用できる実際の URI になります。

ServiceRegistry

Commons は、カスタム登録サービスを提供できる register(Registration) や deregister(Registration) などのメソッドを提供する ServiceRegistry インターフェースを提供するようになりました。Registration はマーカーインターフェースです。

次の例は、ServiceRegistry の使用例を示しています。

@Configuration
@EnableDiscoveryClient(autoRegister=false)
public class MyConfiguration {
    private ServiceRegistry registry;

    public MyConfiguration(ServiceRegistry registry) {
        this.registry = registry;
    }

    // called through some external process, such as an event or a custom actuator endpoint
    public void register() {
        Registration registration = constructRegistration();
        this.registry.register(registration);
    }
}

各 ServiceRegistry 実装には独自の Registry 実装があります。

  • ZookeeperRegistration は ZookeeperServiceRegistry と一緒に使用されます

  • EurekaRegistration は EurekaServiceRegistry と一緒に使用されます

  • ConsulRegistration は ConsulServiceRegistry と一緒に使用されます

ServiceRegistry インターフェースを使用している場合は、使用している ServiceRegistry 実装に正しい Registry 実装を渡す必要があります。

ServiceRegistry 自動登録

デフォルトでは、ServiceRegistry 実装は実行中のサービスを自動登録します。この動作を無効にするには、次のように設定します。* @EnableDiscoveryClient(autoRegister=false) を設定して自動登録を永続的に無効にします。* spring.cloud.service-registry.auto-registration.enabled=false は設定を通じて動作を無効にします。

ServiceRegistry 自動登録イベント

サービスが自動登録されるときに発生するイベントが 2 つあります。InstancePreRegisteredEvent と呼ばれる最初のイベントは、サービスが登録される前に発生します。2 番目のイベントは InstanceRegisteredEvent と呼ばれ、サービスが登録された後に発生します。ApplicationListener を登録して、これらのイベントをリッスンして反応することができます。

spring.cloud.service-registry.auto-registration.enabled プロパティが false に設定されている場合、これらのイベントは発生しません。

サービスレジストリアクチュエーターエンドポイント

Spring Cloud Commons は、/serviceregistry アクチュエーターエンドポイントを提供します。このエンドポイントは、Spring アプリケーションコンテキストの Registration Bean に依存します。GET を使用して /serviceregistry を呼び出すと、Registration のステータスが返されます。JSON 本文を使用して同じエンドポイントに POST を使用すると、現在の Registration のステータスが新しい値に変更されます。JSON 本文には、優先値を含む status フィールドを含める必要があります。ステータスを更新するときに使用できる値と、ステータスに対して返される値については、使用する ServiceRegistry 実装のドキュメントを参照してください。たとえば、Eureka でサポートされるステータスは UPDOWNOUT_OF_SERVICEUNKNOWN です。

LoadBalancer クライアントとしての Spring RestTemplate

ロードバランサークライアントを使用するように RestTemplate を構成できます。負荷分散された RestTemplate を作成するには、次の例に示すように、RestTemplate @Bean を作成し、@LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

public class MyClass {
    @Autowired
    private RestTemplate restTemplate;

    public String doOtherStuff() {
        String result = restTemplate.getForObject("http://stores/stores", String.class);
        return result;
    }
}
RestTemplate Bean は自動構成によって作成されなくなりました。個々のアプリケーションがそれを作成する必要があります。

URI では仮想ホスト名 (つまり、ホスト名ではなくサービス名) を使用する必要があります。BlockingLoadBalancerClient は、完全な物理アドレスを作成するために使用されます。

負荷分散された RestTemplate を使用するには、クラスパスに Spring Cloud LoadBalancer 実装が必要です。Spring Cloud LoadBalancer スターターを使用するには、プロジェクトに追加します。

複数の RestTemplate オブジェクト

負荷分散されていない RestTemplate が必要な場合は、RestTemplate Bean を作成して挿入します。負荷分散された RestTemplate にアクセスするには、次の例に示すように、@Bean の作成時に @LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate loadBalanced() {
        return new RestTemplate();
    }

    @Primary
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

public class MyClass {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    @LoadBalanced
    private RestTemplate loadBalanced;

    public String doOtherStuff() {
        return loadBalanced.getForObject("http://stores/stores", String.class);
    }

    public String doStuff() {
        return restTemplate.getForObject("http://example.com", String.class);
    }
}
前の例では、修飾されていない @Autowired インジェクションを明確にするために、プレーンな RestTemplate 宣言で @Primary アノテーションが使用されていることに注意してください。
java.lang.IllegalArgumentException: Can not set org.springframework.web.client.RestTemplate field com.my.app.Foo.restTemplate to com.sun.proxy.$Proxy89 などのエラーが表示された場合は、RestOperations を挿入するか、spring.aop.proxyTargetClass=true を設定してみてください。

@LoadBalanced RestTemplateBuilder を使用して LoadBalancer クライアントを作成する

RestTemplateBuilder Bean に @LoadBalanced のアノテーションを付けることで、RestTemplate がロードバランサクライアントを使用するように構成することもできます。

import org.springframework.boot.web.client.RestTemplateBuilder;@Configuration
public class MyConfiguration {

    @Bean
	@LoadBalanced
	RestTemplateBuilder loadBalancedRestTemplateBuilder() {
		return new RestTemplateBuilder();
	}
}

public class MyClass {

    private final RestTemplate restTemplate;

	MyClass(@LoadBalanced RestTemplateBuilder restTemplateBuilder) {
		this.restTemplate = restTemplateBuilder.build();
	}

    public String getStores() {
        return restTemplate.getForObject("http://stores/stores", String.class);
    }
}

URI では仮想ホスト名 (つまり、ホスト名ではなくサービス名) を使用する必要があります。BlockingLoadBalancerClient は、完全な物理アドレスを作成するために使用されます。

Spring Boot が RestTemplateBuilder に提供する追加機能 (たとえば、可観測性サポート) を活用するには、@LoadBalanced RestTemplateBuilder Bean の作成時に自動構成された RestTemplateBuilderConfigurer を使用することをお勧めします。

@Configuration
public class MyConfiguration {

	@LoadBalanced
	RestTemplateBuilder loadBalancedRestTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
		return configurer.configure(new RestTemplateBuilder());
	}
}
これを使用するには、プロジェクトに Spring Cloud LoadBalancer スターターを追加します。

複数の RestTemplateBuilder Bean

負荷分散されていない RestTemplateBuilder が必要な場合は、RestTemplateBuilder Bean を作成して挿入します。負荷分散された RestTemplateBuilder にアクセスするには、次の例に示すように、@Bean の作成時に @LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplateBuilder loadBalancedRestTemplateBuilder() {
		return new RestTemplateBuilder();
	}

    @Primary
    @Bean
    RestTemplateBuilder restTemplateBuilder() {
		return new RestTemplateBuilder();
	}
}

public class MyClass {

    @Autowired
    private RestTemplateBuilder restTemplateBuilder;

    @Autowired
    @LoadBalanced
    private RestTemplateBuilder loadBalanced;

    public String doOtherStuff() {
        return loadBalanced.getForObject("http://stores/stores", String.class);
    }

    public String doStuff() {
		return restTemplateBuilder.build().getForObject("http://example.com", String.class);
    }
}
前の例では、修飾されていない @Autowired インジェクションを明確にするために、プレーンな RestTemplateBuilder 宣言で @Primary アノテーションが使用されていることに注意してください。

LoadBalancer クライアントとしての Spring RestClient

ロードバランサークライアントを使用するように RestClient を構成できます。負荷分散された RestClient を作成するには、次の例に示すように、RestClient.Builder @Bean を作成し、@LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestClient.Builder restClientBuilder() {
        return RestClient.builder();
    }
}

public class MyClass {

    @Autowired
    private RestClient.Builder restClientBuilder;

    public String doOtherStuff() {
        return restClientBuilder.build().get().uri(URI.create("http://stores/stores")).retrieve().body(String.class);
    }
}

URI では仮想ホスト名 (つまり、ホスト名ではなくサービス名) を使用する必要があります。BlockingLoadBalancerClient は、完全な物理アドレスを作成するために使用されます。

Spring Boot が RestClient.Builder に提供する追加機能 (たとえば、可観測性サポート) を活用するには、@LoadBalanced RestClient.Builder Bean の作成時に自動構成された RestClientBuilderConfigurer を使用することをお勧めします。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestClient.Builder restClientBuilder(RestClientBuilderConfigurer configurer) {
		return configurer.configure(RestClient.builder());
	}
}
これを使用するには、プロジェクトに Spring Cloud LoadBalancer スターターを追加します。

複数の RestClient.Builder オブジェクト

負荷分散されていない RestClient.Builder が必要な場合は、RestClient.Builder Bean を作成して挿入します。負荷分散された RestClient.Builder にアクセスするには、次の例に示すように、@Bean の作成時に @LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestClient.Builder loadBalanced() {
        return RestClient.builder();
    }

    @Primary
    @Bean
    RestClient.Builder restClientBuilder() {
        return RestClient.builder();
    }
}

public class MyClass {
    @Autowired
    private RestClient.Builder restClientBuilder;

    @Autowired
    @LoadBalanced
    private RestClient.Builder loadBalanced;

    public String doOtherStuff() {
        return loadBalanced.build().get().uri("http://stores/stores")
        				.retrieve().body(String.class);
    }

    public String doStuff() {
        return restClientBuilder.build().get().uri("http://example.com")
        				.retrieve().body(String.class);
    }
}
前の例では、修飾されていない @Autowired インジェクションを明確にするために、プレーンな RestClient.Builder 宣言で @Primary アノテーションが使用されていることに注意してください。

LoadBalancer クライアントとしての Spring WebClient

ロードバランサークライアントを自動的に使用するように WebClient を構成できます。負荷分散された WebClient を作成するには、次のように WebClient.Builder @Bean を作成し、@LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

	@Bean
	@LoadBalanced
	public WebClient.Builder loadBalancedWebClientBuilder() {
		return WebClient.builder();
	}
}

public class MyClass {
    @Autowired
    private WebClient.Builder webClientBuilder;

    public Mono<String> doOtherStuff() {
        return webClientBuilder.build().get().uri("http://stores/stores")
        				.retrieve().bodyToMono(String.class);
    }
}

URI では仮想ホスト名 (つまり、ホスト名ではなくサービス名) を使用する必要があります。Spring Cloud LoadBalancer は、完全な物理アドレスを作成するために使用されます。

Spring Boot が WebClient.Builder に提供する追加機能 (たとえば、可観測性サポート) を活用するには、@LoadBalanced WebClient.Builder Bean を作成するときに、自動構成された WebClientCustomizer Bean を使用することをお勧めします。

@Configuration
public class MyConfiguration {

	@Bean
	@LoadBalanced
	public WebClient.Builder loadBalancedWebClientBuilder(ObjectProvider<WebClientCustomizer> customizerProvider) {
		WebClient.Builder builder = WebClient.builder();
		customizerProvider.orderedStream().forEach((customizer) -> customizer.customize(builder));
		return builder;
	}
}
@LoadBalanced WebClient.Builder を使用する場合は、クラスパスに Spring Cloud LoadBalancer 実装が必要です。Spring Cloud LoadBalancer スターターをプロジェクトに追加することをお勧めします。そしてそに ReactiveLoadBalancer を使用します。

複数の WebClient.Builder オブジェクト

負荷分散されていない WebClient.Buider が必要な場合は、WebClient Bean を作成して挿入します。負荷分散された WebClient.Builder にアクセスするには、次の例に示すように、@Bean の作成時に @LoadBalanced 修飾子を使用します。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    WebClient.Builder loadBalanced() {
        return WebClient.builder();
    }

    @Primary
    @Bean
    WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }
}

public class MyClass {
    @Autowired
    private WebClient.Builder webClientBuilder;

    @Autowired
    @LoadBalanced
    private WebClient.Builder loadBalanced;

    public Mono<String> doOtherStuff() {
        return loadBalanced.build().get().uri("http://stores/stores")
        				.retrieve().bodyToMono(String.class);
    }

    public Mono<String> doStuff() {
        return webClientBuilder.build().get().uri("http://example.com")
        				.retrieve().bodyToMono(String.class);
    }
}

失敗したリクエストの再試行

負荷分散された RestTemplate は、失敗したリクエストを再試行するように構成できます。デフォルトでは、このロジックは無効になっています。非リアクティブバージョン ( RestTemplate を使用) の場合は、アプリケーションのクラスパスに Spring Retry [GitHub] (英語) を追加することで有効にできます。リアクティブバージョン ( WebTestClient を使用) の場合は、spring.cloud.loadbalancer.retry.enabled=true を設定する必要があります。

クラスパス上で Spring Retry または Reactive Retry による再試行ロジックを無効にしたい場合は、spring.cloud.loadbalancer.retry.enabled=false を設定できます。

非リアクティブ実装の場合、再試行で BackOffPolicy を実装したい場合は、LoadBalancedRetryFactory 型の Bean を作成し、createBackOffPolicy() メソッドをオーバーライドする必要があります。

リアクティブ実装の場合は、spring.cloud.loadbalancer.retry.backoff.enabled を false に設定して有効にするだけです。

以下を設定できます。

  • spring.cloud.loadbalancer.retry.maxRetriesOnSameServiceInstance - 同じ ServiceInstance 上でリクエストを何回再試行するかを示します (選択したインスタンスごとに個別にカウントされます)

  • spring.cloud.loadbalancer.retry.maxRetriesOnNextServiceInstance - 新しく選択された ServiceInstance がリクエストを再試行する回数を示します

  • spring.cloud.loadbalancer.retry.retryableStatusCodes - 失敗したリクエストを常に再試行するためのステータスコード。

リアクティブ実装では、さらに以下を設定できます。- spring.cloud.loadbalancer.retry.backoff.minBackoff - 最小バックオフ期間を設定します (デフォルトでは、5 ミリ秒) - spring.cloud.loadbalancer.retry.backoff.maxBackoff - 最大バックオフ期間を設定します (デフォルトでは、ミリ秒の最大長値) - spring.cloud.loadbalancer.retry.backoff.jitter - 使用されるジッタを設定します。各コールの実際のバックオフ期間を計算します (デフォルトでは 0.5)。

リアクティブ実装の場合は、独自の LoadBalancerRetryPolicy を実装して、負荷分散された呼び出しの再試行をより詳細に制御することもできます。

どちらの実装でも、spring.cloud.loadbalancer.[serviceId].retry.retryable-exceptions プロパティに値のリストを追加することで、応答をトリガーする例外を設定することもできます。そうする場合、再試行可能なステータスコードも再試行できるように、提供した例外のリストに RetryableStatusCodeExceptions を必ず追加します。プロパティで例外を指定しない場合、デフォルトで使用される例外は IOExceptionTimeoutExceptionRetryableStatusCodeException です。spring.cloud.loadbalancer.[serviceId].retry.retry-on-all-exceptions を true に設定することで、すべての例外での再試行を有効にすることもできます。

Spring 再試行でブロッキング実装を使用する場合、以前のリリースの動作を保持したい場合は、ブロッキング実装のデフォルトモードとして使用されていた spring.cloud.loadbalancer.[serviceId].retry.retry-on-all-exceptions を true に設定します。
個々のロードバランサークライアントは、プレフィックスが spring.cloud.loadbalancer.clients.<clientId>.* (clientId がロードバランサーの名前) であることを除き、上記と同じプロパティを使用して個別に構成できます。
負荷分散された再試行の場合、デフォルトでは、ServiceInstanceListSupplier Bean を RetryAwareServiceInstanceListSupplier でラップして、以前に選択したインスタンスとは異なるインスタンスを選択します (可能な場合)。この動作を無効にするには、spring.cloud.loadbalancer.retry.avoidPreviousInstance の値を false に設定します。
@Configuration
public class MyConfiguration {
    @Bean
    LoadBalancedRetryFactory retryFactory() {
        return new LoadBalancedRetryFactory() {
            @Override
            public BackOffPolicy createBackOffPolicy(String service) {
        		return new ExponentialBackOffPolicy();
        	}
        };
    }
}

再試行機能に 1 つ以上の RetryListener 実装を追加する場合は、次の例に示すように、型 LoadBalancedRetryListenerFactory の Bean を作成し、特定のサービスに使用する RetryListener 配列を返す必要があります。

@Configuration
public class MyConfiguration {
    @Bean
    LoadBalancedRetryListenerFactory retryListenerFactory() {
        return new LoadBalancedRetryListenerFactory() {
            @Override
            public RetryListener[] createRetryListeners(String service) {
                return new RetryListener[]{new RetryListener() {
                    @Override
                    public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
                        //TODO Do you business...
                        return true;
                    }

                    @Override
                     public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
                        //TODO Do you business...
                    }

                    @Override
                    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
                        //TODO Do you business...
                    }
                }};
            }
        };
    }
}

ロードバランサクライアントとしての Spring WebFlux WebClient 

Spring WebFlux は、以下のトピックに従って、リアクティブ構成と非リアクティブ WebClient 構成の両方で動作できます。

Spring WebFlux WebClient  ReactorLoadBalancerExchangeFilterFunction を使用する場合

ReactiveLoadBalancer を使用するように WebClient を構成できます。Spring Cloud LoadBalancer スターターをプロジェクトに追加し、spring-webflux がクラスパス上にある場合、ReactorLoadBalancerExchangeFilterFunction は自動構成されます。次の例は、リアクティブロードバランサを使用するように WebClient を設定する方法を示しています。

public class MyClass {
    @Autowired
    private ReactorLoadBalancerExchangeFilterFunction lbFunction;

    public Mono<String> doOtherStuff() {
        return WebClient.builder().baseUrl("http://stores")
            .filter(lbFunction)
            .build()
            .get()
            .uri("/stores")
            .retrieve()
            .bodyToMono(String.class);
    }
}

URI では仮想ホスト名 (つまり、ホスト名ではなくサービス名) を使用する必要があります。ReactorLoadBalancer は、完全な物理アドレスを作成するために使用されます。

ノンリアクティブロードバランサクライアントを備えた Spring WebFlux WebClient 

spring-webflux がクラスパス上にある場合、LoadBalancerExchangeFilterFunction は自動構成されます。ただし、これは内部で非リアクティブクライアントを使用することに注意してください。次の例は、ロードバランサを使用するように WebClient を設定する方法を示しています。

public class MyClass {
    @Autowired
    private LoadBalancerExchangeFilterFunction lbFunction;

    public Mono<String> doOtherStuff() {
        return WebClient.builder().baseUrl("http://stores")
            .filter(lbFunction)
            .build()
            .get()
            .uri("/stores")
            .retrieve()
            .bodyToMono(String.class);
    }
}

URI では仮想ホスト名 (つまり、ホスト名ではなくサービス名) を使用する必要があります。LoadBalancerClient は、完全な物理アドレスを作成するために使用されます。

WARN: このアプローチは現在非推奨です。代わりにリアクティブロードバランサを備えた WebFlux を使用することをお勧めします。

ネットワークインターフェースを無視する

場合によっては、特定の名前付きネットワークインターフェースを無視して、サービスディスカバリの登録から除外できると便利です (たとえば、Docker コンテナーで実行している場合)。正規表現のリストを設定して、目的のネットワークインターフェースを無視することができます。次の設定では、docker0 インターフェースと veth で始まるすべてのインターフェースが無視されます。

application.yml
spring:
  cloud:
    inetutils:
      ignoredInterfaces:
        - docker0
        - veth.*

次の例に示すように、正規表現のリストを使用して、指定したネットワークアドレスのみを強制的に使用することもできます。

bootstrap.yml
spring:
  cloud:
    inetutils:
      preferredNetworks:
        - 192.168
        - 10.0

次の例に示すように、サイトローカルアドレスのみの使用を強制することもできます。

application.yml
spring:
  cloud:
    inetutils:
      useOnlySiteLocalInterfaces: true

サイトローカルアドレスの構成要素の詳細については、"Inet4Address.html.isSiteLocalAddress() (標準 Javadoc) " を参照してください。

HTTP クライアントファクトリ

Spring Cloud Commons は、Apache HTTP クライアント (ApacheHttpClientFactory) と OK HTTP クライアント (OkHttpClientFactory) の両方を作成するための Bean を提供します。OkHttpClientFactory Bean は、OK HTTP jar がクラスパスにある場合にのみ作成されます。さらに、Spring Cloud Commons は、両方のクライアントで使用される接続マネージャーを作成するための Bean を提供します。Apache HTTP クライアントの場合は ApacheHttpClientConnectionManagerFactory、OK HTTP クライアントの場合は OkHttpClientConnectionPoolFactory です。下流プロジェクトで HTTP クライアントを作成する方法をカスタマイズする場合は、これらの Bean の独自の実装を提供できます。さらに、型 HttpClientBuilder または OkHttpClient.Builder の Bean を提供する場合、デフォルトのファクトリは、下流プロジェクトに返されるビルダーのベースとしてこれらのビルダーを使用します。spring.cloud.httpclientfactories.apache.enabled または spring.cloud.httpclientfactories.ok.enabled を false に設定して、これらの Bean の作成を無効にすることもできます。

有効な機能

Spring Cloud Commons は、/features アクチュエーターエンドポイントを提供します。このエンドポイントは、クラスパスで利用可能な機能と、それらが有効かどうかを返します。返される情報には、機能の型、名前、バージョン、ベンダーが含まれます。

特徴の種類

「機能」には、抽象機能と名前付き機能の 2 種類があります。

抽象機能は、インターフェースまたは抽象クラスが定義され、実装によって作成される機能です ( DiscoveryClientLoadBalancerClientLockService など)。抽象クラスまたはインターフェースは、コンテキスト内でその型の Bean を見つけるために使用されます。表示されるバージョンは bean.getClass().getPackage().getImplementationVersion() です。

名前付き機能は、実装する特定のクラスを持たない機能です。これらの機能には、「サーキットブレーカー」、「API ゲートウェイ」、"Spring Cloud Bus" などが含まれます。これらの機能には、名前と Bean 型が必要です。

機能の宣言

次の例に示すように、どのモジュールでも任意の数の HasFeature Bean を宣言できます。

@Bean
public HasFeatures commonsFeatures() {
  return HasFeatures.abstractFeatures(DiscoveryClient.class, LoadBalancerClient.class);
}

@Bean
public HasFeatures consulFeatures() {
  return HasFeatures.namedFeatures(
    new NamedFeature("Spring Cloud Bus", ConsulBusAutoConfiguration.class),
    new NamedFeature("Circuit Breaker", HystrixCommandAspect.class));
}

@Bean
HasFeatures localFeatures() {
  return HasFeatures.builder()
      .abstractFeature(Something.class)
      .namedFeature(new NamedFeature("Some Other Feature", Someother.class))
      .abstractFeature(Somethingelse.class)
      .build();
}

これらの Bean はそれぞれ、適切に保護された @Configuration に入れる必要があります。

Spring Cloud 互換性の検証

一部のユーザーが Spring Cloud アプリケーションのセットアップに問題を抱えているため、互換性検証メカニズムを追加することにしました。現在のセットアップが Spring Cloud 要件と互換性がない場合は、問題が発生したことを示すレポートとともに機能が停止します。

現時点では、Spring Boot のどのバージョンがクラスパスに追加されているかを確認しています。

レポートの例

***************************
APPLICATION FAILED TO START
***************************

Description:

Your project setup is incompatible with our requirements due to following reasons:

- Spring Boot [2.1.0.RELEASE] is not compatible with this Spring Cloud release train


Action:

Consider applying the following actions:

- Change Spring Boot version to one of the following versions [1.2.x, 1.3.x] .
You can find the latest Spring Boot versions here [https://spring.io/projects/spring-boot#learn].
If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section.

この機能を無効にするには、spring.cloud.compatibility-verifier.enabled を false に設定します。互換性のある Spring Boot バージョンをオーバーライドする場合は、互換性のある Spring Boot バージョンのカンマ区切りリストを使用して spring.cloud.compatibility-verifier.compatible-boot-versions プロパティを設定するだけです。