目次
Dubbo の 6 つのコア コンピテンシー
RPC" > RPC
レジストリ
プロバイダー
コンシューマ
監視
コンテナ:
処理説明
api
provider
consumer
デモ ケース 2 " >デモ ケース 2
コードレベル
pom依赖
provider端
consumer端
其他
ホームページ Java &#&チュートリアル Dubbo ソースコード分析: 初心者ガイド

Dubbo ソースコード分析: 初心者ガイド

Aug 23, 2023 pm 02:44 PM
dubbo


すでに Dubbo の使用に習熟している場合は、これをご覧くださいこの記事はあなたには適していませんが、Dubbo を理解し、Dubbo を学びたい場合には、この記事は次のような人に非常に適しています。あなた。

Dubbo ソースコード分析: 初心者ガイド

ダボとは何ですか?

Dubbo は最初に Alibaba によって開発され、後に Apache に貢献したため、後で ## と呼びます。 Dubbo または単に Dubbo に電話してください。

Dubbo

は、高性能で軽量なオープンソース サービス フレームワークです。

最初に発音を修正してください:

間違った発音: diubo、dubo

正しい発音: |ˈdʌbəʊ|

Dubbo の 6 つのコア コンピテンシー

  • インターフェースの高性能プロキシ##RPCコール
  • インテリジェントなフォールトトレランスと負荷分散
  • サービスの自動登録と検出
  • 高度なスケーラビリティ機能
  • ランタイム トラフィック スケジューリング
  • サービス ガバナンスと運用保守の視覚化。
  • 開発中、私たちは皆、
  • Dubbo

#RPC オープン ソース フレームワークと呼ぶことを好みます。 RPC とは何ですか?

RPC

Remote Procedure Call の省略形で、翻訳すると リモート プロシージャ コール となります。 単純に理解すると、あるノードが別のノードによって提供されるサービスを要求します。

平たく言えば:

2 台のサーバー A と B。サーバー A にアプリケーション serverA をデプロイし、サーバー B にアプリケーション serverB をデプロイします。このとき、serverA は serverB で特定のメソッドを呼び出したいと考えています。同じサーバー内にないため、直接呼び出すことはできません。呼び出しのセマンティクスを表現し、呼び出しデータを送信する必要があります。ネットワーク。

リモート メソッドの呼び出しは、ローカル メソッドの呼び出しと同じです。

Dubbo ソースコード分析: 初心者ガイド

私たちの開発では、2 つのサービス (異なるサーバー上のサービス) 間の呼び出しは通常、HTTP REST を使用します。

RPC フレームワーク

実際、市場には多くの RPC フレームワークがあり、Dubbo はそのうちの 1 つにすぎません。例えば: ###

  • gRPC は、Google によって開発された高性能の汎用オープンソース RPC フレームワークです。gRPC は、ProtoBuf を使用してサービスを定義します。ProtoBuf は、Google によって開発された、比較的高いパフォーマンスと圧縮率を備えたデータシリアル化プロトコルです。伝送効率が高く、構文が比較的単純です。さらに、gRPC は複数の言語をサポートしており、言語に基づいてクライアントとサーバーの関数ライブラリを自動的に生成できます。
  • Thrift は Facebook で生まれ、Dubbo と同様に、後に Thrift をオープンソース プロジェクトにするために Apache Foundation に提出されました。 Facebook は、Facebook システム間の大量のデータ送信と通信の問題、およびクロスプラットフォームの問題を必要とするシステム間の異なる言語環境の問題を解決するために Thrift を作成しました。
  • Motan は、Sina Weibo によってオープンソース化された Java RPC フレームワークです。公式ドキュメントは公開され、Weibo プラットフォームで広く使用されており、毎日数百のサービスに対して 1,000 億件近くの呼び出しを完了しています。 。
  • ...

ダボコアキャラクター

やってみようDubbo アーキテクチャの中核となる役割を見てみましょう:

Dubbo ソースコード分析: 初心者ガイド

この写真は公式 Web サイトからのものです。画像の簡単な紹介:

レジストリ

登録センター。サービス アドレスの登録と検索を担当します。サービスの ProviderConsumer は、起動時にのみ登録センターと対話します。登録センターは、長い接続を通じて Provider の存在を感知します。Provider がダウンすると、登録センターは関連するイベント通知を Consumer に即座にプッシュします。

