Dubbo ソースコード分析: 初心者ガイド
すでに Dubbo の使用に習熟している場合は、これをご覧くださいこの記事はあなたには適していませんが、Dubbo
を理解し、Dubbo
を学びたい場合には、この記事は次のような人に非常に適しています。あなた。
ダボとは何ですか?
Dubbo は最初に Alibaba によって開発され、後に
Apache に貢献したため、後で ## と呼びます。 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
で特定のメソッドを呼び出したいと考えています。同じサーバー内にないため、直接呼び出すことはできません。呼び出しのセマンティクスを表現し、呼び出しデータを送信する必要があります。ネットワーク。リモート メソッドの呼び出しは、ローカル メソッドの呼び出しと同じです。
私たちの開発では、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
アーキテクチャの中核となる役割を見てみましょう:
この写真は公式 Web サイトからのものです。画像の簡単な紹介:
レジストリ
登録センター。サービス アドレスの登録と検索を担当します。サービスの
Provider
とConsumer
は、起動時にのみ登録センターと対話します。登録センターは、長い接続を通じてProvider
の存在を感知します。Provider
がダウンすると、登録センターは関連するイベント通知をConsumer
に即座にプッシュします。プロバイダー
サービスプロバイダー。起動すると、レジストリに登録され、独自のサービスのアドレスと関連する構成情報が URL にカプセル化され、ZooKeeper に追加されます。
コンシューマ
サービスコンシューマ。起動すると、レジストリに登録されます。サブスクリプション操作では、プロバイダーに登録された URL を
ZooKeeper
から取得し、対応するリスナーをZooKeeper
に追加します。プロバイダ URL を取得した後、コンシューマ
は、負荷分散アルゴリズムに基づいて複数のプロバイダ
から 1 つのプロバイダ
を選択し、それとの接続を確立し、最終的に接続を開始します。プロバイダー
のRPC
呼び出しに接続します。プロバイダー
URLが変更された場合、コンシューマー
は、前のサブスクリプションプロセス中に登録センターに追加されたリスナーを通じて最新のプロバイダーURL情報を取得し、接続の切断などの対応する調整を行います。ダウンしたプロバイダー
を削除し、新しいプロバイダー
への接続を確立します。Consumer はProvider
との長い接続を確立し、Consumer
はProvider
情報をキャッシュするため、接続が確立されると、たとえ登録センターがダウンしていても、既存の接続には影響しません。Provider
とConsumer
を実行します。監視
監視センター。サービスコールの回数やコール時間をカウントするために使用されます。実行プロセス中、
Provider
とConsumer
はメモリ内の通話数と通話時間をカウントし、統計データを毎分定期的に監視センターに送信します。監視センターは、上記のアーキテクチャ図では必要な役割を果たしません。監視センターのダウンタイムは、Provider
、Consumer
、Registry
の機能には影響しません。 、監視のみが失われ、データだけが失われます。淫らに展開し後半爆発します(序盤はあまり気にならないかもしれませんが後半は特に香ばしいです)
コンテナ:
サービス実行コンテナ。これは独立したコンテナです。通常、サービスは
Tomcat
やJBoss
などの Web コンテナの機能を必要としないため、サービスをロードするために Web コンテナを使用する必要はありません。サービス コンテナは単純な main メソッドであり、サービスを公開するために単純な Spring コンテナをロードします。処理説明
上の図では、複数の文字とたくさんの線が描かれていますが、これを簡単に説明します。
サービス コンテナは、サービス プロバイダーの起動、読み込み、および実行を担当します。 サービス プロバイダーは、開始時に、提供するサービスを登録センターに登録します。 サービス利用者は、サービスを開始するときに、必要なサービスの登録センターに登録します。 - #登録センターはサービス プロバイダーのアドレス リストをコンシューマに返します。変更がある場合、登録センターは長い接続に基づいて変更データをコンシューマにプッシュします。
- サービス コンシューマーは、ソフト ロード バランシング アルゴリズムに基づいて、プロバイダー アドレス リストから呼び出すプロバイダーを選択します。呼び出しが失敗した場合は、呼び出す別のプロバイダーを選択します。
- サービス利用者とプロバイダーは、通話回数と通話時間をメモリに蓄積し、統計データを毎分監視センターに定期的に送信します。
ダボ公式ウェブサイト
ダボ
の公式ウェブサイト:
https: //dubbo .apache.org/
Dubbo
は Alibaba 技術チームによって開発されているため、用語的には私たち中国人にとって、それはとてもフレンドリーです。
その他、
ダボ
公式サイトにはたくさんのことが載っているので、ここではいちいち紹介しません。皆さんも公式ウェブサイトにアクセスすることをお勧めします。
早速、 まずは楽しんでみましょう!
デモ ケース 1
登録センターのないケースから始めましょう。
プロジェクトを構築し、3 つの
モジュール
を作成します:
##dubbo-demo dubbo-demo-api - ##dubbo-demo-provider
- # #dubbo-demo-consumer
プロジェクトの全体的な構造は次のとおりです:それでは、コードについて簡単に説明しましょう。
最初は
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
类,日志输出:
好了,已经启动成功了。
我们继续来看看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
。
从日志可以看出我们已经成功调用了provider,我们再来看看provider的日志输出:
也成功的输出了我们想要的。
到此,一个简单的入门无注册中心(通过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项目:
看到我们的项目已经启动成功,并且已经注册到
Zookeeper
上了。我们可以使用
Zookeeper
的可视化工具,看看注册上去的信息。
我们再看看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
类:
可以看到我们也成功调用服务,另外也有大量的
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

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

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

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

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

dockerpullzookeeperdockerrun --namezk01-p2181:2181--restartalways-d2e30cac00aca は、zookeeper が Zookeeper と Dubbo を正常に開始したことを示します。 • ZooKeeperZooKeeper は、分散型のオープンソース分散アプリケーション調整サービスです。分散アプリケーションに一貫したサービスを提供するソフトウェアであり、構成保守、ドメイン名サービス、分散同期、グループ サービスなどの機能が提供されます。 DubboDubbo は Alibaba のオープンソース分散サービスフレームワークであり、最大の特徴は階層構造になっている点です。

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

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

1. ダボ呼び出し関係の説明 1.1 ここでのコンポーネントは主に 4 つの部分で構成されます: プロバイダー: サービスを公開するサービスプロバイダー プロトコル: プロバイダーとコンシューマー間のプロトコル対話データを担当します サービス: 実際のビジネス サービス情報。インターフェイスと実装 コンテナ: Dubbo のオペレーティング環境 コンシューマ: リモート サービスを呼び出すサービス コンシューマ プロトコル: プロバイダとコンシューマの間のプロトコル インタラクション データを担当する クラスタ: プロバイダ側でリスト情報を認識する プロキシ: できるプロバイダのサービス呼び出しエージェントとして理解され、コンシューマのインターフェース呼び出しロジックを引き継ぎます。 ●登録: 登録します。
