Spring Cloud Netflix の特徴

サービスディスカバリ: Eureka クライアント

サービスディスカバリは、マイクロサービスベースのアーキテクチャの重要な信条の 1 つです。各クライアントまたは何らかの形式の規則を手動で構成しようとすると、実行が困難になり、脆弱になる可能性があります。Eureka は、Netflix サービスディスカバリサーバーおよびクライアントです。サーバーは高可用性になるように構成およびデプロイでき、各サーバーは登録されたサービスに関する状態を他のサーバーに複製します。

Eureka クライアントを含める方法

プロジェクトに Eureka クライアントを含めるには、org.springframework.cloud のグループ ID と spring-cloud-starter-netflix-eureka-client のアーティファクト ID を持つスターターを使用します。現在の Spring Cloud リリーストレインを使用したビルドシステムのセットアップの詳細については、Spring Cloud プロジェクトページを参照してください。

Eureka への登録

クライアントが Eureka に登録すると、ホスト、ポート、ヘルスインジケーターの URL、ホームページ、その他の詳細など、クライアント自体に関するメタデータが提供されます。Eureka は、サービスに属する各インスタンスからハートビートメッセージを受信します。ハートビートが構成可能なタイムテーブルをフェイルオーバーした場合、インスタンスは通常、レジストリから削除されます。

次の例は、最小限の Eureka クライアントアプリケーションを示しています。

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

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


}

前の例は通常の Spring Boot アプリケーションを示していることに注意してください。クラスパスに spring-cloud-starter-netflix-eureka-client を設定することにより、アプリケーションは Eureka サーバーに自動的に登録されます。次の例に示すように、Eureka サーバーを見つけるには構成が必要です。

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

前の例では、defaultZone は、プリファレンスを表現しないクライアントにサービス URL を提供するマジックストリングフォールバック値です(つまり、これは便利なデフォルトです)。

serviceUrl プロパティは Map<String, String> であるため、defaultZone プロパティでは大文字と小文字が区別され、キャメルケースが必要です。defaultZone プロパティは、default-zone の通常の Spring Boot スネークケース規則に従いません。

デフォルトのアプリケーション名(つまり、サービス ID)、仮想ホスト、非セキュアポート(Environment から取得)は、それぞれ ${spring.application.name}${spring.application.name}${server.port} です。

クラスパスに spring-cloud-starter-netflix-eureka-client があると、アプリは Eureka の「インスタンス」(つまり、それ自体を登録する)と「クライアント」(レジストリにクエリを実行して他のサービスを見つけることができます)の両方になります。インスタンスの動作は eureka.instance.* 構成キーによって駆動されますが、アプリケーションに spring.application.name の値があることを確認すればデフォルトで問題ありません(これは Eureka サービス ID または VIP のデフォルトです)。

構成可能なオプションの詳細については、EurekaInstanceConfigBean [GitHub] (英語) および EurekaClientConfigBean [GitHub] (英語) を参照してください。

Eureka Discovery Client を無効にするには、eureka.client.enabled を false に設定できます。spring.cloud.discovery.enabled が false に設定されている場合、Eureka ディスカバリクライアントも無効になります。

Spring Cloud Netflix Eureka サーバーのバージョンをパスパラメーターとして指定することは現在サポートされていません。これは、コンテキストパス(eurekaServerURLContext)でバージョンを設定できないことを意味します。代わりに、サーバーの URL にバージョンを含めることができます(たとえば、defaultZone: localhost:8761/eureka/v2 を設定できます)。

Eureka サーバーでの認証

eureka.client.serviceUrl.defaultZone URL の 1 つに資格情報が埋め込まれている場合(curl スタイル、次のように: user:password@localhost:8761/eureka (英語) )、HTTP 基本認証が eureka クライアントに自動的に追加されます。より複雑なニーズの場合は、型 DiscoveryClientOptionalArgs の @Bean を作成し、それに ClientFilter インスタンスを挿入できます。これらはすべて、クライアントからサーバーへの呼び出しに適用されます。

