HSF フレームワークで RESTful アプリケーションを開発し、サービス登録と検出を実装します。 および SAE はネイティブ Spring Cloud アプリケーションをサポートしているため、この開発方法は新規ユーザーには推奨されません。
背景情報
ネイティブ Spring Cloud フレームワークを使用してサービスを開発する方法については、「」および「SAE での Spring Cloud アプリケーションのホスティング」をご参照ください。
サービス登録と検出
このセクションでは、サービス登録と検出機能を備えたローカル RESTful アプリケーションの開発手順を説明します。
- サービスプロバイダーを作成します。
このサービスプロバイダーは、シンプルなエコーサービスを公開し、サービスレジストリに自身を登録します。
- sc-vip-server という名前の RESTful アプリケーションプロジェクトを作成します。
- pom.xml ファイルに必要な依存関係を追加します。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>プロジェクトの親を
spring-boot-starter-parentに設定したくない場合は、dependencyManagementセクションを追加し、scope="import"を設定して依存関係を管理できます。<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.8.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - サービスプロバイダーアプリケーションを作成します。@EnableDiscoveryClient アノテーションを使用して、サービス登録と検出を有効にします。
@SpringBootApplication @EnableDiscoveryClient public class ServerApplication { public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ServerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } } - EchoController を作成して、シンプルなエコーサービスを提供します。
@RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } - resources ディレクトリ内の application.properties ファイルで、アプリケーション名とリッスンポートを設定します。
spring.application.name=service-provider server.port=18081
- サービスコンシューマーを作成します。
この例では、RestTemplate、AsyncRestTemplate、FeignClient を使用してサービスプロバイダーを呼び出すサービスコンシューマーを作成します。
- sc-vip-client という名前の RESTful アプリケーションプロジェクトを作成します。
- pom.xml ファイルに必要な依存関係を追加します。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vipclient</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-pandora</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>この例では、FeignClient を使用してデモンストレーションを行います。サービスプロバイダー (sc-vip-server) とは異なり、コンシューマーの pom.xml ファイルには、追加の
spring-cloud-starter-feign依存関係が含まれています。 - RestTemplate、AsyncRestTemplate、FeignClient を使用するには、(sc-vip-server と同様に) サービス登録と検出を有効にし、次の 2 つの設定を追加する必要があります。
- @LoadBalanced アノテーションを追加して、RestTemplate と AsyncRestTemplate をサービス検出と統合します。
- @EnableFeignClients アノテーションを追加して、FeignClient を有効にします。
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @LoadBalanced @Bean public AsyncRestTemplate asyncRestTemplate(){ return new AsyncRestTemplate(); } public static void main(String[] args) { PandoraBootstrap.run(args); SpringApplication.run(ConsumerApplication.class, args); PandoraBootstrap.markStartupAndWait(); } }
- EchoService 用に FeignClient を使用する前に、サービス名を設定し、メソッドを対応する HTTP リクエストにマッピングする必要があります。sc-vip-server プロジェクトでは、サービス名は service-provider として設定されています。
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } - Controller を作成して、サービス呼び出しをテストします。
@RestController public class Controller { @Autowired private RestTemplate restTemplate; @Autowired private AsyncRestTemplate asyncRestTemplate; @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-async-rest/{str}", method = RequestMethod.GET) public String asyncRest(@PathVariable String str) throws Exception{ ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate. getForEntity("http://service-provider/echo/"+str, String.class); return future.get().getBody(); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }このコードは、テスト用の 3 つのエンドポイントを実装しています。/echo-rest/:RestTemplate を使用したサービスプロバイダーへの呼び出しを検証します。/echo-async-rest/:AsyncRestTemplate を使用したサービスプロバイダーへの呼び出しを検証します。/echo-feign/:FeignClient を使用したサービスプロバイダーへの呼び出しを検証します。
- アプリケーション名とリッスンポートを設定します。
spring.application.name=service-consumer server.port=18082
- ローカルで開発とデバッグを行います。
- 軽量構成センターを起動します。
ローカル開発とデバッグには、軽量構成センターを使用します。これは、 および SAE で使用されるサーバー側のサービス登録と検出コンポーネントの軽量版を提供します。詳細については、「軽量構成・登録センターの起動」をご参照ください。
- アプリケーションを起動します。
- IDE から起動する
IDE からアプリケーションを起動するには、
-Dvipserver.server.port=8080という VM オプションを追加してから、main メソッドを実行します。注:このパラメーターは、軽量構成センターを使用したローカル開発にのみ必要です。アプリケーションを または SAE にデプロイする際には、このパラメーターを削除する必要があります。削除しないと、アプリケーションがサービスのパブリッシュまたはサブスクライブに失敗する可能性があります。軽量構成センターとアプリケーションが異なるマシン上にある場合は、ホストバインディングを設定してください。詳細については、「軽量構成・登録センターの起動」をご参照ください。
- FatJar から起動する
- FatJar パッケージングプラグインを追加します。
Maven を使用して pandora-boot プロジェクトを FatJar にパッケージ化するには、次のプラグインを pom.xml ファイルに追加します。競合を避けるため、ビルド設定の <plugins> セクションに他の FatJar プラグインを追加しないでください。
<build> <plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </build> - プラグインを追加した後、プロジェクトのルートディレクトリで
mvn clean packageコマンドを実行します。FatJar ファイルはtargetディレクトリに生成されます。 - Java コマンドを使用してアプリケーションを起動します。
java -Dvipserver.server.port=8080 -Dpandora.location=/Users/{$username}/.m2/repository/com/taobao/pandora/taobao-hsf.sar/dev-SNAPSHOT/taobao-hsf.sar-dev-SNAPSHOT.jar -jar sc-vip-server-0.0.1-SNAPSHOT.jar説明-Dpandora.locationで指定するパスは絶対パスにし、-jar引数の前に配置する必要があります。
- FatJar パッケージングプラグインを追加します。
サービスを起動し、エンドポイントを呼び出します。出力結果から、すべての呼び出しが成功したことが確認できます。→ ~ curl http://localhost:18082/echo-rest/rest-test rest-test% → ~ curl http://localhost:18082/echo-async-rest/async-rest-test async-rest-test% → ~ curl http://localhost:18082/echo-feign/feign-test feign-test% - IDE から起動する
- 軽量構成センターを起動します。
- よくある問題のトラブルシューティングを行います。
- AsyncRestTemplate がサービス検出に接続できない。
AsyncRestTemplate を使用したサービス検出のサポートは、Spring Cloud Dalston で追加されました。このバージョン以降を使用する必要があります。詳細については、この プルリクエスト をご参照ください。
- FatJar パッケージングプラグインとの競合。
競合を避けるため、ビルド設定の <plugins> セクションに他の FatJar プラグインを追加しないでください。
- taobao-hsf.sar をパッケージに含めることができますか。
はい、可能ですが推奨されません。
pandora-boot-maven-plugin の設定を変更し、excludeSarをfalseに設定することで、taobao-hsf.sar を自動的にパッケージに含めることができます。<plugin> <groupId>com.taobao.pandora</groupId> <artifactId>pandora-boot-maven-plugin</artifactId> <version>2.1.9.1</version> <configuration> <excludeSar>false</excludeSar> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>この方法により、Pandora の場所を設定せずにアプリケーションを起動できます。java -jar -Dvipserver.server.port=8080 sc-vip-server-0.0.1-SNAPSHOT.jarアプリケーションを または SAE にデプロイする前に、デフォルト設定に戻して SAR パッケージを除外してください。
- AsyncRestTemplate がサービス検出に接続できない。