プロバイダー

サービスプロバイダー。起動すると、レジストリに登録され、独自のサービスのアドレスと関連する構成情報が URL にカプセル化され、ZooKeeper に追加されます。

コンシューマ

サービスコンシューマ。起動すると、レジストリに登録されます。サブスクリプション操作では、プロバイダーに登録された URL を ZooKeeper から取得し、対応するリスナーを ZooKeeper に追加します。プロバイダ URL を取得した後、コンシューマ は、負荷分散アルゴリズムに基づいて複数の プロバイダ から 1 つの プロバイダ を選択し、それとの接続を確立し、最終的に接続を開始します。 プロバイダー RPC 呼び出しに接続します。 プロバイダー URLが変更された場合、コンシューマーは、前のサブスクリプションプロセス中に登録センターに追加されたリスナーを通じて最新のプロバイダーURL情報を取得し、接続の切断などの対応する調整を行います。ダウンした プロバイダー を削除し、新しい プロバイダー への接続を確立します。Consumer は Provider との長い接続を確立し、ConsumerProvider 情報をキャッシュするため、接続が確立されると、たとえ登録センターがダウンしていても、既存の接続には影響しません。ProviderConsumer を実行します。

監視

監視センター。サービスコールの回数やコール時間をカウントするために使用されます。実行プロセス中、ProviderConsumer はメモリ内の通話数と通話時間をカウントし、統計データを毎分定期的に監視センターに送信します。監視センターは、上記のアーキテクチャ図では必要な役割を果たしません。監視センターのダウンタイムは、ProviderConsumerRegistry の機能には影響しません。 、監視のみが失われ、データだけが失われます。

淫らに展開し後半爆発します(序盤はあまり気にならないかもしれませんが後半は特に香ばしいです)

コンテナ:

サービス実行コンテナ。これは独立したコンテナです。通常、サービスは TomcatJBoss などの Web コンテナの機能を必要としないため、サービスをロードするために Web コンテナを使用する必要はありません。サービス コンテナは単純な main メソッドであり、サービスを公開するために単純な Spring コンテナをロードします。

処理説明

上の図では、複数の文字とたくさんの線が描かれていますが、これを簡単に説明します。

  • サービス コンテナは、サービス プロバイダーの起動、読み込み、および実行を担当します。
  • サービス プロバイダーは、開始時に、提供するサービスを登録センターに登録します。
  • サービス利用者は、サービスを開始するときに、必要なサービスの登録センターに登録します。
  • #登録センターはサービス プロバイダーのアドレス リストをコンシューマに返します。変更がある場合、登録センターは長い接続に基づいて変更データをコンシューマにプッシュします。
  • サービス コンシューマーは、ソフト ロード バランシング アルゴリズムに基づいて、プロバイダー アドレス リストから呼び出すプロバイダーを選択します。呼び出しが失敗した場合は、呼び出す別のプロバイダーを選択します。
  • サービス利用者とプロバイダーは、通話回数と通話時間をメモリに蓄積し、統計データを毎分監視センターに定期的に送信します。

ダボ公式ウェブサイト

ダボの公式ウェブサイト: https: //dubbo .apache.org/

Dubbo ソースコード分析: 初心者ガイド

Dubbo は Alibaba 技術チームによって開発されているため、用語的には私たち中国人にとって、それはとてもフレンドリーです。

その他、ダボ公式サイトにはたくさんのことが載っているので、ここではいちいち紹介しません。

皆さんも公式ウェブサイトにアクセスすることをお勧めします。

早速、 まずは楽しんでみましょう!

デモ ケース 1

登録センターのないケースから始めましょう。

プロジェクトを構築し、3 つの モジュールを作成します:

  • ##dubbo-demo
  • dubbo-demo-api
  • ##dubbo-demo-provider
  • # #dubbo-demo-consumer
  • プロジェクトの全体的な構造は次のとおりです:

Dubbo ソースコード分析: 初心者ガイド

それでは、コードについて簡単に説明しましょう。

最初は pom 依存関係です:

<!--dubbo的依赖-->
<dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo</artifactId>
     <version>3.0.4</version>