Eureka サーバーが認証のためにクライアント側の証明書を必要とする場合、次の例に示すように、クライアント側の証明書とトラストストアはプロパティを介して構成できます。

application.yml
eureka:
  client:
    tls:
      enabled: true
      key-store: <path-of-key-store>
      key-store-type: PKCS12
      key-store-password: <key-store-password>
      key-password: <key-password>
      trust-store: <path-of-trust-store>
      trust-store-type: PKCS12
      trust-store-password: <trust-store-password>

Eureka クライアント側 TLS を有効にするには、eureka.client.tls.enabled が true である必要があります。eureka.client.tls.trust-store を省略すると、JVM のデフォルトのトラストストアが使用されます。eureka.client.tls.key-store-type および eureka.client.tls.trust-store-type のデフォルト値は PKCS12 です。パスワードのプロパティを省略すると、空のパスワードが想定されます。

Eureka の制限により、サーバーごとの基本認証資格情報をサポートすることはできません。そのため、最初に見つかったセットのみが使用されます。

Eureka HTTP クライアントで使用される RestTemplate をカスタマイズする場合は、EurekaClientHttpRequestFactorySupplier の Bean を作成し、ClientHttpRequestFactory インスタンスを生成するための独自のロジックを提供することをお勧めします。

Eureka HTTP クライアントによって使用される RestTemplate および RestClient のすべてのデフォルトのタイムアウト関連プロパティは、3 分に設定されています (Apache HC5 のデフォルトの RequestConfig および SocketConfig に準拠)。タイムアウト値を指定するには、eureka.client.rest-template-timeout または eureka.client.restclient.timeout のプロパティを使用して値を直接指定する必要があります。すべてのタイムアウトプロパティはミリ秒単位です。

application.yml
eureka:
  client:
    restclient:
      timeout:
        connect-timeout: 5000
        connect-request-timeout: 8000
        socket-timeout: 10000
    rest-template-timeout:
      connect-timeout: 5000
      connect-request-timeout: 8000
      socket-timeout: 10000

EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer 型の Bean を作成することにより、基礎となる Apache HttpClient 5 の RequestConfig をカスタマイズすることもできます。

@Configuration
public class RestClientConfiguration {

	@Bean
	EurekaClientHttpRequestFactorySupplier.RequestConfigCustomizer requestConfigCustomizer() {
		return builder -> builder.setProtocolUpgradeEnabled(false);
	}

}

ステータスページとヘルスインジケータ

Eureka インスタンスのステータスページとヘルスインジケータは、デフォルトでそれぞれ /info と /health になります。これらは、Spring Boot Actuator アプリケーションの有用なエンドポイントのデフォルトの場所です。デフォルト以外のコンテキストパスまたはサーブレットパス(server.servletPath=/custom など)を使用する場合は、アクチュエーターアプリケーションの場合でもこれらを変更する必要があります。次の例は、2 つの設定のデフォルト値を示しています。

application.yml
eureka:
  instance:
    statusPageUrlPath: ${server.servletPath}/info
    healthCheckUrlPath: ${server.servletPath}/health

これらのリンクは、クライアントによって消費されるメタデータに表示され、アプリケーションにリクエストを送信するかどうかを決定するためにいくつかのシナリオで使用されるため、正確であると役立ちます。

Dalston では、その管理コンテキストパスを変更するときに、ステータスとヘルスチェックの URL も設定する必要がありました。この要件は、Edgware 以降で削除されました。

安全なアプリケーションの登録

アプリが HTTPS 経由で接続されることを希望する場合は、EurekaInstanceConfigBean で 2 つのフラグを設定できます。

  • eureka.instance.[nonSecurePortEnabled]=[false]

  • eureka.instance.[securePortEnabled]=[true]

そうすることで、Eureka は、安全な通信の明示的な優先順位を示すインスタンス情報を公開します。Spring Cloud DiscoveryClient は、このように構成されたサービスに対して、常に https で始まる URI を返します。同様に、サービスがこのように構成されている場合、Eureka(ネイティブ)インスタンス情報には安全なヘルスチェック URL が含まれます。

