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

このガイドでは、Netflix Eureka サービスレジストリを起動して使用するプロセスについて説明します。

構築するもの

eureka-server という名前の Netflix Eureka サービスレジストリ [GitHub] (英語) を設定し、servicea と serviceb という名前の 2 つの Web クライアントを構築します。これらは両方とも Eureka サーバーに登録されます。Web クライアントの 1 つである serviceb は、org.springframework.cloud.client.discovery.DiscoveryClient と Spring Framework の REST クライアントを使用して、もう 1 つの Web クライアントである servicea を呼び出します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了することも、このリポジトリ [GitHub] (英語) のコードを確認してソリューションに直接進むこともできます。

ローカル環境で最終結果を確認するには、次のいずれかを実行します。

Spring Initializr から開始

すべての Spring アプリケーションの場合、Spring Initializr から開始する必要があります。Initializr は、アプリケーションに必要なすべての依存関係をすばやく取り込む方法を提供し、多くのセットアップを行います。

このガイドには 3 つのアプリケーションが必要です。最初のアプリケーション (サーバーアプリケーション) には、Eureka サーバー依存関係のみが必要です。2 番目と 3 番目のアプリケーション (クライアントアプリケーション) には、Eureka Discovery Client と Spring Web 依存関係が必要です。

Spring Initializr の事前初期化済みプロジェクトについては、次のリンクを使用できます。

このガイドには多数のサービスが含まれているため、GitHub リポジトリではソリューションのみが提供されています。最初から始めるには、上記のリンクを使用するか、以下に定義されている Spring Initializr を使用して空のプロジェクトを生成します。

Eureka サーバープロジェクトを手動で初期化するには:

  1. IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。

  2. Gradle または Maven と、使用する言語を選択します。このガイドでは、Maven と Java を選択したことを前提としています。

  3. 依存関係をクリックし、サーバーアプリケーションとして Eureka サーバーを選択します。

  4. 生成をクリックします。

  5. 結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。

サービス A プロジェクトとサービス B プロジェクトを手動で初期化するには:

  1. IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。

  2. Gradle または Maven と、使用する言語を選択します。このガイドでは、Maven と Java を選択したことを前提としています。

  3. クライアントアプリケーションとして Eureka ディスカバリクライアントSpring Web を選択します。

  4. 生成をクリックします。

  5. 結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。

EclipseIntelliJ のような IDE は新規プロジェクト作成ウィザードから Spring Initializr の機能が使用できるため、手動での ZIP ファイルのダウンロードやインポートは不要です。

Eureka サービスレジストリを開始する

まず、Eureka サーバーが必要です。Spring Cloud の @EnableEurekaServer を使用して、他のアプリケーションが通信できるレジストリを立ち上げることができます。これは、サービスレジストリを有効にするために 1 つのアノテーション (@EnableEurekaServer) が追加された通常の Spring Boot アプリケーションです。次のリスト (eureka-server/src/main/java/com/example/eurekaserver/EurekaServerApplication.java から) は、サーバーアプリケーションを示しています。

package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

本番環境では、レジストリのインスタンスを複数必要とする可能性があります。Eureka サーバーの構成に関する追加情報は、こちらで参照できます。

デフォルトでは、レジストリも自分自身を登録しようとするため、その動作を無効にする必要があります。また、このレジストリをローカルで使用する場合は、別のポートに配置することをお勧めします。

次のように、これらの要件を処理するために、eureka-server/src/main/resources/application.yml にいくつかのプロパティを追加します。

spring:
  application:
    name: eureka-server
server:
  port: 8761
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
logging:
  level:
    com.netflix.eureka: OFF
    com.netflix.discovery: OFF

./mvnw spring-boot:run を実行して Eureka サーバーを起動できるようになりました。

レジストリと話す