</dependency>
<!-- provider和consumer共用类-->
<dependency>
     <groupId>com.tian.dubbo</groupId>
     <artifactId>dubbo-demo-api</artifactId>
     <version>1.0-SNAPSHOT</version>
</dependency>
ログイン後にコピー

コンシューマー プロジェクトとプロバイダー プロジェクトの両方で、これら 2 つの依存関係を追加する必要があります。

api

api は主にサービス インターフェイスといくつかのツール クラスを定義しており、これらは主にコンシューマーとプロバイダーによって共有されます。

API では、サービス インターフェイスを 1 つだけ定義します: DemoService

package com.tian.dubbo.service;

public interface DemoService {
    String sayHello(String msg);
}
ログイン後にコピー

次に、それを jar に入力し、コンシューマの pom.xml に追加します。プロバイダー プロジェクト 依存関係では、最後の 2 回を使用できます。

provider

リソース ディレクトリに META-INF.spring ディレクトリを作成し、そのディレクトリに application.xml を作成します。次の内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--Dubbo服务名称--> 
    <dubbo:application name="dubbo-provider"/>
    <!--不需要注册到服务注册中心--> 
    <dubbo:registry address="N/A"/>
    <!--端口和协议--> 
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--我们的服务--> 
    <dubbo:service interface="com.tian.dubbo.service.DemoService" ref="demoService"/>
    <bean id="demoService" class="com.tian.dubbo.service.DemoServiceImpl"/>
</beans>
ログイン後にコピー

リソース ディレクトリにログ出力設定ファイルを作成します: log4j.properties

###set log levels###
log4j.rootLogger=debug, stdout
###output to the console###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n
ログイン後にコピー

ビジネス実装クラスを定義します: DemoServiceImpl

package com.tian.dubbo.service;

public class DemoServiceImpl implements DemoService {
    public String sayHello(String msg) {
        System.out.println("msg= " + msg);
        return "SUCCESS";
    }
}
ログイン後にコピー

次に、プロバイダー起動クラスを定義します: ProviderMain

package com.tian.dubbo;

import org.apache.dubbo.container.Main;

public class ProviderMain {
    public static void main(String[] args) {
        Main.main(args);
    }
}
ログイン後にコピー

注意:这里的Main类是Dubbo

最后,我们启动ProviderMain类,日志输出:

Dubbo ソースコード分析: 初心者ガイド

好了,已经启动成功了。

我们继续来看看consumer项目,在项目中,也就是调用我们服务的项目。

consumer

在consumer项目中application.xml配置文件和provider有所区别。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 服务名称-->
    <dubbo:application name="dubbo-consumer"/>
    <!--不需要注册到服务注册中心--> 
    <!-- 通过url直接调用-->
    <dubbo:reference id="demoService"
                     interface="com.tian.dubbo.service.DemoService"
     url="dubbo://127.0.0.1:20880/com.tian.dubbo.service.DemoService"/>
</beans>
ログイン後にコピー

这个url地址,我们在provider启动的时候,可以从日志中找到。

日志文件和provider一样,然后就是ConsumerMain启动类了。

package com.tian.dubbo;

import com.tian.dubbo.service.DemoService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ConsumerMain {
    public static void main(String[] args) {
        DemoService demoService = null;
        ApplicationContext context = new ClassPathXmlApplicationContext
                ("classpath:META-INF/spring/application.xml");
        demoService = context.getBean(DemoService.class);
        //调用服务
        System.out.println(demoService.sayHello("tian"));
    }
}
ログイン後にコピー

前面,我们已经把provider成功启动了,下面我们就来启动ConsumerMain

Dubbo ソースコード分析: 初心者ガイド

从日志可以看出我们已经成功调用了provider,我们再来看看provider的日志输出:

Dubbo ソースコード分析: 初心者ガイド

也成功的输出了我们想要的。

到此,一个简单的入门无注册中心(通过url直接调用)的方式就完成了。

url は、登録センターへの依存を取り除くため、共同デバッグを開発するときに依然として非常に役立ちます。

デモ ケース 2

これまで登録センターのデモを行ったことはありませんでしたが、今回は登録センターのデモを行います。

Dubbo 現在、市場のほぼすべての登録センターをサポートしています:

  • consul
  • #zookeeper
  • eureka
  • redis
  • etcd
  • nacos
  • ....

