Enterprise Distributed Application Service (EDAS) は、Nacos レジストリの一般提供 (GA) バージョンを提供しています。Nacos を使用して構築された Spring Cloud アプリケーションは、コードを変更することなくこの共有レジストリに接続できます。EDAS にデプロイすると、プラットフォームが自動的にレジストリへの接続性を処理します。
このチュートリアルでは、Nacos に登録してサービス検出を行う 2 つの Spring Cloud マイクロサービス(サービスプロバイダーとサービス利用者)を構築する手順を説明します。完了時には、以下の環境が整います。
スタンドアロンモードで実行中のローカル Nacos Server
Nacos に登録され、REST エンドポイントを公開するサービスプロバイダー
RestTemplate および FeignClient の両方を通じてプロバイダーを検出するサービス利用者
ローカルで検証済みのエンドツーエンドのサービス検出
ローカルでの検証後、両方のアプリケーションを EDAS にデプロイします。詳細については、「ECS インスタンスへのアプリケーションのデプロイ」または「Kubernetes クラスターへのアプリケーションのデプロイ」をご参照ください。
EDAS は、Nacos、Eureka、ZooKeeper、Consul(自己管理または Microservice Engine (MSE) 経由)など、複数のレジストリをサポートしています。使用するレジストリに関係なく、EDAS はデプロイ後にアプリケーション管理、マイクロサービスガバナンス、クラウドネイティブ PaaS 機能を提供します。
前提条件
開始前に、以下の準備が整っていることを確認してください。
Maven がインストールされ、環境変数が設定されていること
最新の Nacos Server がダウンロードされ、展開されていること
Nacos Server の起動
nacos/binディレクトリに移動します。スタンドアロンモードで Nacos Server を起動します。
Linux、UNIX、または macOS の場合:
sudo sh startup.sh -m standaloneWindows の場合:
startup.cmdをダブルクリックします。
ブラウザで
http://127.0.0.1:8848/nacosを開き、Nacos Server が実行中であることを確認します。デフォルトのユーザー名とパスワードはどちらもnacosです。
プロジェクト構造
このチュートリアルでは、次の 2 つの独立した Maven プロジェクトを作成します。
nacos-service-provider/
├── pom.xml
└── src/main/
├── java/com/aliware/edas/
│ ├── ProviderApplication.java
│ └── EchoController.java
└── resources/
└── application.properties
nacos-service-consumer/
├── pom.xml
└── src/main/
├── java/com/aliware/edas/
│ ├── ConsumerApplication.java
│ ├── EchoService.java
│ └── TestController.java
└── resources/
└── application.properties完全なデモプロジェクトをダウンロードできます:service-provider | service-consumer。
サービスプロバイダーの作成
ステップ 1:Maven プロジェクトのセットアップ
nacos-service-provider という名前の Maven プロジェクトを作成し、pom.xml に次の依存関係を追加します。この例では、Spring Boot 2.1.4.RELEASE および Spring Cloud Greenwich.SR1 を使用します。
Spring Cloud Alibaba のバージョンは、お使いの Spring Cloud リリースと一致させる必要があります。
| Spring Cloud リリース | Spring Cloud Alibaba バージョン |
|---|---|
| Greenwich | 2.1.1.RELEASE |
| Finchley | 2.0.1.RELEASE |
| Edgware | 1.5.1.RELEASE |
Spring Cloud Edgware は保守終了となっています。新規プロジェクトで Edgware を使用しないでください。
ステップ 2:アプリケーションクラスの作成
src/main/java に com.aliware.edas パッケージを作成し、ProviderApplication.java を追加します。
package com.aliware.edas;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient // サービス登録とサービス検出を有効にします
@EnableFeignClients // FeignClient のスキャンを有効化します
public class ConsumerApplication {
@LoadBalanced // RestTemplate をサービス検出と統合して、クライアント側の負荷分散を実現します
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}ステップ 3:REST コントローラーの追加
同じパッケージ内に EchoController.java を作成し、/echo/{string} エンドポイントを公開します。
package com.aliware.edas;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return string;
}
}ステップ 4:レジストリアドレスの設定
src/main/resources に application.properties を作成します。
spring.application.name=service-provider
server.port=18081
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848Nacos Server が別のマシンで実行されている場合は、127.0.0.1 をその IP アドレスに置き換えてください。その他の構成オプションについては、「構成リファレンス」をご参照ください。
ステップ 5:登録の検証
ProviderApplicationのmainメソッドを実行して、サービスを起動します。Nacos コンソール
http://127.0.0.1:8848/nacos(ユーザー名 / パスワード:nacos/nacos)を開きます。サービス管理 > サービス に移動します。
service-providerがサービスリストに表示されます。詳細 をクリックすると、インスタンスの IP アドレスやポートなどの登録詳細を確認できます。
サービス利用者の作成
このサービス利用者は、プロバイダーを呼び出す 2 つのアプローチを示します。1 つはクライアント側負荷分散を備えた RestTemplate、もう 1 つは宣言型 HTTP クライアントとしての FeignClient です。
ステップ 1:Maven プロジェクトのセットアップ
nacos-service-consumer という名前の Maven プロジェクトを作成し、pom.xml に次の依存関係を追加します。
ステップ 2:Feign クライアントインターフェイスの定義
src/main/java に com.aliware.edas パッケージを作成し、EchoService.java を追加します。
package com.aliware.edas;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(name = "service-provider") // プロバイダーの登録済みサービス名を参照
public interface EchoService {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}ステップ 3:アプリケーションクラスの作成
同じパッケージ内に ConsumerApplication.java を作成します。
package com.aliware.edas;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient // サービス登録と検出を有効化
@EnableFeignClients // FeignClient のスキャンを有効化
public class ConsumerApplication {
@LoadBalanced // RestTemplate をサービス検出と統合し、クライアント側負荷分散を実現
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}アノテーションの概要:
@EnableDiscoveryClient-- このアプリケーションを Nacos に登録します。@EnableFeignClients--@FeignClientインターフェイスをスキャンし、プロキシ Bean を作成します。@LoadBalanced-- RestTemplate が DNS ではなくレジストリを通じてサービス名(例:service-provider)を解決できるようにします。
ステップ 4:テストコントローラーの追加
同じパッケージ内に TestController.java を作成し、異なるアプローチでプロバイダーを呼び出す 2 つのエンドポイントを実装します。
package com.aliware.edas;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private EchoService echoService;
// サービス検出を備えた RestTemplate を使用してプロバイダーを呼び出し
@RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
public String rest(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str,
String.class);
}
// FeignClient を使用してプロバイダーを呼び出し
@RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET)
public String feign(@PathVariable String str) {
return echoService.echo(str);
}
}ステップ 5:レジストリアドレスの設定
src/main/resources に application.properties を作成します。
spring.application.name=service-consumer
server.port=18082
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848Nacos Server が別のマシンで実行されている場合は、127.0.0.1 をその IP アドレスに置き換えてください。
ステップ 6:登録の検証
ConsumerApplicationのmainメソッドを実行して、サービスを起動します。Nacos コンソール
http://127.0.0.1:8848/nacosを開きます。サービス管理 > サービス に移動します。
service-consumerがservice-providerとともにサービスリストに表示されます。
ローカルでのサービス検出のテスト
両方のアプリケーションが実行中の状態で、エンドツーエンドのサービス検出をテストします。サービス利用者は Nacos を通じてサービス名 service-provider を解決し、各リクエストをプロバイダーに転送します。
Linux、UNIX、または macOS の場合:
# RestTemplate でテスト
curl http://127.0.0.1:18082/echo-rest/rest-rest
# FeignClient でテスト
curl http://127.0.0.1:18082/echo-feign/feign-restWindows の場合: ブラウザで次の URL を開きます。
http://127.0.0.1:18082/echo-rest/rest-resthttp://127.0.0.1:18082/echo-feign/feign-rest
期待される出力:
| エンドポイント | 期待される応答 |
|---|---|
/echo-rest/rest-rest | rest-rest |
/echo-feign/feign-rest | feign-rest |
両方のエンドポイントがパスパラメーターの値を返す場合、サービス登録と検出が正しく機能しています。
EDAS へのデプロイ
ローカルでの検証後、両方のアプリケーションを EDAS にデプロイします。EDAS はマネージド Nacos レジストリを提供しているため、コードを変更することなくアプリケーションが自動的に接続します。
デプロイ手順については、以下をご参照ください。
構成リファレンス
Nacos Discovery は、application.properties で次の構成プロパティをサポートしています。
| 構成項目 | キー | デフォルト値 | 説明 |
|---|---|---|---|
| サーバーアドレス | spring.cloud.nacos.discovery.server-addr | なし | Nacos Server の IP アドレスとポート |
| サービス名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | サービスの登録に使用する名前 |
| NIC 名 | spring.cloud.nacos.discovery.network-interface | なし | IP アドレスを登録するネットワークインターフェイス。未指定の場合、最初の NIC が使用されます |
| 登録 IP アドレス | spring.cloud.nacos.discovery.ip | なし | 自動検出した IP を上書きします。最も高い優先度を持ちます |
| 登録ポート | spring.cloud.nacos.discovery.port | -1 | デフォルトでは自動検出されます |
| 名前空間 | spring.cloud.nacos.discovery.namespace | なし | 環境間(例:dev、staging、production)でサービスを分離します |
| メタデータ | spring.cloud.nacos.discovery.metadata | なし | サービスインスタンスにアタッチされるカスタムのキーと値のペア。Map 形式で構成します |
| クラスター | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos クラスター名 |
| エンドポイント | spring.cloud.nacos.discovery.endpoint | UTF-8 | 動的なサーバーアドレス解決用のドメイン名。EDAS にデプロイする場合は不要です |
| Ribbon 統合 | ribbon.nacos.enabled | true | Nacos との Ribbon ベースの負荷分散を有効化します。必要な場合にのみ変更してください |
完全なリファレンスについては、GitHub の Nacos Discovery をご参照ください。