環境要件
-
システム: Windows、Linux、MacOS
-
JDK 8以降(JDK17を推奨)
-
ギット
-
IntelliJ IDEA (オプション)
-
ドッカー (オプション)
プロジェクト紹介
このタスクでは、独立した開発のために 3 つのサブモジュールに分割され、運用環境でのデプロイメント アーキテクチャをシミュレートします。
. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot
├── dubbo-samples-spring-boot-interface // 共享 API 模块
├── dubbo-samples-spring-boot-consumer // 消费端模块
└── dubbo-samples-spring-boot-provider // 服务端模块
上図のように、モジュールは合計 3 つあり、 RPC 通信で使用する API インターフェースを格納する 2 つのモジュール と 共依存してinterface
います 。consumer
provider
. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot
├── dubbo-samples-spring-boot-interface // 共享 API 模块
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── org
│ └── apache
│ └── dubbo
│ └── springboot
│ └── demo
│ └── DemoService.java // API 接口
├── dubbo-samples-spring-boot-consumer // 消费端模块
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── org
│ │ │ └── apache
│ │ │ └── dubbo
│ │ │ └── springboot
│ │ │ └── demo
│ │ │ └── consumer
│ │ │ ├── ConsumerApplication.java // 消费端启动类
│ │ │ └── Task.java // 消费端模拟调用任务
│ │ └── resources
│ │ └── application.yml // Spring Boot 配置文件
├── dubbo-samples-spring-boot-provider // 服务端模块
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── apache
│ │ └── dubbo
│ │ └── springboot
│ │ └── demo
│ │ └── provider
│ │ ├── DemoServiceImpl.java // 服务端实现类
│ │ └── ProviderApplication.java // 服务端启动类
│ └── resources
│ └── application.yml // Spring Boot 配置文件
└── pom.xml
上記は、このチュートリアルで使用するプロジェクトのファイル構造です。
迅速な導入 (サンプルに基づいて直接開始)
この章では、いくつかの簡単なコマンドを使用して、Dubbo x Spring Boot に基づくユースケースをデプロイおよび実行する方法を段階的に説明します。
注: この章でデプロイされたコードの詳細は、 apache/dubbo-samples ウェアハウス にあります 1-basic/dubbo-samples-spring-boot
。これについては次の章で説明します。
1. テストプロジェクトを取得する
チュートリアル全体を開始する前に、テスト プロジェクトのコードを取得する必要があります。Dubbo のすべてのテスト ケース コードは 、 apache/dubbo-samples ウェアハウスに保存されています。次のコマンドを使用すると、サンプル ウェアハウス内のすべてのコードを取得できます。
git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git
2. 単純なレジストリを開始します
マイクロサービス アプリケーションにとって、レジストリは不可欠なコンポーネントです。消費者は登録センターを介してのみサーバーのアドレス情報を発見し、電話をかけることができます。
このチュートリアルを簡単に開始できるように、Apache Zookeeper レジストリに基づいたシンプルなスターターが提供されています。実稼働環境にレジストリをデプロイする必要がある場合は、実稼働環境の初期化に関する記事を参照して、高可用性レジストリをデプロイしてください。
Windows:
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
Docker:
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
3. ローカルパッケージング API モジュール
サーバー モジュールとコンシューマ モジュールを正常にコンパイルするには、最初にモジュールをパッケージ化してローカルにインストールする必要があります dubbo-samples-spring-boot-interface
。
./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot
./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-interface
4. サービスプロバイダーを開始します
レジストリを起動したら、次のステップは、外部にサービスを提供するサービス プロバイダーを起動することです。対応するサンプルは dubbo-samples でも提供されており、次のコマンドですぐに取得できます。
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication"
注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。
上記コマンド実行後、しばらく待つと以下のログ(Current Spring Boot Application is await
)が表示されます。これはサービスプロバイダが起動し、サービスプロバイダが外部にサービスを提供できることを意味します。
2023-02-08 17:13:00.357 INFO 80600 --- [lication.main()] o.a.d.c.d.DefaultApplicationDeployer : [DUBBO] Dubbo Application[1.1](dubbo-springboot-demo-provider) is ready., dubbo version: 3.2.0-beta.4, current host: 30.221.128.96
2023-02-08 17:13:00.369 INFO 80600 --- [lication.main()] o.a.d.s.d.provider.ProviderApplication : Started ProviderApplication in 9.114 seconds (JVM running for 26.522)
2023-02-08 17:13:00.387 INFO 80600 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
5. サービスコンシューマを開始します
最後のステップは、サービス コンシューマを起動してサービス プロバイダを呼び出すことです。これは RPC 呼び出しの核心であり、サービス コンシューマがサービス プロバイダを呼び出すためのブリッジを提供します。
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication"
上記コマンド実行後、以下のようなログ( )が表示されるまでしばらく待つとHello world
、サービスプロバイダによる処理後に印刷データが返され、サービス呼び出しが成功したことになります。
2023-02-08 17:14:33.045 INFO 80740 --- [lication.main()] o.a.d.s.d.consumer.ConsumerApplication : Started ConsumerApplication in 11.052 seconds (JVM running for 31.62)
Receive result ======> Hello world
2023-02-08 17:14:33.146 INFO 80740 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
Wed Feb 08 17:14:34 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:35 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:36 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:37 CST 2023 Receive result ======> Hello world
実践演習(ゼロコード開発版から)
この章では、ステップバイステップのチュートリアルを通じて、マイクロサービス アプリケーションを最初から開発する方法を説明します。
1. レジストリを起動します
マイクロサービス アプリケーションにとって、レジストリは不可欠なコンポーネントです。消費者は登録センターを介してのみサーバーのアドレス情報を発見し、電話をかけることができます。
このチュートリアルを簡単に開始できるように、Apache Zookeeper レジストリに基づいたシンプルなスターターが提供されています。実稼働環境にレジストリをデプロイする必要がある場合は、実稼働環境の初期化に関する記事を参照して、高可用性レジストリをデプロイしてください。
Windows:
git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git
cd dubbo-samples
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
git clone --depth=1 --branch master [email protected]:apache/dubbo-samples.git
cd dubbo-samples
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
Docker:
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
2. プロジェクトを初期化する
このセクションから、IntelliJ IDEA に基づいてプロジェクトが構築され、テストされます。
上記のように、基本的なプロジェクトを構築できます。
基本プロジェクトを構築した後、 と dubbo-spring-boot-demo-interface
3 つのサブモジュールも作成する必要があります 。dubbo-spring-boot-demo-provider
dubbo-spring-boot-demo-consumer
3 つのサブモジュールを作成した後、次のフォルダーを作成する必要があります。
-
dubbo-spring-boot-demo-consumer/src/main/java
以下にorg.apache.dubbo.springboot.demo.consumer
パッケージを作成します -
dubbo-spring-boot-demo-interface/src/main/java
以下にorg.apache.dubbo.springboot.demo
パッケージを作成します -
dubbo-spring-boot-demo-provider/src/main/java
以下にorg.apache.dubbo.springboot.demo.provider
パッケージを作成します
最終的なフォルダー参照は上の画像に示されています。
3.Maven 依存関係を追加する
プロジェクトを初期化した後、最初に Dubbo 関連の Maven 依存関係を追加する必要があります。
マルチモジュール プロジェクトの場合は、まず親プロジェクトで pom.xml
依存関係情報を構成する必要があります。
このファイルを編集し ./pom.xml
、次の構成を追加します。
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-spring-boot-demo-interface</module>
<module>dubbo-spring-boot-demo-provider</module>
<module>dubbo-spring-boot-demo-consumer</module>
</modules>
<properties>
<dubbo.version>3.2.0-beta.4</dubbo.version>
<spring-boot.version>2.7.8</spring-boot.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
次に、 dubbo-spring-boot-consumer
2 つの dubbo-spring-boot-provider
モジュール pom.xml
で特定の依存関係を構成します。
次の構成を編集し ./dubbo-spring-boot-consumer/pom.xml
て 両方のファイルに追加します。./dubbo-spring-boot-provider/pom.xml
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-demo-interface</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-reload4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- spring boot starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
この構成では、dubbo と Zookeeper (および対応するコネクタ キュレーター) の依存関係が定義されます。
上記の構成を追加した後、 Maven - Reload All Maven Projects
IDEA を通じて依存関係を更新できます。
4. サービスインターフェースを定義する
サービス インターフェイスは、Dubbo のコンシューマとサーバーの間のブリッジです。
次のように定義されたmodule dubbo-spring-boot-demo-interface
の org.apache.dubbo.samples.api
下にインターフェイスを作成します DemoService
。
package org.apache.dubbo.springboot.demo;
public interface DemoService {
String sayHello(String name);
}
では 、 このメソッドGreetingsService
が定義されています 。sayHi
サーバーによって公開される後続のサービスと、コンシューマーによってサブスクライブされるサービスは、すべてインターフェイスを中心に GreetingsService
開発されます。
5. サーバーの実装を定義する
サービス インターフェイスを定義した後、サーバー側で対応する実装を定義できますが、コンシューマ側と比較すると、実装のこの部分はリモート実装であり、ローカルには関連する情報がありません。
moduledubbo-spring-boot-demo-provider
の org.apache.dubbo.samples.provider
下にクラスを作成し DemoServiceImpl
、次のように定義します。
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.springboot.demo.DemoService;
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
では 、 メソッド が返す DemoServiceImpl
インターフェースが実装されています 。DemoService
sayHello
Hello name
注: アノテーションはDemoServiceImpl
クラスに追加されます 。この構成を通じて、Spring Boot に基づいて Dubbo サービスを公開できます。@DubboService
6. サーバー側の Yaml 構成ファイルを構成する
このステップからステップ 7 までで、Dubbo のいくつかの基本情報が Spring Boot を通じて設定されます。
まず、サーバーの構成ファイルを作成しましょう。
dubbo-spring-boot-demo-provider
module の resources
リソース フォルダー の下に application.yml
、次のように定義されたファイルを作成します。
dubbo:
application:
name: dubbo-springboot-demo-provider
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
この設定ファイルでは、Dubbo アプリケーション名、Dubbo プロトコル情報、Dubbo が使用するレジストリ アドレスが定義されます。
7. コンシューマ側の YAML 構成ファイルを構成する
同様に、コンシューマー用の構成ファイルを作成する必要があります。
dubbo-spring-boot-demo-consumer
module の resources
リソース フォルダー の下に application.yml
、次のように定義されたファイルを作成します。
dubbo:
application:
name: dubbo-springboot-demo-consumer
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
この設定ファイルでは、Dubbo アプリケーション名、Dubbo プロトコル情報、Dubbo が使用するレジストリ アドレスが定義されます。
8. Spring に基づいてサーバー起動クラスを構成する
Yaml 構成ファイルの構成に加えて、Spring Boot ベースのスタートアップ クラスも作成する必要があります。
まず、サーバーの起動クラスを作成します。
module dubbo-spring-boot-demo-provider
の org.apache.dubbo.springboot.demo.provider
下にクラスを作成し Application
、次のように定義します。
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
このスタートアップ クラスでは、 ProviderApplication
前の手順 6 で定義した構成ファイルを読み取り application.yml
、アプリケーションを起動するように構成されています。
9. Spring に基づいてコンシューマー スタートアップ クラスを構成する
同様に、コンシューマ用のスタートアップ クラスを作成する必要があります。
module dubbo-spring-boot-demo-consumer
の org.apache.dubbo.springboot.demo.consumer
下にクラスを作成し Application
、次のように定義します。
package org.apache.dubbo.springboot.demo.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
このスタートアップ クラスでは、 ConsumerApplication
上記の手順 7 で定義された構成ファイルを読み取り application.yml
、アプリケーションを起動するように構成されています。
10. コンシューマリクエストタスクの構成
コンシューマ側のスタートアップクラスの設定に加えて、 Spring Boot モードに基づいて CommandLineRunner
作成することもできます
module dubbo-spring-boot-demo-consumer
の org.apache.dubbo.springboot.demo.consumer
下にクラスを作成し Task
、次のように定義します。
package org.apache.dubbo.springboot.demo.consumer;
import java.util.Date;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.springboot.demo.DemoService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class Task implements CommandLineRunner {
@DubboReference
private DemoService demoService;
@Override
public void run(String... args) throws Exception {
String result = demoService.sayHello("world");
System.out.println("Receive result ======> " + result);
new Thread(()-> {
while (true) {
try {
Thread.sleep(1000);
System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}).start();
}
}
Task
クラス内では 、 @DubboReference
Dubbo から RPC サブスクリプションを取得することで、 demoService
ローカル呼び出しと同様に直接呼び出すことができます。run
呼び出しを行うメソッド内にスレッドが作成されます。
11. アプリケーションを起動します
ステップ 10 の時点でコードは開発されており、このセクションではプロジェクト全体を開始して検証します。
まず を起動すると org.apache.dubbo.samples.provider.Application
、しばらくすると下図のようなログ(Current Spring Boot Application is await
)が表示され、サービスプロバイダが起動し、サービスプロバイダが外部にサービスを提供できるようになります。
[Dubbo] Current Spring Boot Application is await...
しばらくすると、 下図のようなorg.apache.dubbo.samples.client.Application
ログ( )が表示され、サービスコンシューマが起動してサーバを呼び出し、結果が正常に取得されたことがわかります。Hello world
Receive result ======> Hello world