実際の開発では、ほとんどの Dubbo 登録センターが使用されます 動物園の飼育員ナコス

以下は Zookeeper に基づくデモンストレーションです (nacos も同様で、これについては後述します)。

コードレベル

前のケースに基づいて修正しました。変換では 2 か所を調整するだけで済みます:

  • consumer和provider中添加pom依赖
  • application.xml中添加注册中心
pom依赖

我们需要在前面demo中consumer和provider的pom.xml中添加Zookeeper的依赖:

<dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo-dependencies-zookeeper</artifactId>
     <version>3.0.4</version>
     <type>pom</type>
</dependency>
ログイン後にコピー
provider端

在provider项目中我们需要调整:

<dubbo:registry address="N/A"/>
ログイン後にコピー

改成:

<dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="10000"/>
ログイン後にコピー
ログイン後にコピー

这个timeout建议配上,我这里其实没必要配,因为dubbo服务和Zookeeper都在我本地。

然后我们启动provider项目:

Dubbo ソースコード分析: 初心者ガイド

看到我们的项目已经启动成功,并且已经注册到Zookeeper上了。

我们可以使用Zookeeper的可视化工具,看看注册上去的信息。

Dubbo ソースコード分析: 初心者ガイド

我们再看看consumer端的调整。

consumer端

我们需要在application.xml中添加

<dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="10000"/>
ログイン後にコピー
ログイン後にコピー

同时,去掉reference中的url:

<dubbo:reference id="demoService"
                     interface="com.tian.dubbo.service.DemoService"
     url="dubbo://127.0.0.1:20880/com.tian.dubbo.service.DemoService"/>
ログイン後にコピー

因为是通过Zookeeper注册中心拿到地址,所以这里的url就可以去掉了。

最后,启动ConsumerMain类:

Dubbo ソースコード分析: 初心者ガイド

可以看到我们也成功调用服务,另外也有大量的Zookeeper日志。

到此,说明,我们的Zookeeper为注册中心的demo案例也成功了。

注意:provider和consumer项目都需要依赖相关jar包(api、zookeeper、dubbo)

其他

关于Nacos,我们这里就不演示了,因为太简单了,如果你把Nacos搭建好了后,直接配置就好了。

<dubbo:registry address="nacos://127.0.0.1:8848" timeout="10000"/>
ログイン後にコピー

就是把address地址改一下就可以了。

Nacos 的演示,我们下一篇文章中见。

总结

本文分享了Dubbo入门案例的两个版本:无注册中心和Zookeeper注册中心。

以上がDubbo ソースコード分析: 初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SpringBoot+Dubbo+Nacos開発実践チュートリアル SpringBoot+Dubbo+Nacos開発実践チュートリアル Aug 15, 2023 pm 04:49 PM

この記事では、dubbo+nacos+Spring Boot の実際の開発について詳しく説明する例を書きます。この記事では理論的な知識はあまり取り上げませんが、dubbo を nacos と統合して開発環境を迅速に構築する方法を説明する最も簡単な例を書きます。

Dubbo が Go で書き直されるのはなぜですか? Dubbo が Go で書き直されるのはなぜですか? Apr 10, 2023 pm 12:51 PM

[[443126]] いくつかの言葉から始めましょう。私は歩いているときによく技術的な「なぜ質問」をたくさん考えます。時々、質問について長い間考え、納得できるまで質問が終わらないことがあります。質問のあらゆる点について私自身が説明します。そこで、その思いを記録し、新たなシリーズとして記事にしたいと思います。これらの記事ではコードを見ることはできないかもしれませんが、見落とされがちないくつかの問題と、問題のより深い「理由」を垣間見ることができます。今日は最初の記事をお届けします、なぜ Dubbo を Go で書き直す必要があるのですか? Dubbo は Alibaba で生まれ、2011 年にオープンソース化されましたが、10 年が経ちました。 2019 年に Go で書き直されてオープンソース化され、2 年後の現在はオリジナルの V1.0.0 バージョンから V3.0.0 に開発されています。

Javaベースの分散サービスフレームワークDubboの原理と事例分析 Javaベースの分散サービスフレームワークDubboの原理と事例分析 Apr 24, 2023 pm 08:13 PM

