マイクロサービス アプリケーションを開発するための Dubbo Spring Boot Starter

環境要件

  • システム: 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 います  。consumerprovider

.  // 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-providerdubbo-spring-boot-demo-consumer

 

 

画像

画像

画像

画像

3 つのサブモジュールを作成した後、次のフォルダーを作成する必要があります。

  1. dubbo-spring-boot-demo-consumer/src/main/java 以下に  org.apache.dubbo.springboot.demo.consumer パッケージを作成します

  2. dubbo-spring-boot-demo-interface/src/main/java 以下に  org.apache.dubbo.springboot.demo パッケージを作成します

  3. 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 インターフェースが実装されています DemoServicesayHelloHello 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

 

おすすめ

転載: blog.csdn.net/leesinbad/article/details/132354432