Eureka は内部で機能するため、明示的にオーバーライドしない限り、ステータスページとホームページの安全でない URL を公開します。次の例に示すように、プレースホルダーを使用して eureka インスタンスの URL を構成できます。

application.yml
eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/

${eureka.hostname} は、Eureka の新しいバージョンでのみ使用可能なネイティブプレースホルダーであることに注意してください。たとえば、${eureka.instance.hostName} を使用することにより、Spring プレースホルダーでも同じことを実現できます)

アプリケーションがプロキシの背後で実行され、SSL ターミネーションがプロキシ内にある場合(たとえば、Cloud Foundry または他のプラットフォームでサービスとして実行している場合)、プロキシの「転送」ヘッダーがインターセプトされ、によって処理されるようにする必要があります。アプリケーション。Spring Boot アプリケーションに埋め込まれた Tomcat コンテナーに 'X-Forwarded- \ * ` ヘッダーの明示的な構成がある場合、これは自動的に行われます。アプリによってレンダリングされたリンク自体が間違っている(ホスト、ポート、プロトコルが間違っている)ことは、この構成が間違っていることを示しています。

Eureka のヘルスチェック

デフォルトでは、Eureka はクライアントのハートビートを使用して、クライアントが稼働しているかどうかを判断します。特に指定がない限り、Discovery Client は、Spring Boot Actuator に従って、アプリケーションの現在のヘルスチェックステータスを伝播しません。その結果、登録が成功した後、Eureka は常にアプリケーションが "UP" 状態にあることをアナウンスします。この動作は、Eureka ヘルスチェックを有効にすることで変更できます。これにより、アプリケーションステータスが Eureka に伝播されます。結果として、他のすべてのアプリケーションは、"UP" 以外の状態のアプリケーションにトラフィックを送信しません。次の例は、クライアントのヘルスチェックを有効にする方法を示しています。

application.yml
eureka:
  client:
    healthcheck:
      enabled: true
eureka.client.healthcheck.enabled=true は application.yml でのみ設定する必要があります。bootstrap.yml で値を設定すると、Eureka に UNKNOWN ステータスで登録するなど、望ましくない副作用が発生します。

ヘルスチェックをさらに制御する必要がある場合は、独自の com.netflix.appinfo.HealthCheckHandler を実装することを検討してください。

インスタンスとクライアントの Eureka メタデータ

Eureka メタデータがどのように機能するかを理解するのに少し時間を費やす価値があるため、プラットフォームで意味のある方法でそれを使用できます。ホスト名、IP アドレス、ポート番号、ステータスページ、ヘルスチェックなどの情報の標準メタデータがあります。これらはサービスレジストリに公開され、クライアントが簡単な方法でサービスに連絡するために使用します。追加のメタデータを eureka.instance.metadataMap のインスタンス登録に追加でき、このメタデータはリモートクライアントでアクセスできます。一般に、追加のメタデータは、クライアントがメタデータの意味を認識していない限り、クライアントの動作を変更しません。このドキュメントの後半で説明するように、Spring Cloud がすでにメタデータマップに意味を割り当てている特殊なケースがいくつかあります。

Cloud Foundry で Eureka を使用する

Cloud Foundry にはグローバルルーターがあるため、同じアプリのすべてのインスタンスが同じホスト名を持ちます(同様のアーキテクチャを持つ他の PaaS ソリューションも同じ配置になります)。これは必ずしも Eureka を使用する上での障壁ではありません。ただし、ルーターを使用する場合(プラットフォームの設定方法に応じて、推奨または必須)、ルーターを使用するようにホスト名とポート番号(セキュアまたは非セキュア)を明示的に設定する必要があります。また、インスタンスメタデータを使用して、クライアント上のインスタンスを区別できるようにすることもできます(たとえば、カスタムロードバランサー内)。次の例に示すように、デフォルトでは、eureka.instance.instanceId は vcap.application.instance_id です。