はじめに Dubbo を紹介する前に、基本的な概念を理解しましょう: Dubbo は RPC フレームワークです. RPC は Remote Procedure Call (リモート プロシージャ コール) です. その反対はローカル プロシージャ コールです. 分散アーキテクチャの前に単一アプリケーション アーキテクチャと垂直アプリケーション アーキテクチャで使用されますこれらはすべてローカル プロシージャ コールです。これにより、プログラマがリモート呼び出しの詳細を明示的にコーディングすることなく、プログラムが別のアドレス空間 (通常はネットワーク上で共有される別のマシン) にあるプロシージャまたは関数を呼び出すことができます。分散アーキテクチャ アプリケーション間のリモート呼び出しには、ローカル呼び出しと同じくらい単純なリモート呼び出しを行うための RPC フレームワークが必要です。 Dubbo フレームワークには、リモート サービスを呼び出す次のコンポーネント Consumer があります。

Dubbo ソースコード分析: 初心者ガイド Dubbo ソースコード分析: 初心者ガイド Aug 23, 2023 pm 02:44 PM

すでに Dubbo の使用に熟練している場合、この記事は適していませんが、Dubbo を理解し、Dubbo を学習したい場合には、この記事は非常に適しています。

Apache Dubbo デシリアライゼーションの脆弱性を分析する方法 Apache Dubbo デシリアライゼーションの脆弱性を分析する方法 May 17, 2023 pm 04:01 PM

はじめに Dubbo は、Alibaba がオープンソース化した高性能で優れたサービス フレームワークであり、アプリケーションが高性能 RPC を通じてサービス出力および入力機能を実現でき、Spring フレームワークとシームレスに統合できます。これは、インターフェイス指向のリモート メソッド呼び出し、インテリジェントなフォールト トレランスと負荷分散、自動サービス登録と検出という 3 つのコア機能を提供します。概要 2020 年 6 月 23 日に、ApacheDubbo は ApacheDubbo のリモート コード実行に関するリスク通知を正式にリリースし、脆弱性番号は CVE-2020-1948、脆弱性レベルは「高リスク」です。 ApacheDubbo は、高性能かつ軽量のオープンソース JavaRPC フレームワークであり、次の 3 つのコア機能を提供します。

Java Spring Dubbo の 3 つの SPI メカニズムの違いは何ですか Java Spring Dubbo の 3 つの SPI メカニズムの違いは何ですか May 16, 2023 am 08:34 AM

SPIは何に使われますか?たとえば、私たちは新しいロギング フレームワーク「スーパーロガー」を設計しました。デフォルトでは、XML ファイルがログの構成ファイルとして使用され、構成ファイル解析用のインターフェースが設計されています: packagecom.github.kongwu.spisamples; publicinterfaceSuperLoggerConfiguration{voidconfigure(StringconfigFile);} 次に、デフォルトの XML 実装があります: packagecom .github .kongwu.spisamples;publiccl

ダボの原理と仕組みとは ダボの原理と仕組みとは Jan 17, 2024 pm 03:25 PM

dubbo の原理とメカニズムの説明: 1. コアコンポーネント; 2. 通信原理; 3. クラスターフォールトトレランス; 4. 自動検出と登録; 5. ロードバランシングとルーティング; 6. シリアル化と送信; 7. モニタリングとロギング; 8 、スケーラビリティ; 9. セキュリティ; 10. Spring との統合; 11. 他のテクノロジーとの統合。詳細な紹介: 1. 登録センター、監視センター、サービス消費者、サービスプロバイダーを含むコアコンポーネント; 2. 通信原理、Dubbo はネットワーク通信フレームワークを使用してサービス呼び出しを行い、それに基づいてさまざまな長期接続を提供します。 。

素晴らしい説明: Dubbo はすでに Go 言語をサポートしていますか? 素晴らしい説明: Dubbo はすでに Go 言語をサポートしていますか? Mar 25, 2024 am 09:42 AM

読者の皆様、今日は Dubbo の Go 言語について説明する記事をお届けします。 Dubbo は優れた分散サービス フレームワークとして広く使用されており、Java 言語でサポートされています。近年の Go 言語の急速な発展に伴い、多くの開発者は Dubbo がすでに Go 言語をサポートしているかどうかに強い関心を持っています。この記事では、Dubbo の Go 言語サポート、具体的な実装方法、コード例について詳しく説明します。

See all articles