このチュートリアルでは、Apache Dubbo アプリケーション用に Microservices Engine (MSE) 上でサービスレジストリを構築し、サービス登録とサービスディスカバリに使用する方法について説明します。最終的に、ローカルマシンで実行されている Dubbo コンシューマーが、MSE Nacos レジストリを介して検出したプロバイダーを呼び出します。
アーキテクチャ
このサンプルアプリケーションは、プロバイダーとコンシューマーで構成される Dubbo マイクロサービスアプリケーションです。ローカルマシン上で 2 つのロールを 2 つの個別の Maven プロジェクトとして開発し、両方ともパブリックエンドポイントを介して MSE 上の同じレジストリインスタンスに接続します。
プロバイダープロジェクト — ポート 28082 で
com.alibaba.mse.IHelloServiceインターフェイスを Dubbo サービスとして公開し、そのサービスを MSE 上のレジストリインスタンスに登録します。コンシューマープロジェクト — 同じレジストリインスタンスを介して
com.alibaba.mse.IHelloServiceをサブスクライブし、プロバイダーを呼び出します。MSE 上のレジストリインスタンス — プロバイダーが登録し、コンシューマーがサブスクライブするサービスレジストリとして機能します。
レジストリのタイプ
MSE は、Dubbo アプリケーション用の Nacos、ZooKeeper、または Eureka のサービスレジストリをホストできます。このチュートリアルでは MSE Nacos を使用し、このトピックのすべての設定例は MSE Nacos インスタンスを対象としています。
Nacos (このチュートリアルで使用) — Dubbo レジストリのアドレスを MSE Nacos インスタンスのパブリックエンドポイントに設定します。他のレジストリ固有の設定は不要です。
ZooKeeper — サービスレジストリとして MSE ZooKeeper を使用する場合は、ステップ 2 のレジストリコードを ZooKeeper の対応するコードに置き換えてください。詳細については、「使用上の注意」をご参照ください。
前提条件
Maven をダウンロードし、環境変数を設定します。
IntelliJ IDEA や Eclipse などの IDE がローカルマシンにインストールされています。
MSE Nacos インスタンスを作成します。手順については、「Nacos エンジンインスタンスの作成」をご参照ください。
名前空間を作成します。このチュートリアルでは、デフォルトの名前空間
Publicを使用します。
ステップ 1:プロバイダープロジェクトの作成とサービスの定義
このステップでは、プロバイダー用の Maven プロジェクトを作成し、プロバイダーが公開するサービスを定義します。Dubbo では、すべてのサービスがインターフェイスとして提供されます。
IDE で、プロバイダー用の Maven プロジェクトを作成します。
dubboとnacos-clientの依存関係をpom.xmlファイルに追加します。<dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.9</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.4.2</version> </dependency> </dependencies>src/main/javaディレクトリに、com.alibaba.mseという名前のパッケージを作成します。com.alibaba.mseに、sayHelloメソッドを含むIHelloServiceという名前のインターフェイスを作成します。package com.alibaba.mse; public interface IHelloService { String sayHello(String str); }com.alibaba.mseに、インターフェイスを実装するIHelloServiceImplという名前のクラスを作成します。package com.alibaba.mse; public class IHelloServiceImpl implements IHelloService { public String sayHello(String str) { return "hello " + str; } }
ステップ 2:MSE Nacos をレジストリとして使用するためのプロバイダーの設定
このステップでは、IHelloService を Dubbo サービスとして公開し、プロバイダーを MSE Nacos インスタンスに向ける provider.xml ファイルを作成します。レジストリの設定にはインスタンスのエンドポイントが必要なため、最初にそれを取得します。
MSE コンソールにログインし、MSE 上に作成した Nacos インスタンスのパブリックエンドポイントを表示します。パブリックエンドポイントは、インスタンスリストの アクセス方法 列に
mse.XX.nacos.mse.aliyuncs.comの形式で表示されます。プロバイダープロジェクトの
src/main/resourcesディレクトリに、provider.xmlという名前のファイルを作成します。provider.xmlに次の設定を追加します。mse.XX.nacos.mse.aliyuncs.comをお使いの Nacos インスタンスのパブリックエンドポイントに置き換えてください。<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="demo-provider"/> <dubbo:protocol name="dubbo" port="28082"/> <dubbo:service interface="com.alibaba.mse.IHelloService" ref="helloService"/> <bean id="helloService" class="com.alibaba.mse.IHelloServiceImpl"/> <dubbo:registry address="nacos://mse.XX.nacos.mse.aliyuncs.com:8848" /> </beans>
次の表では、provider.xml の設定について説明します。
| 要素 | 説明 |
xmlns、xmlns:xsi、xmlns:dubbo、および xsi:schemaLocation | Spring XML 名前空間 (xmlns) と XML スキーマインスタンス (xmlns:xsi)、および Dubbo 名前空間 (xmlns:dubbo) とスキーマインスタンス (xsi:schemaLocation) を宣言します。 |
dubbo:application | プロバイダーアプリケーションの名前。この例では demo-provider を使用します。 |
dubbo:protocol | ポート 28082 で Dubbo プロトコルを介してサービスを公開します。 |
dubbo:service および bean | IHelloService インターフェイスと IHelloServiceImpl 実装クラスを Dubbo サービスとして公開します。 |
dubbo:registry | MSE 上に作成した Nacos インスタンスをサービスレジストリとして指定します。アドレスはインスタンスのパブリックエンドポイントです。 |
ステップ 3:プロバイダーから MSE インスタンスへのアクセス許可
プロバイダーは MSE インスタンスのパブリックエンドポイントを介してレジストリにアクセスするため、インスタンスのホワイトリストでトラフィックを許可する必要があります。プロバイダーを起動する前に、このステップを完了してください。そうしないと、登録が失敗します。
MSE コンソールで、左側メニューから を選択します。インスタンス ページで、作成した MSE インスタンスをクリックします。
インスタンスのホワイトリストをクリアします。IP アドレスやマスクを指定しない場合、すべてのアドレスがインスタンスにアクセスできます。このチュートリアルでは、空のホワイトリストを例として使用します。詳細については、「ホワイトリストの設定」をご参照ください。
ホワイトリストが空の場合、すべてのアドレスが MSE インスタンスにアクセスできます。
ステップ 4:プロバイダーの起動と登録の確認
このステップでは、プロバイダーを起動し、サービスが Nacos インスタンスに登録されていることを MSE コンソールで確認します。
com.alibaba.mseに、Providerという名前のクラスを作成します。次のコードを使用して、Providerのmainメソッドで Spring コンテキストをロードし、設定した Dubbo サービスを公開します。package com.alibaba.mse; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"provider.xml"}); context.start(); System.in.read(); } }Providerのmainメソッドを実行してサービスを起動します。コンシューマーがこのプロセスを呼び出すため、チュートリアルが完了するまでプロセスを実行し続けてください。MSE コンソールで、MSE インスタンスの詳細ページに移動し、左側メニューで を選択します。
サービスリストに、
demo-providerアプリケーションが公開するインターフェイスであるcom.alibaba.mse.IHelloServiceが含まれていることを確認します。
サービスリストにインターフェイスが表示されるまで、次のステップに進まないでください。インターフェイスが表示されない場合は、次の設定を確認してください:
ホワイトリスト — MSE インスタンスのホワイトリストで、ローカルマシンのアドレスが許可されていること。ホワイトリストが空の場合は、すべてのアドレスが許可されます。
レジストリアドレス —
provider.xmlのdubbo:registryアドレスに、mse.XX.nacos.mse.aliyuncs.comプレースホルダーではなく、インスタンスのパブリックエンドポイントが使用されていること。レジストリのタイプ —
dubbo:registryアドレスに、作成したインスタンスタイプのスキーム (MSE Nacos インスタンスの場合はnacos://など) が使用されていること。
ステップ 5:コンシューマーの作成とサービスのサブスクライブ
このステップでは、コンシューマー用の 2 つ目の Maven プロジェクトを作成し、同じ MSE Nacos インスタンスを介して com.alibaba.mse.IHelloService をサブスクライブし、プロバイダーを呼び出すクラスを実装します。
IDE で、コンシューマー用の 2 つ目の Maven プロジェクトを作成します。
コンシューマープロジェクトの
pom.xmlファイルにdubboとnacos-clientの依存関係を追加します。この依存関係は、ステップ 1 のプロバイダープロジェクトのものと同一です。src/main/javaディレクトリにcom.alibaba.mseパッケージを作成し、ステップ 1 で定義したIHelloServiceインターフェイスを追加します。コンシューマーはインターフェイスによってサービスを参照するため、そのインターフェイスがコンシューマープロジェクトのクラスパス上にある必要があります。コンシューマープロジェクトの
src/main/resourcesディレクトリに、consumer.xmlという名前のファイルを作成します。mse.XX.nacos.mse.aliyuncs.comを、provider.xmlで設定したのと同じ Nacos インスタンスのパブリックエンドポイントに置き換えてください。<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="demo-consumer"/> <dubbo:registry address="nacos://mse.XX.nacos.mse.aliyuncs.com:8848" /> <dubbo:reference id="helloService" interface="com.alibaba.mse.IHelloService"/> </beans>dubbo:registry要素はコンシューマーをプロバイダーと同じレジストリに向け、dubbo:reference要素はプロバイダーが公開するcom.alibaba.mse.IHelloServiceインターフェイスをサブスクライブします。com.alibaba.mseに、Consumerという名前のクラスを作成します。次のコードを使用して、Consumerのmainメソッドで Spring コンテキストをロードし、サブスクライブしたサービスのsayHelloメソッドを呼び出します。package com.alibaba.mse; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"}); context.start(); IHelloService helloService = (IHelloService) context.getBean("helloService"); System.out.println(helloService.sayHello("mse")); } }
ステップ 6:コンシューマーからプロバイダーへの呼び出しの確認
このステップでは、コンシューマーが MSE Nacos レジストリを介してプロバイダーを検出し、sayHello メソッドのレスポンスを受信することを確認します。コンシューマーは引数として mse を渡し、IHelloServiceImpl は hello の後にその引数を付けて返します。
ステップ 4 で起動したプロバイダーのプロセスがまだ実行中であることを確認します。
Consumerのmainメソッドを実行します。コンシューマープロジェクトのコンソール出力を確認します。次の出力は、コンシューマーがプロバイダーを正常に呼び出したことを示します:
hello mse
呼び出しが失敗した場合、または出力が返されない場合は、次の設定を確認してください:
プロバイダーの可用性 — プロバイダーのプロセスが実行中であり、MSE インスタンスのサービスリストに
com.alibaba.mse.IHelloServiceが表示されていること。レジストリアドレス —
consumer.xmlのdubbo:registryアドレスが、provider.xmlで設定したパブリックエンドポイントであること。インターフェイス名 —
consumer.xmlのdubbo:reference要素内のインターフェイスが、provider.xmlのdubbo:service要素内のインターフェイスであるcom.alibaba.mse.IHelloServiceと一致していること。ホワイトリスト — MSE インスタンスのホワイトリストで、ローカルマシンのアドレスが許可されていること。