Dubbo はリモート通話用に nacos を統合します

ダボって何ですか?

Apache Dubbo は、もともと 2008 年に Alibaba によってオープンソースとして寄贈され、すぐに中国におけるオープンソース サービス フレームワークの選択における事実上の標準フレームワークとなり、さまざまな業界で広く使用されています。2017 年、Dubbo は Apache Software Foundation に正式に寄付され、Apache のトップ プロジェクトになりました。現在、Dubbo3 は以下を提供するワンストップ マイクロサービス ソリューションです。

  • HTTP/2 トリプル プロトコルとプロキシ API のプログラミング経験に基づいています。
  • アドレス検出、負荷分散、ルーティング アドレス選択、動的構成などの強力なトラフィック管理機能。
  • Java、Golang、JavaScript などをカバーする多言語 SDK 実装と、さらに多くの言語実装が順次リリースされる予定です。
  • 柔軟な適応および拡張機能は、トレースやトランザクションなどのマイクロサービス システムの他のコンポーネントに簡単に適応できます。
  • Dubbo Mesh ソリューションは、Sidecar や Proxyless などの柔軟な Mesh 導入ソリューションもサポートしています。

Apache Dubbo の全体的なアーキテクチャは、アリババ、ICBC、中国平安、その他の超大規模マイクロサービス クラスターの実際的な問題を最初から解決するように設計されているため、企業の大規模マイクロサービス実践に十分対応できます。 Ctrip と他のコミュニティ ユーザーは、長年にわたる大規模な運用環境のトラフィックを通じて Dubbo の安定性とパフォーマンスを十分に検証しているため、Dubbo はビジネスの着陸と大規模な実践の解決において比類のない利点を持っています。

  • 箱から出して
    • Java版のインターフェース指向プロキシ機能によりローカルでの透過的な呼び出しを実現できるなど、高い使いやすさを実現
    • 機能が豊富で、マイクロサービス ガバナンス機能のほとんどはネイティブ ライブラリまたは軽量の拡張機能に基づいて実現できます。
  • 超大規模なマイクロサービス クラスター向けに設計
    • 究極のパフォーマンス、高性能 RPC 通信プロトコルの設計と実装
    • 水平方向に拡張可能で、数百万のクラスター インスタンスのアドレス検出とトラフィック管理を簡単にサポート
  • 拡張性が高い
    • フィルター、ルーター、LB などの呼び出しプロセス中のトラフィックとプロトコルの傍受と拡張。
    • レジストリ、構成センター、メタデータ センターなどのマイクロサービス ガバナンス コンポーネント拡張機能。

ダボの基本的なワークフロー

分散システムでは、特にマイクロサービス アーキテクチャの発展により、アプリケーションのデプロイ、リリース、スケーリングが非常に頻繁になり、RPC コンシューマとしてサービス プロバイダのアドレスを動的に検出する方法が RPC 通信の前提条件になります。Dubbo は、分散シナリオでのマシン インスタンスの動的な移行に対処するための自動アドレス検出メカニズムを提供します。下図に示すように、登録センターの導入によりプロバイダとコンシューマのアドレスが連携され、プロバイダは起動後、自身のアドレスを登録センターに登録し、コンシューマはプロバイダのアドレスリストを動的に認識します。登録センター内の特定のノードをプルまたはサブスクライブします。

画像-20221008140759864

Dubbo のコア機能

高性能 RPC 通信プロトコル

プロセスまたはホストを越えたサービス通信は Dubbo の基本機能であり、Dubbo RPC は、事前に定義されたプロトコル エンコード方式でバックエンド サービスにリクエスト データ (Request) を送信し、サーバーから返された計算結果 (Response) を受け取ります。RPC 通信はユーザーに対して完全に透過的であるため、ユーザーはリクエストがどこにどのように送信されるかを気にする必要はなく、呼び出しごとに正しい呼び出し結果を取得することだけが必要です。同期モードの要求/応答通信モデルに加えて、Dubbo3 では、より豊富な通信モデルの選択肢も提供します。

  • コンシューマ側の非同期リクエスト (クライアント側の非同期リクエスト-レスポンス)
  • プロバイダ側の非同期実行(サーバー側の非同期リクエスト-レスポンス)
  • コンシューマリクエストストリーム (リクエストストリーミング)
  • プロバイダー応答ストリーミング
  • 双方向ストリーミング

詳細は各言語SDKが実装するオプションプロトコル一覧またはトリプルプロトコルを参照してください。

自動サービス (アドレス) 検出

Dubbo のサービス ディスカバリ メカニズムにより、マイクロサービス コンポーネントは独立して進化し、任意にデプロイできるため、コンシューマはデプロイメントの場所やピアの IP アドレスを知らなくても通信を完了できます。Dubbo はクライアントベースのサービス検出メカニズムを提供し、ユーザーはさまざまな方法でサービス検出を有効にすることができます。

  • Nacos、Zookeeper、Consul などの独立したレジストリ コンポーネントを使用します。
  • サービスの編成と登録を Kubernetes などの基盤となるコンテナ プラットフォームに任せます。Kubernetes は、よりクラウド ネイティブな使用方法であると理解されています。

