このトピックでは、サービスプロバイダーとサービス利用者を含む Spring Cloud アプリケーションを例に、アプリケーションをローカルで開発・デバッグし、SAE にデプロイし、サービス登録、検出、および利用者からプロバイダーへの呼び出しを有効にする方法を説明します。
背景情報
Spring Cloud に精通していないが、Spring と Maven の基本的な知識がある場合、このトピックは Spring Cloud Alibaba Nacos Discovery を使用して Spring Cloud アプリケーションのサービス登録と検出を実装する方法を学ぶのに役立ちます。また、利用者からプロバイダーへの呼び出しを有効にする方法も学びます。
Eureka、Consul、ZooKeeper などの Spring Cloud のサービス登録コンポーネントに精通しているが、Spring Cloud Alibaba の Nacos Discovery コンポーネントを使用したことがない場合、既存のサービス登録の依存関係と構成を Spring Cloud Alibaba Nacos Discovery のものに置き換えるだけで済みます。コードの変更は不要です。
Spring Cloud Alibaba Nacos Discovery は、Spring Cloud Registry の標準インターフェイスと仕様を実装しています。したがって、Spring Cloud を使用してサービスレジストリに接続するプロセスは、ほとんど変わりません。
オープンソース版の Spring Cloud Alibaba Nacos Discovery を使用して Spring Cloud アプリケーションでサービス登録と検出を行うことに精通している場合、アプリケーションを直接 SAE にデプロイして、SAE が提供する商用サービス登録・検出機能を利用できます。 詳細については、「アプリケーションホスティングの概要」をご参照ください。
SAE サービスレジストリを使用する理由
SAE サービスレジストリは、オープンソースの Nacos Server の商用版を提供します。オープンソースの Spring Cloud Alibaba Nacos Discovery で開発されたアプリケーションは、SAE が提供する商用サービスレジストリを直接使用できます。
SAE サービスレジストリは、Nacos、Eureka、Consul などの自己管理型レジストリに比べて、いくつかの利点があります:
共有コンポーネント:Nacos、Eureka、または Consul をデプロイまたは維持する必要がなく、コストを削減できます。
暗号化されたリンク:サービス登録と検出の呼び出しは暗号化され、不正なアプリケーションによるサービスの検出から保護されます。
SAE サービスレジストリは、他の SAE コンポーネントとシームレスに統合されており、環境分離や段階的リリースなど、包括的なマイクロサービスソリューションを提供します。
アプリケーションを SAE にデプロイすると、SAE サービスレジストリは Nacos Server のアドレス、サービスポート、名前空間、AccessKey、および Context-path を自動的に設定します。これらの設定が優先され、追加の構成は不要です。
マイクロサービスアプリケーションが多数ある場合は、推奨レベルの高い順にリストされている次のいずれかのタイプのサービスレジストリを使用できます:
事前準備
Maven をダウンロードし、環境変数を設定します。
Nacos Server を起動します。
Nacos Server パッケージをダウンロードして解凍します。
nacos/bin ディレクトリに移動し、Nacos Server を起動します。
Linux、UNIX、または macOS:
sudo sh startup.sh -m standaloneコマンドを実行します。Windows:
startup.cmd -m standaloneコマンドを実行します。
説明standaloneは、startup.cmd ファイルがクラスターモードではなくスタンドアロンモードで実行されることを示します。デフォルトでは、startup.cmd ファイルはクラスターモードで起動されます。Windows システムで startup.cmd ファイルをダブルクリックして実行すると、起動に失敗します。この場合、startup.cmd ファイルにMODE="standalone"を設定する必要があります。詳細については、「」Quick Start for Nacos をご参照ください。
ステップ 1:サービスプロバイダーの作成
ローカル環境でサービスプロバイダーアプリケーションプロジェクトを作成します。依存関係を追加し、サービス登録と検出を有効にし、Nacos Server をサービスレジストリとして指定します。
nacos-service-providerという名前の Maven プロジェクトを作成します。pom.xmlファイルに依存関係を追加します。具体的な例については、「nacos-service-provider」をご参照ください。このトピックでは、Spring Boot 2.1.4.RELEASE と Spring Cloud Greenwich.SR1 を使用し、次の依存関係があります:
説明Spring Boot 2.4 以降はサポートされていません。Spring Cloud Alibaba 2.2.6.RELEASE (クライアントバージョン 1.4.2) がサポートされています。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>この例では、Spring Cloud Greenwich を使用しています。対応する Spring Cloud Alibaba のバージョンは 2.1.1.RELEASE です。
Spring Cloud Finchley を使用する場合、対応する Spring Cloud Alibaba のバージョンは 2.0.1.RELEASE です。
Spring Cloud Edgware を使用する場合、対応する Spring Cloud Alibaba のバージョンは 1.5.1.RELEASE です。
説明Spring Cloud Edgware はライフサイクルの終わりに達しています。このバージョンを使用してアプリケーションを開発しないことを推奨します。
src/main/javaに、com.aliware.edasパッケージを作成します。com.aliware.edasパッケージに、ProviderApplicationという名前のサービスプロバイダー用の起動クラスを作成し、次のコードを追加します。@EnableDiscoveryClientアノテーションは、このアプリケーションのサービス登録と検出を有効にします。package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }com.aliware.edasパッケージに、EchoControllerを作成します。EchoControllerで、URL マッピングを/echo/{string}として指定し、HTTP メソッドを GET に設定し、URL パスからメソッドパラメーターを取得して、受信したパラメーターを返します。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; } }src\main\resourcesパスにapplication.propertiesファイルを作成します。application.propertiesに、次の構成を追加して Nacos Server のアドレスを指定します。spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848この例では、
127.0.0.1は Nacos Server のアドレスです。Nacos Server が別のマシンにデプロイされている場合は、これを対応する IP アドレスに変更する必要があります。他の要件がある場合は、application.propertiesファイルに構成を追加できます。詳細については、「設定項目」をご参照ください。結果を検証します。
nacos-service-providerのProviderApplicationのmain関数を実行して、アプリケーションを起動します。ローカル Nacos Server コンソールに
http://127.0.0.1:8848/nacosでログインします。ローカル Nacos コンソールのデフォルトのユーザー名とパスワードはどちらも nacos です。
左側のナビゲーションウィンドウで、[サービス管理] > [サービスリスト] を選択します。
サービスリストに
service-providerが表示され、[詳細] をクリックしてこのサービスの詳細を表示できます。
ステップ 2:サービス利用者の作成
このセクションでは、Nacos を使用してサービス検出を行い、RestTemplate と FeignClient を使用してプロバイダーを呼び出すサービス利用者を作成する方法について説明します。
nacos-service-consumerという名前の Maven プロジェクトを作成します。pom.xmlファイルに依存関係を追加します。具体的な例については、「nacos-service-consumer」をご参照ください。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>src/main/javaディレクトリに、com.aliware.edasパッケージを作成します。com.aliware.edasパッケージで RestTemplate と FeignClient を構成します。com.aliware.edasパッケージに、EchoServiceという名前のインターフェイスを作成し、@FeignClientアノテーションを追加して、対応する HTTP URL とメソッドを構成します。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); }com.aliware.edasパッケージに、ConsumerApplicationという名前の起動クラスを作成し、必要な構成を追加します。サービス登録と検出を有効にするには、
@EnableDiscoveryClientアノテーションを使用します。@EnableFeignClientsアノテーションを使用して FeignClient をアクティブ化します。@LoadBalancedアノテーションを追加して、RestTemplate をサービス検出と統合します。
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 public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
com.aliware.edasパッケージに、サービス検出機能をデモンストレーションおよび検証するためのTestControllerクラスを作成します。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; @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }src\main\resourcesパスに、application.propertiesという名前のファイルを作成します。application.propertiesファイルに、次の構成を追加して Nacos Server のアドレスを指定します。spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848この例では、
127.0.0.1は Nacos Server のアドレスです。Nacos Server が別のマシンにデプロイされている場合は、そのマシンの IP アドレスに値を変更する必要があります。他の要件がある場合は、application.propertiesファイルに構成を追加できます。詳細については、「設定項目」をご参照ください。結果を検証します。
nacos-service-consumerプロジェクトのConsumerApplicationクラスのmain関数を実行して、アプリケーションを起動します。ローカル Nacos Server コンソールに
http://127.0.0.1:8848/nacosでログインします。ローカル Nacos コンソールのデフォルトのユーザー名とパスワードはどちらも nacos です。
左側のナビゲーションウィンドウで、[サービス管理] > [サービスリスト] を選択します。サービスリストに
service-consumerが表示され、[詳細] をクリックしてこのサービスの詳細を表示できます。
ステップ 3:ローカルテスト
ローカル環境で、利用者からプロバイダーへのサービス呼び出しをテストします。
Linux、UNIX、macOS の場合:次のコマンドを実行します。
curl http://127.0.0.1:18082/echo-rest/rest-rest curl http://127.0.0.1:18082/echo-feign/feign-restWindows の場合:ブラウザに http://127.0.0.1:18082/echo-rest/rest-rest と http://127.0.0.1:18082/echo-feign/feign-rest を入力します。
ステップ 4:アプリケーションの SAE へのデプロイ
アプリケーションのローカルでの開発とテストが完了したら、パッケージ化して SAE にデプロイできます。
nacos-service-provider と nacos-service-consumer は 2 つの別々のアプリケーションとしてデプロイされ、同じリージョンと名前空間にデプロイする必要があります。詳細については、「Java アプリケーションのデプロイ」をご参照ください。
JAR パッケージをデプロイする場合、アプリケーションのデプロイ構成で [アプリケーション実行環境] を [標準 Java アプリケーション実行環境] に設定します。
WAR パッケージをデプロイする場合、アプリケーションのデプロイ構成で [アプリケーション実行環境] を [apache-tomcat-XXX] に設定します。
アプリケーションを SAE にデプロイすると、SAE サービスレジストリは Nacos Server のアドレス、サービスポート、名前空間、AccessKey、および Context-path 情報を高い優先度で自動的に設定します。追加の構成を行う必要はありません。元の構成を保持または削除できます。
ステップ 5:結果の検証
SAE にデプロイされた
nacos-service-consumerアプリケーションにパブリック CLB をバインドします。CLB のパブリックアクセスを構成する際、[ネットワークプロトコル] に [HTTP] を選択し、[HTTP ポート] を80に、[コンテナポート] を18082に設定します。詳細については、「アプリケーションへの CLB のバインド」をご参照ください。ブラウザのアドレスバーに、アプリケーションのパブリック IP アドレスを
http://<Public IP address>/echo-rest/rest-restまたはhttp://<Public IP address>/echo-feign/feign-restの形式で入力し、Enter キーを押します。ページに応答が返された場合、アプリケーションは正常にデプロイされています。
設定項目
設定項目 | キー | デフォルト値 | 説明 |
サーバーアドレス | spring.cloud.nacos.discovery.server-addr | なし | Nacos Server がリッスンする IP アドレスとポート。 |
サービス名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 現在のサービスの名前。 |
ネットワークインターフェース名 | spring.cloud.nacos.discovery.network-interface | なし | IP アドレスが構成されていない場合、このネットワークインターフェースに対応する IP アドレスが登録されます。ネットワークインターフェース名が構成されていない場合、デフォルトで最初のネットワークインターフェースの IP アドレスが使用されます。 |
登録済み IP アドレス | spring.cloud.nacos.discovery.ip | なし | 高い優先度。 |
登録済みポート | spring.cloud.nacos.discovery.port | -1 | このパラメーターを構成する必要はありません。システムが自動的にポートを検出します。 |
名前空間 | spring.cloud.nacos.discovery.namespace | なし | 異なる環境の登録を論理的に分離します。たとえば、構成やサービスなどのリソースは、開発環境と本番環境の間で分離されます。 |
メタデータ | spring.cloud.nacos.discovery.metadata | なし | このパラメーターをマップ形式で構成します。要件に応じて、サービス関連のメタデータをカスタマイズできます。 |
クラスター | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos クラスターの名前。 |
エンドポイント | spring.cloud.nacos.discovery.endpoint | なし | リージョン内のサービスのドメイン名。このドメイン名を通じてサーバーアドレスを動的に取得できます。この構成は SAE にデプロイする場合には不要です。 |
Ribbon との統合 | ribbon.nacos.enabled | true | 必要な場合を除き、値を変更しないでください。 |
Spring Cloud Alibaba Nacos Discovery の詳細については、「Nacos Discovery」をご参照ください。



