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 サーバーを見つけるには構成が必要です。
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 サーバーが認証のためにクライアント側の証明書を必要とする場合、次の例に示すように、クライアント側の証明書とトラストストアはプロパティを介して構成できます。
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
のプロパティを使用して値を直接指定する必要があります。すべてのタイムアウトプロパティはミリ秒単位です。
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 つの設定のデフォルト値を示しています。
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 を構成できます。
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" 以外の状態のアプリケーションにトラフィックを送信しません。次の例は、クライアントのヘルスチェックを有効にする方法を示しています。
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
です。
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
に一意の識別子を指定してこの値を上書きできます。
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(); }
|
基礎となる HTTP クライアント
EurekaClient
は内部的に RestClient
、RestTemplate
、WebClient
または 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 テンプレートが正しく読み込まれない可能性があります。この場合、テンプレートローダーを手動で構成する必要があります。 |
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 機能の欠如により、 build.gradle
|
defaultOpenForTrafficCount
とその EurekaServer ウォームアップ時間への影響
Netflix Eureka の waitTimeInMsWhenSyncEmpty
設定は、最初は Spring Cloud Eureka サーバーでは考慮されていません。ウォームアップ時間を有効にするには、eureka.server.defaultOpenForTrafficCount=0
を設定します。
高可用性、ゾーン、リージョン
Eureka サーバーにはバックエンドストアがありませんが、レジストリ内のサービスインスタンスはすべて、登録を最新の状態に保つためにハートビートを送信する必要があります(これはメモリ内で実行できます)。クライアントには、Eureka 登録のメモリ内キャッシュもあります(したがって、サービスへのリクエストごとにレジストリに移動する必要はありません)。
デフォルトでは、すべての Eureka サーバーも Eureka クライアントであり、ピアを見つけるために(少なくとも 1 つの)サービス URL が必要です。これを提供しない場合、サービスは実行および機能しますが、ピアに登録できないことに関する多くのノイズでログがいっぱいになります。
スタンドアロンモード
2 つのキャッシュ(クライアントとサーバー)とハートビートの組み合わせにより、スタンドアロンの Eureka サーバーは、何らかのモニターまたはエラスティックランタイム(Cloud Foundry など)が存続している限り、障害に対してかなり回復力があります。スタンドアロンモードでは、クライアント側の動作をオフにして、ピアへの到達を試みたり失敗したりし続けないようにすることをお勧めします。次の例は、クライアント側の動作をオフにする方法を示しています。
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
serviceUrl
がローカルインスタンスと同じホストを指していることに注意してください。
ピアアウェアネス
Eureka は、複数のインスタンスを実行し、相互に登録するように要求することで、さらに復元力と可用性を高めることができます。実際、これはデフォルトの動作であるため、次の例に示すように、これを機能させるために必要なのは、有効な serviceUrl
をピアに追加することだけです。
--- 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 つのエッジで相互に接続されている限り、それらは相互に登録を同期します。ピアが物理的に分離されている場合(データセンター内または複数のデータセンター間)、システムは原則として「スプリットブレイン」型の障害に耐えることができます。システムに複数のピアを追加することができ、それらがすべて互いに直接接続されている限り、それらは相互に登録を同期します。
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 サーバーの保護
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>
メトリクス
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
: インスタンスステータス (UP
、DOWN
、STARTING
、OUT_OF_SERVICE
、UNKNOWN
、参照:com.netflix.appinfo.InstanceInfo.InstanceStatus
)
独自の EurekaInstanceTagsProvider
実装を挿入することで、追加のタグを追加できます。