application.yml
eureka:
  instance:
    hostname: ${vcap.application.uris[0]}
    nonSecurePort: 80

Cloud Foundry インスタンスでのセキュリティルールの設定方法によっては、ホスト VM の IP アドレスを登録して、サービス間の直接呼び出しに使用できる場合があります。この機能は、Pivotal Web サービス(PWS (英語) )ではまだ利用できません。

AWS で Eureka を使用する

アプリケーションを AWS クラウドにデプロイする予定の場合は、Eureka インスタンスを AWS 対応に設定する必要があります。これを行うには、EurekaInstanceConfigBean [GitHub] (英語) を次のようにカスタマイズします。

@Bean
@Profile("!default")
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) {
  EurekaInstanceConfigBean bean = new EurekaInstanceConfigBean(inetUtils);
  AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
  bean.setDataCenterInfo(info);
  return bean;
}

Eureka インスタンス ID の変更

バニラ Netflix Eureka インスタンスは、そのホスト名と同じ ID で登録されます(つまり、ホストごとに 1 つのサービスしかありません)。Spring Cloud Eureka は、次のように定義される適切なデフォルトを提供します。

${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}

例は myhost:myappname:8080 です。

次の例に示すように、Spring Cloud を使用すると、eureka.instance.instanceId に一意の識別子を指定してこの値を上書きできます。

application.yml
eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

前の例に示したメタデータと複数のサービスインスタンスがローカルホストにデプロイされている場合、インスタンスを一意にするためにランダムな値がそこに挿入されます。Cloud Foundry では、vcap.application.instance_id は Spring Boot アプリケーションに自動的に入力されるため、ランダムな値は必要ありません。

EurekaClient の使用

検出クライアントであるアプリケーションを入手したら、それを使用して Eureka サーバーからサービスインスタンスを検出できます。これを行う 1 つの方法は、次の例に示すように、(Spring Cloud DiscoveryClient ではなく)ネイティブ com.netflix.discovery.EurekaClient を使用することです。

@Autowired
private EurekaClient discoveryClient;

public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
    return instance.getHomePageUrl();
}

EurekaClient を @PostConstruct メソッドまたは @Scheduled メソッド(または ApplicationContext がまだ開始されていない可能性のある場所)で使用しないでください。SmartLifecycle (phase=0 を使用)で初期化されるため、利用可能であると信頼できる最も早いものは、より高いフェーズの別の SmartLifecycle にあります。

基礎となる HTTP クライアント

EurekaClient は内部的に RestClientRestTemplateWebClient または JerseyClient を使用します。EurekaClient を使用するには、サポートされている HTTP クライアントのいずれかをクラスパス上に配置する必要があります。

RestTemplate または RestClient を使用するには、依存関係に spring-boot-starter-web を追加します。WebClient を使用するには、依存関係に spring-boot-starter-webflux を追加します。依存関係に spring-boot-starter-web と spring-boot-starter-webflux の両方が含まれており、eureka.client.webclient.enabled フラグが true に設定されている場合、WebClient が使用されます。そうでない場合、eureka.client.restclient.enabled が true に設定されている場合、RestClient が使用されます。それ以外の場合は、RestTemplate が使用されます。

これらのクライアント実装のいずれにおいても、ビルダー Bean が利用可能な場合は、それを使用して基盤となるクライアントが作成されます。
次のメジャーリリースでは、デフォルトのクライアントを RestClient に変更する予定です。

代わりに Jersey を使用する場合は、クラスパスに Jersey 依存関係を追加する必要があります。次の例は、追加する必要がある依存関係を示しています。

<dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-apache-client4</artifactId>
    </dependency>
</dependencies>

クラスパスに JerseyClient があるが、EuerekaClient で使用したくない場合は、必ず eureka.client.jersey.enabled を false に設定してください。

ネイティブ Netflix EurekaClient の代替