サービスレジストリを開始したため、レジストリと対話するクライアントを立ち上げることができます。クライアントアプリケーション ServiceA と ServiceB は、クラスパスに spring-cloud-starter-netflix-eureka-client があるため、自動的に Eureka サーバーに登録されます。ポートの競合を回避するには、ServiceA と ServiceB の両方で server.port パラメーターを設定します。

サービス A:

spring:
  application:
    name: servicea
server:
  port: 8081

サービス B:

spring:
  application:
    name: serviceb
server:
  port: 8082

この時点で、3 つのアプリケーションすべてを実行できるはずです。IDE を使用するか、各アプリケーションフォルダーから ./mvnw spring-boot:run コマンドを実行できます。

アプリケーションを実行すると、Eureka ダッシュボードを表示できます。

eureka server dashboard

サービス A エンドポイント

servicea プロジェクトに com/example/servicea/controller/ServiceARestController.java という新しいクラスを作成し、アプリケーションのテストに使用できるエンドポイントを公開します。

package com.example.servicea.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServiceARestController {

	@GetMapping("/helloWorld")
	public String helloWorld() {
		return "Hello world from Service A!";
	}

}

サービス B エンドポイント

serviceb プロジェクトに com/example/serviceb/controller/ServiceBRestController.java という新しいクラスを作成し、servicea を呼び出すエンドポイントを公開します。

package com.example.serviceb.controller;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClient;

@RestController
public class ServiceBRestController {

	private final DiscoveryClient discoveryClient;
	private final RestClient restClient;

	public ServiceBRestController(DiscoveryClient discoveryClient, RestClient.Builder restClientBuilder) {
		this.discoveryClient = discoveryClient;
		restClient = restClientBuilder.build();
	}

	@GetMapping("helloEureka")
	public String helloWorld() {
		ServiceInstance serviceInstance = discoveryClient.getInstances("servicea").get(0);
		String serviceAResponse = restClient.get()
				.uri(serviceInstance.getUri() + "/helloWorld")
				.retrieve()
				.body(String.class);
		return serviceAResponse;
	}
}

このクラスは、DiscoveryClient を使用して、アプリケーション名のみに基づいて servicea の serviceId を検索します。このガイドには servicea のインスタンスが 1 つしかないため、最初のインスタンスのみを確認できます。これは次の行に示されています。

ServiceInstance serviceInstance = discoveryClient.getInstances("servicea").get(0);

servicea の位置を参照する ServiceInstance を取得したら、Spring Framework の REST クライアントの情報を使用できるようになります。

... = restClient.get().uri(serviceInstance.getUri() + "/helloWorld")...

次のコマンドを実行すると、3 つのアプリケーションすべてをテストできます。

curl http://localhost:8082/helloEureka

結果は以下のようになります:

Hello world from Service A!

アプリケーションをテストする

このガイドでは、次の手順について説明しました (このガイド全体に示されているコードを実装するか、ソリューションリポジトリ内のコードを使用することで実行できます)。

  • eureka-server フォルダーから ./mvnw spring-boot:run コマンドを使用して eureka-server を実行します

  • servicea フォルダーから ./mvnw spring-boot:run コマンドを使用して servicea を実行します

  • serviceb フォルダーから ./mvnw spring-boot:run コマンドを使用して serviceb を実行します

  • http://localhost:8761/ の Eureka ダッシュボードを表示して、servicea と serviceb が登録されていることを確認します。

  • curl http://localhost:8082/helloEureka コマンドを実行して、3 つのアプリケーションがすべて正常に動作していることをテストします。

  • 出力 Hello world from Service A! を観測する

servicea と serviceb が登録され、レジストリからインスタンスがリフレッシュされるまで、少し時間がかかります。curl コマンドが最初に失敗した場合は、1 分待ってから再試行してください。

要約

おめでとう! Spring を使用して Netflix Eureka サービスレジストリを立ち上げ、そのレジストリをクライアントアプリケーションで使用しました。

関連事項

次のガイドも役立つかもしれません:

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください [GitHub] (英語)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives creative commons ライセンス (英語) でリリースされています。

コードを入手する