実行状態のトラフィック制御

透過的アドレス検出により、Dubbo リクエストを任意の IP インスタンスに送信できるようになり、このプロセス中にトラフィックがランダムに割り当てられます。より充実したきめ細かいトラフィック制御が必要な場合は、Dubbo のトラフィック制御戦略を使用できます。Dubbo は、これらの基本機能に基づいて、ロード バランシング、トラフィック ルーティング、リクエスト タイムアウト、トラフィックの低下、再試行などの戦略を提供し、簡単に実装できます。カナリア リリース、A/B テスト、重み付けルーティング、同一リージョン優先度など、より多くのシナリオ ベースのルーティング ソリューションが含まれています。さらに優れているのは、Dubbo が、再デプロイメントを行わずに実行状態で動的に有効になるトラフィック制御ポリシーをサポートしていることです。

入門

1. 親プロジェクトのバージョン ロック:

画像-20221008141642072

 <dependencyManagement>

        <dependencies>
            <!-- springboot 版本锁定 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- springcloud的 阿里巴巴 版本锁定 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 添加SpringCloud版本锁定 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

    </dependencyManagement>

2. dobbo-client はサービスインターフェースを定義します

public interface UserDubboClient {
    
    
    String hello(String id);
}

3. dobbo 製品プロバイダーはインターフェースを実装し、サービスを公開します

@DubboService
public class UserServiceImpl implements UserDubboClient {
    
    

    @Override
    public String hello(String id) {
    
    
        return "dubbo com.hk.client ... " + id;
    }
}

4. dobbo-product 設定 application.yml ファイル

server:
  port: 8000

spring:
  application:
    name: dubboproduct
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
dubbo:
  scan:
    base-packages: com.hk.product.service   # dubbo 扫描包路径
  protocol:
    name: dubbo								# dubbo 协议
    port: -1
  registry:
    address: nacos://localhost:8848			# 注册地址	

5. dobbo-consumer はリモート サービスを参照します

@RestController
@RequestMapping("/user")
public class UserController {
    
    

    @DubboReference(check = false)
    private UserDubboClient userDubboClient;

    @RequestMapping("{id}")
    public String hello(@PathVariable("id")String id){
    
    
        String hello = userDubboClient.hello(id);
        return hello;
    }
}

6. dobbo-consumer は application.yml を定義します

server:
  port: 9000

spring:
  application:
    name: dubboconsumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

dubbo:
  scan:
    base-packages: com.hk.product.service
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://localhost:8848

7. dobbo-consumer は Spring 設定をロードし、リモート サービスを呼び出します

@EnableDubbo
@SpringBootApplication
public class DubboConsumerApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(DubboConsumerApplication.class,args);
    }
}

ノート:

1. @DubboService アノテーション: Dubbo サービス インターフェイスを定義した後、サービス インターフェイスの実装ロジックを提供し、@DubboServiceDubbo のサービス公開を実現するためにアノテーションでマークします。

@DubboService
public class UserServiceImpl implements UserDubboClient {
    
    

}

2. @DubboReference アノテーション。@DubboReferenceこのアノテーションは Dubbo サービス プロキシ インスタンスとして自動的に挿入され、userDubboClient を使用してリモート サービス コールを開始できます。

@RestController
@RequestMapping("/user")
public class UserController {
    
    

    @DubboReference(check = false)
    private UserDubboClient userDubboClient;

    @RequestMapping("{id}")
    public String hello(@PathVariable("id")String id){
    
    
        String hello = userDubboClient.hello(id);
        return hello;
    }
}

3. @EnableDubbo アノテーション

@EnableDubbo@EnableDubboアノテーションを構成する必要があります。そうしないと、メインクラスで定義できるDubbo アノテーションによって定義されたサービスがロードされません。

@EnableDubbo
@SpringBootApplication
public class DubboConsumerApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(DubboConsumerApplication.class,args);
    }
}

デフォルトでは、Spring Boot アノテーションはメインクラスが配置されているパッケージのみをスキャンします。サービスが他のパッケージで定義されている場合は、構成を追加する必要があります

@EnableDubbo(scanBasePackages = {
    
    "org.apache.dubbo.springboot.demo.provider"})

dobbo-Product の依存 pom ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-parent</artifactId>
        <groupId>com.hk</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-product</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--  注册中心 把  服务注册到nacos中-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--  dubbo 的依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <!--dubbo nacos-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.6</version>
        </dependency>

        <dependency>
            <groupId>com.hk</groupId>
            <artifactId>dubbo-client</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

dobbo-Consumer の依存 pom ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-parent</artifactId>
        <groupId>com.hk</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-consumer</artifactId>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--  注册中心 把  服务注册到nacos中-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--  dubbo 的依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <!--dubbo nacos-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.6</version>
        </dependency>

        <dependency>
            <groupId>com.hk</groupId>
            <artifactId>dubbo-client</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

おすすめ

転載: blog.csdn.net/hekai7217/article/details/129134795