生の Netflix EurekaClient を使用する必要はありません。また、通常、何らかのラッパーの背後で使用する方が便利です。Spring Cloud は、物理 URL の代わりに論理 Eureka サービス識別子 (VIP) を介してフェイグ (REST クライアントビルダー) および Spring Cloud LoadBalancer をサポートしています。

次の例に示すように、ディスカバリクライアント用の単純な API(Netflix に固有ではない)を提供する org.springframework.cloud.client.discovery.DiscoveryClient を使用することもできます。

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("STORES");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri();
    }
    return null;
}

サービスの登録が遅いのはなぜですか?

インスタンスになるには、レジストリへの定期的なハートビート(クライアントの serviceUrl を介した)も含まれます。デフォルトの期間は 30 秒です。インスタンス、サーバー、クライアントがすべてローカルキャッシュに同じメタデータを持つまで、クライアントによるサービスの検出は利用できません(したがって、3 つのハートビートが必要になる可能性があります)。eureka.instance.leaseRenewalIntervalInSeconds を設定することで期間を変更できます。30 未満の値に設定すると、クライアントを他のサービスに接続するプロセスが高速化されます。本番環境では、サーバーの内部計算によってリースの更新期間が想定されるため、デフォルトを使用することをお勧めします。

ゾーン

Eureka クライアントを複数のゾーンにデプロイしている場合は、それらのクライアントが別のゾーンでサービスを試す前に、同じゾーン内のサービスを使用することをお勧めします。これを設定するには、Eureka クライアントを正しく構成する必要があります。

まず、Eureka サーバーが各ゾーンにデプロイされていること、およびそれらが相互にピアであることを確認する必要があります。詳細については、ゾーンとリージョンのセクションを参照してください。

次に、サービスがどのゾーンにあるかを Eureka に通知する必要があります。これは metadataMap プロパティを使用して行うことができます。例: service 1 が zone 1 と zone 2 の両方にデプロイされている場合、service 1 で次の Eureka プロパティを設定する必要があります。

ゾーン 1 のサービス 1

eureka.instance.metadataMap.zone = zone1
eureka.client.preferSameZoneEureka = true

ゾーン 2 のサービス 1

eureka.instance.metadataMap.zone = zone2
eureka.client.preferSameZoneEureka = true

Eureka クライアントのリフレッシュ

デフォルトでは、EurekaClient Bean はリフレッシュ可能です。つまり、Eureka クライアントのプロパティを変更およびリフレッシュできます。リフレッシュが発生すると、クライアントは Eureka サーバーから登録解除され、特定のサービスのすべてのインスタンスが利用できない場合があります。これを回避する 1 つの方法は、Eureka クライアントをリフレッシュする機能を無効にすることです。これを行うには、eureka.client.refresh.enable=false を設定します。

Spring Cloud で Eureka を使用する LoadBalancer

Spring Cloud LoadBalancer ZonePreferenceServiceInstanceListSupplier のサポートを提供します。Eureka インスタンスメタデータ(eureka.instance.metadataMap.zone)の zone 値は、サービスインスタンスをゾーンでフィルタリングするために使用される spring-cloud-loadbalancer-zone プロパティの値を設定するために使用されます。

それが欠落していて、spring.cloud.loadbalancer.eureka.approximateZoneFromHostname フラグが true に設定されている場合、サーバーのホスト名からのドメイン名をゾーンのプロキシとして使用できます。

ゾーンデータの他のソースがない場合は、(インスタンス構成ではなく)クライアント構成に基づいて推測が行われます。リージョン名からゾーンのリストへのマップである eureka.client.availabilityZones を取得し、インスタンス自体のリージョンの最初のゾーン(つまり、ネイティブとの互換性のためにデフォルトで "us-east-1" に設定されている eureka.client.region)をプルします。Netflix)。

AOT およびネイティブイメージのサポート

Spring Cloud Netflix Eureka クライアント統合は、Spring AOT 変換とネイティブイメージをサポートしますが、リフレッシュモードが無効になっている場合のみです。

