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);
}
}
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
を呼び出します。
必要なもの
約 15 分
Eclipse STS や IntelliJ IDEA のような任意の IDE または VSCode のようなテキストエディター
Java 17 以降
このガイドを完了する方法
ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了することも、このリポジトリ [GitHub] (英語) のコードを確認してソリューションに直接進むこともできます。
ローカル環境で最終結果を確認するには、次のいずれかを実行します。
このガイドのソースリポジトリをダウンロードして解凍します
Git を使用してリポジトリをクローンする:
git clone https://github.com/spring-guides/gs-service-registration-and-discovery.git
リポジトリをフォークして、プルリクエストを送信することでこのガイドの変更をリクエストできるようにします。
Spring Initializr から開始
すべての Spring アプリケーションの場合、Spring Initializr から開始する必要があります。Initializr は、アプリケーションに必要なすべての依存関係をすばやく取り込む方法を提供し、多くのセットアップを行います。
このガイドには 3 つのアプリケーションが必要です。最初のアプリケーション (サーバーアプリケーション) には、Eureka サーバー依存関係のみが必要です。2 番目と 3 番目のアプリケーション (クライアントアプリケーション) には、Eureka Discovery Client と Spring Web 依存関係が必要です。
Spring Initializr の事前初期化済みプロジェクトについては、次のリンクを使用できます。
このガイドには多数のサービスが含まれているため、GitHub リポジトリではソリューションのみが提供されています。最初から始めるには、上記のリンクを使用するか、以下に定義されている Spring Initializr を使用して空のプロジェクトを生成します。 |
Eureka サーバープロジェクトを手動で初期化するには:
IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。
Gradle または Maven と、使用する言語を選択します。このガイドでは、Maven と Java を選択したことを前提としています。
依存関係をクリックし、サーバーアプリケーションとして Eureka サーバーを選択します。
生成をクリックします。
結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。
サービス A プロジェクトとサービス B プロジェクトを手動で初期化するには:
IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。
Gradle または Maven と、使用する言語を選択します。このガイドでは、Maven と Java を選択したことを前提としています。
クライアントアプリケーションとして Eureka ディスカバリクライアントと Spring Web を選択します。
生成をクリックします。
結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。
Eureka サービスレジストリを開始する
まず、Eureka サーバーが必要です。Spring Cloud の @EnableEurekaServer
を使用して、他のアプリケーションが通信できるレジストリを立ち上げることができます。これは、サービスレジストリを有効にするために 1 つのアノテーション (@EnableEurekaServer
) が追加された通常の Spring Boot アプリケーションです。次のリスト (eureka-server/src/main/java/com/example/eurekaserver/EurekaServerApplication.java
から) は、サーバーアプリケーションを示しています。
本番環境では、レジストリのインスタンスを複数必要とする可能性があります。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 ダッシュボードを表示できます。
サービス 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 ライセンス (英語) でリリースされています。 |