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
メソッドが使用されます。
DiscoveryClient
インスタンスのオーダー
DiscoveryClient
インターフェースは Ordered
を継承します。これは、Spring アプリケーションによってロードされた Bean を順序付ける方法と同様に、返される検出クライアントの順序を定義できるため、複数の検出クライアントを使用する場合に便利です。デフォルトでは、DiscoveryClient
の順序は 0
に設定されます。カスタム DiscoveryClient
実装に別の順序を設定したい場合は、セットアップに適した値を返すように getOrder()
メソッドをオーバーライドするだけです。これとは別に、プロパティを使用して、ConsulDiscoveryClient
、EurekaDiscoveryClient
、ZookeeperDiscoveryClient
などの 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 でサポートされるステータスは UP
、DOWN
、OUT_OF_SERVICE
、UNKNOWN
です。
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
を必ず追加します。プロパティで例外を指定しない場合、デフォルトで使用される例外は IOException
、TimeoutException
、RetryableStatusCodeException
です。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
で始まるすべてのインターフェースが無視されます。
spring: cloud: inetutils: ignoredInterfaces: - docker0 - veth.*
次の例に示すように、正規表現のリストを使用して、指定したネットワークアドレスのみを強制的に使用することもできます。
spring: cloud: inetutils: preferredNetworks: - 192.168 - 10.0
次の例に示すように、サイトローカルアドレスのみの使用を強制することもできます。
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 種類があります。
抽象機能は、インターフェースまたは抽象クラスが定義され、実装によって作成される機能です ( DiscoveryClient
、LoadBalancerClient
、LockService
など)。抽象クラスまたはインターフェースは、コンテキスト内でその型の 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
プロパティを設定するだけです。