Eureka クライアントを AOT またはネイティブイメージモードで実行する場合は、必ず spring.cloud.refresh.enabled を false に設定してください。
AOT とネイティブイメージのクローズドワールドの仮定を考慮すると、事前コンパイルまたはネイティブイメージでは、Eureka クライアントでランダムポートを使用することはサポートされません。

サービスディスカバリ: Eureka サーバー

このセクションでは、Eureka サーバーをセットアップする方法について説明します。

Eureka サーバーを含める方法

プロジェクトに Eureka サーバーを含めるには、グループ ID が org.springframework.cloud でアーティファクト ID が spring-cloud-starter-netflix-eureka-server のスターターを使用します。現在の Spring Cloud リリーストレインを使用したビルドシステムのセットアップの詳細については、Spring Cloud プロジェクトページを参照してください。

プロジェクトですでに Thymeleaf をテンプレートエンジンとして使用している場合、Eureka サーバーの Freemarker テンプレートが正しく読み込まれない可能性があります。この場合、テンプレートローダーを手動で構成する必要があります。
application.yml
spring:
  freemarker:
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false

Eureka サーバーを実行する方法

次の例は、最小限の Eureka サーバーを示しています。

@SpringBootApplication
@EnableEurekaServer
public class Application {

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


}

サーバーには、/eureka/* での通常の Eureka 機能用の UI および HTTP API エンドポイントを備えたホームページがあります。

次のリンクには、Eureka の背景情報が記載されています: flux コンデンサ [GitHub] (英語) Google グループのディスカッション (英語)

Gradle の依存関係解決ルールと親 bom 機能の欠如により、spring-cloud-starter-netflix-eureka-server によっては、アプリケーションの起動時にエラーが発生する可能性があります。この課題を解決するには、Spring Boot Gradle プラグインを追加し、次のように Spring クラウドスターターの親 bom をインポートします。

build.gradle
buildscript {
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:{spring-boot-docs-version}")
  }
}

apply plugin: "spring-boot"

dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:{spring-cloud-version}"
  }
}

defaultOpenForTrafficCount とその EurekaServer ウォームアップ時間への影響

Netflix Eureka の waitTimeInMsWhenSyncEmpty 設定は、最初は Spring Cloud Eureka サーバーでは考慮されていません。ウォームアップ時間を有効にするには、eureka.server.defaultOpenForTrafficCount=0 を設定します。

高可用性、ゾーン、リージョン

Eureka サーバーにはバックエンドストアがありませんが、レジストリ内のサービスインスタンスはすべて、登録を最新の状態に保つためにハートビートを送信する必要があります(これはメモリ内で実行できます)。クライアントには、Eureka 登録のメモリ内キャッシュもあります(したがって、サービスへのリクエストごとにレジストリに移動する必要はありません)。

デフォルトでは、すべての Eureka サーバーも Eureka クライアントであり、ピアを見つけるために(少なくとも 1 つの)サービス URL が必要です。これを提供しない場合、サービスは実行および機能しますが、ピアに登録できないことに関する多くのノイズでログがいっぱいになります。

スタンドアロンモード

2 つのキャッシュ(クライアントとサーバー)とハートビートの組み合わせにより、スタンドアロンの Eureka サーバーは、何らかのモニターまたはエラスティックランタイム(Cloud Foundry など)が存続している限り、障害に対してかなり回復力があります。スタンドアロンモードでは、クライアント側の動作をオフにして、ピアへの到達を試みたり失敗したりし続けないようにすることをお勧めします。次の例は、クライアント側の動作をオフにする方法を示しています。

application.yml (スタンドアロン Eureka サーバー)
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

serviceUrl がローカルインスタンスと同じホストを指していることに注意してください。

ピアアウェアネス

Eureka は、複数のインスタンスを実行し、相互に登録するように要求することで、さらに復元力と可用性を高めることができます。実際、これはデフォルトの動作であるため、次の例に示すように、これを機能させるために必要なのは、有効な serviceUrl をピアに追加することだけです。

application.yml (2 つのピア対応 Eureka サーバー)
---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: https://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: https://peer1/eureka/

前の例では、異なる Spring プロファイルで実行することにより、2 つのホスト(peer1 と peer2)で同じサーバーを実行するために使用できる YAML ファイルがあります。この構成を使用して、/etc/hosts を操作してホスト名を解決することにより、単一のホストでピア認識をテストできます(本番環境でそれを行うことにはあまり価値がありません)。実際、自身のホスト名を知っているマシンで実行している場合、eureka.instance.hostname は必要ありません(デフォルトでは、java.net.InetAddress を使用して検索されます)。

システムに複数のピアを追加することができ、それらがすべて少なくとも 1 つのエッジで相互に接続されている限り、それらは相互に登録を同期します。ピアが物理的に分離されている場合(データセンター内または複数のデータセンター間)、システムは原則として「スプリットブレイン」型の障害に耐えることができます。システムに複数のピアを追加することができ、それらがすべて互いに直接接続されている限り、それらは相互に登録を同期します。

application.yml (3 つのピア対応 Eureka サーバー)
eureka:
  client:
    serviceUrl:
      defaultZone: https://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2

---
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3

IP アドレスを優先する場合

場合によっては、Eureka がホスト名ではなくサービスの IP アドレスをアドバタイズすることが望ましい場合があります。eureka.instance.preferIpAddress を true に設定すると、アプリケーションが eureka に登録するときに、ホスト名ではなく IP アドレスを使用します。

ホスト名を Java で判別できない場合、IP アドレスは Eureka に送信されます。ホスト名を設定する明示的な方法は、eureka.instance.hostname プロパティを設定することだけです。eureka.instance.hostname=${HOST_NAME} などの環境変数を使用して、実行時にホスト名を設定できます。

Eureka サーバーの保護

spring-boot-starter-security を介してサーバーのクラスパスに Spring Security を追加するだけで、Eureka サーバーを保護できます。デフォルトでは、Spring Security がクラスパス上にある場合、アプリへのすべてのリクエストで有効な CSRF トークンが送信されることが必要になります。Eureka クライアントは通常、有効なクロスサイトリクエストフォージェリ (CSRF) トークンを所有していないため、/eureka/** エンドポイントに対してこの要件を無効にする必要があります。例:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
	http.authorizeHttpRequests((authz) -> authz
        .anyRequest().authenticated())
	    .httpBasic(withDefaults());
    http.csrf().ignoringRequestMatchers("/eureka/**");
    return http.build();
}

CSRF の詳細については、Spring Security ドキュメントを参照してください。

デモ Eureka サーバーは、Spring Cloud サンプルリポジトリにあり [GitHub] (英語) ます。

JDK11 サポート

Eureka サーバーが依存する JAXB モジュールは JDK11 で削除されました。Eureka サーバーの実行時に JDK11 を使用する場合は、これらの依存関係を POM または Gradle ファイルに含める必要があります。

<dependency>
	<groupId>org.glassfish.jaxb</groupId>
	<artifactId>jaxb-runtime</artifactId>
</dependency>

AOT およびネイティブイメージのサポート

Spring Cloud Netflix Eureka サーバーは、Spring AOT 変換またはネイティブイメージをサポートしていません。

メトリクス

EurekaInstanceMonitor は、Eureka インスタンス登録に関連するイベントをリッスンし、Gauge`s for Eureka instance information in Micrometer’s `MeterRegistry を作成 / 更新します。デフォルトでは、この動作は無効になっています。有効にするには、eureka.server.metrics.enabled を true に設定する必要があります。

デフォルトでは、Gauge`s are named `eureka.server.instances には次のタグが付けられます。

  • application: アプリケーション名

  • status: インスタンスステータス (UPDOWNSTARTINGOUT_OF_SERVICEUNKNOWN、参照: com.netflix.appinfo.InstanceInfo.InstanceStatus)

独自の EurekaInstanceTagsProvider 実装を挿入することで、追加のタグを追加できます。

構成プロパティ

Spring Cloud Netflix に関連するすべての構成プロパティのリストを表示するには、付録ページを確認してください