モール: ウサギプロジェクトのソースコード解析

1.モールオープンソースプロジェクト

1.1 出典

モール学習チュートリアル、アーキテクチャ、ビジネス、技術的なポイントの包括的な分析。モール プロジェクト ( 50k+star ) は、現在の主流のテクノロジーを使用して実装された電子商取引システムです。Docker コンテナーのデプロイメントを使用した、SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7 およびその他のテクノロジーをカバーします。

プロジェクトの github アドレス: github.com

1.2 プロジェクトの移管

Github 上のプロジェクトを gitee に転送して、アイデアのクローンを簡単に作成できます。

具体的な手順は次のとおりです。

ここに画像の説明を挿入します

1.3 プロジェクトのクローン作成

github は海外に展開されているため、idea は github からのプルにも対応していますが、クローン作成速度が遅すぎるため、前述のように gitee をインポートした後、プロジェクトを idea にクローンすることをお勧めします。

具体的なクローン作成手順は単純すぎて日常的なものなので、読者は自分で作成することも、Baidu で検索することもできます。

2. RabbitMQ メッセージミドルウェア

RabbitMQ 消息的传递:「プロデューサー→スイッチ→キュー→コンシューマー」で構成されるモデルですが、ポイントツーポイントモードとワークキューモードは配信キューの匿名スイッチとして理解できます。

2.1 ウサギの紹介

RabbitMQ公式サイト公式サイト

RabbitMQ はメッセージ ブローカー、つまりメッセージング システムの仲介者です。これにより、アプリケーションにメッセージを送受信するためのユニバーサル プラットフォームを提供し、送信中のメッセージのセキュリティを確保できます。

RabbitMQ は、Erlang 言語を使用して開発され、AMQP (Advanced Message Queuing Protocol) を実装したオープンソースのメッセージ ミドルウェアです。まず最初に、次の RabbitMQ の特徴をいくつか知っておく必要があります。

  • 信頼性。永続化、送信確認、解放確認などをサポートし、MQ の信頼性を確保します。
  • 柔軟な配信メッセージ戦略。これは RabbitMQ の主要な機能です。Exchange (スイッチ) は、メッセージが MQ に入る前にルーティングします。配布メッセージ戦略には、シンプル モード、ワーク キュー モード、パブリッシュおよびサブスクライブ モード、ルーティング モード、およびワイルドカード モードが含まれます。
  • クラスタリングをサポートします。複数の RabbitMQ サーバーがクラスターを形成して論理ブローカーを形成できます。
  • 複数のプロトコル。RabbitMQ は、STOMP、MQTT などの複数のメッセージ キュー プロトコルをサポートしています。
  • 複数の言語クライアントをサポートします。RabbitMQ は、Java、.NET、Ruby など、一般的に使用されるほぼすべてのプログラミング言語をサポートします。
  • 視覚的な管理インターフェイス。RabbitMQ は、ユーザーがメッセージ ブローカーを監視および管理できるようにする使いやすいユーザー インターフェイスを提供します。
  • プラグイン機構。RabbitMQ には多くのプラグインが用意されており、プラグインを使用して拡張することも、独自のプラグインを作成することもできます。

Rabbit 開発ドキュメントのアドレス: [Java クライアント開発ドキュメント] ( Java クライアント ガイド · RabbitMQ 中国語 (mr-ping.com) )

2.2 分散バックエンドプロジェクトの利用の流れ

以下の図は、プロジェクトの経験とBaiduの検索情報を基に私がまとめた基本的な利用プロセスです。

Rabbitmq の使用フローチャートは以下のとおりです。

ここに画像の説明を挿入します

2.3 分散バックエンドプロジェクトの利用シナリオ

下の図は、プロジェクトの経験とBaiduの検索情報に基づいて私がまとめた基本的な使用シナリオです。

Rabbitmq の使用シナリオ図は次のとおりです。

ここに画像の説明を挿入します

3. RabbitMQ のインストール (Win10)

これまでrabbitmqはLinux上で動作していたので(通常はDockerを使用してRabbitMQイメージのプルダウンを行うため、環境展開の必要がありません)、今回はソースコードを解釈してwin10で動作させてみます。まず、最初にダウンロードしErlang、次にダウンロードしますRabbitMQ服务端

p.s.と は密接に関連しているため、RabbitMQ バージョンを選択するときは、インストールした特定の Erlang バージョンと互換性があることを確認する必要がありますRabbitMQErlang

(Erlang/OTP 26.0.2対応バージョンはRabbitMQ 3.8.x 或者 更高 )

❌これを書き終えて唖然としましたが、こんな高級バージョンを選ぶべきではなかったのです。

経験: 2 つのバージョンをインストールした後、プロジェクト内のバージョンが RabbitMQ クライアント ライブラリとして使用されているかどうかを確認するのを忘れたため、バージョンの互換性がなく、接続に失敗しました。Baidu で多くの質問がありspring-boot-starter-amqpまし2.1.3インターネットで調べて厳選しましたが、すべて正解でした。その後、問題の原因はバージョンの非互換性であることしかわかりませんでしたが、次善の策に落ち着いて、問題を完全に解決するspring-boot-starter-amqpためにバージョンをアップグレードしました。2.3.x

Alibaba Cloud の倉庫は非常にわかりにくく、倉庫すらありません。

Could not find artifact org.springframework.boot:spring-boot-starter-amqp:pom:2.3.3 in alimaven

その後、Baidu はスコープを変更し、画像を変更したと言って、多くのチュートリアルを探しました。すべて試してみましたが、これが見つからないことがわかりました。他のすべての依存関係もエラーを報告しました。ウェアハウスか何かで依存関係の競合が発生しているはずです。なので、詳細は説明しません。

✒️プロジェクトに従い、バージョンを下げる方が良いでしょErlangRabbitMQ服务端

spring-boot-starter-amqp のバージョンは 2.1.3 で、RabbitMQ 3.7.x バージョンと互換性があります。

ここから RabbitMQ サーバーをダウンロードしますrabbitmq-server-3.7.3.exe

対応するErlangバージョンはここにあります19.3 - 20.x必ずクリーンにアンインストールしてください。バージョンには互換性がある必要があります。そうでない場合、プラグインのインストール時に互換性のないバージョンのエラーが報告されます

以下のスクリーンショットは更新されませんので必要はありませんが、バージョン番号が違うだけで操作はほぼ同じです。(最終的にはつながりました。まさにバージョンの互換性の問題でした。本当に落とし穴をくぐり抜けてきました…)

3.1 erLang 言語のインストールと環境変数の構成

1.まず公式Webサイトにアクセスしてダウンロードします。Erlang公式Webサイト:公式Webサイト(win10バージョンをダウンロード)

ここに画像の説明を挿入します

2. ダウンロードが完了したらotp_win64_26.0.exe、ダブルクリックしてインストールし、クリックし続けますnext(インストールパスを切り替えることができます) インストールが完了したら、環境変数を設定します。

ここに画像の説明を挿入します

3. 環境変数を構成した後、cmd コマンドを使用して、erl -version入力が成功したかどうかを確認します。

成功したスクリーンショットは次のようになります。

ここに画像の説明を挿入します

3.2 RabbitMQサーバーのインストール

1. RabbitMQ からサーバー インストール パッケージgithub上をダウンロードします。window版

ダウンロード アドレス:リリース RabbitMQ 3.8.32 · Rabbitmq/rabbitmq-server (github.com) )
ここに画像の説明を挿入します

2. としてダウンロードしrabbitmq_server-3.8.32.exe、ダブルクリックしてインストールし、[次へ] をクリックしてインストールします (インストール パスを切り替えることができます)。インストールが完了したら、インストール ディレクトリを見つけて、cmd コマンドを開き、プラグをインストールするコマンドを入力し\rabbitmq\rabbitmq_server-3.8.32\sbinますrabbitmq-plugins enable rabbitmq_management。管理ページの-in。

ここに画像の説明を挿入します

3. 起動スクリプトをダブルクリックしrabbitmq-server.bat、サービス管理を開いてRabbitMQs実行されているかどうかを確認します。(バージョンをダウングレードした後、バージョンはサービスに登録されません。スクリプトを開始する必要があります。サービスを実行できるように、コマンド ライン ウィンドウを閉じないでください。)

ここに画像の説明を挿入します

3.3 設置効果のテスト

1. ブラウザを開いてhttp://localhost:15672と入力します。

デフォルトのアカウントのパスワードは次のとおりです。guest/guest成功した場合の効果は次のとおりです。

ここに画像の説明を挿入します

2. インストールは成功し、ログイン後の結果は以下のようになります。

ここに画像の説明を挿入します

4. ソースコード分析

ソース コードを見ながら、新しいプロジェクトを検討するときの基本的な手順をまとめました。まず、統合と構成を確認し、次にビジネスの観点から分析し、統合されたフレームワークとコンポーネントを組み合わせて、システム アーキテクチャを順番に検討します。

**分析内容:** 以下の分析内容の大部分は図の中で説明されており、外部での説明はあまりありません。

4.1 統合と構成

ソースコード解析をそのまま取り上げ、rabbitmqに関係する部分のみを解析し、それ以外の部分を読む方はご自身でソースコード解析を読んでください。

mall-tiny-rabbit**プロジェクトの起動:**モジュール部分を起動するだけで済みます。

**起動に必要:** RabbitMQ サービスを開始します (win10 バージョンは以前にインストールされていました)

4.1.1 依存関係のインポート

pom文件Rabbitmq の関連依存関係をインポートしますspring-boot-starter-amqp(rabbitmq は springboot に統合されています)。

ここに画像の説明を挿入します

4.1.2 設定の追加

application.ymlRabbitmq 関連の設定を に追加します

ここに画像の説明を挿入します

4.1.3 ユーザー、パスワード、バインドロールを作成する (コマンドラインで)

RabbitMQ のユーザー管理には、ユーザーの追加、ユーザーの削除、ユーザー リストの表示、ユーザー パスワードの変更が含まれます。

1. 既存のユーザーとユーザーの役割を表示します。

rabbitmqctl.bat list_users

ここに画像の説明を挿入します

2. 新しいユーザーを追加します。

// rabbitmqctl.bat add_user username password
rabbitmqctl.bat add_user mall mall

ここに画像の説明を挿入します

3. ユーザーを削除します。

// 注意观察查询、添加、删除都是只换前缀,更新亦然,就不列举了
rabbitmqctl.bat delete_user mall

4. ロールをバインドします。

rabbitmqctl.bat set_user_tags mall administrator

ここに画像の説明を挿入します

4.1.4 ユーザー、パスワード、バインドロールの作成 (Web インターフェース管理ツール下)

1. Webインターフェース管理ツールページの紹介

ここに画像の説明を挿入します

2. ユーザーを追加し、役割を割り当てる

ここに画像の説明を挿入します

3. yml ファイルが設定されているのでvirtual-host: /mall、追加しますVirtual Hosts(mysql、oracle などに似たデータベースとして理解できます)

ここに画像の説明を挿入します

4.1.5 拡張

RabbitMQ のユーザー役割は、スーパー管理者、監視者、ポリシー作成者、一般管理者、その他の5 つのカテゴリに分類できます

(1) スーパー管理者(管理者)

管理コンソール (管理プラグインが有効な場合) にログインし、すべての情報を表示し、ユーザーとポリシーを操作できます。

(2) モニタリング

管理コンソールにログインし (管理プラグインが有効な場合)、rabbitmq ノードに関する関連情報 (プロセス数、メモリ使用量、ディスク使用量など) を表示できます。

(3) 政策立案者

管理コンソールにログインし (管理プラグインが有効な場合)、ポリシーを管理できます。

(4) 一般管理者(経営陣)

管理コンソール (管理プラグインが有効な場合) にのみログインでき、ノード情報を表示したり、ポリシーを管理したりすることはできません。

(5) その他

通常、一般のプロデューサーとコンシューマーは、管理コンソールにログインできません。

4.2 簡単な言葉で説明する

4.2.1 6 つのメッセージ モードの概要

6 つのメッセージ モードの公式 Web サイト: RabbitMQ チュートリアル — RabbitMQ

  1. Simple Work Queue(シンプル ワーク キュー): これは一般にポイントツーポイント モードとも呼ばれ、1 つのメッセージが 1 つのコンシューマーによって消費されます。(複数のコンシューマが存在する場合、デフォルトでポーリング メカニズムが使用され、コンシューマにメッセージが配信されます)。
  2. Work Queues(ワーク キュー): フェア キューとも呼ばれ、より多くの作業を実行できる人が行うメッセージ キュー モデル。キューは、コンシューマへのメッセージの送信を続行する前に、コンシューマから手動 ACKを受信する必要があります。
  3. Publish/Subscribe(パブリッシュ/サブスクライブ モデル): メッセージは複数のコンシューマーによって消費されます。
  4. Routing(ルーティングモード): メッセージを選択的に受信します。
  5. Topics(トピックモード): 特定のルールに基づいてメッセージを選択して受信します。
  6. RPCモード: パブリッシャーはメッセージをパブリッシュし、RPC を通じて結果を待ちます。(使用シナリオはほとんどなく、ソース コードには含まれていません。さらに詳しく知りたい場合は、公式 Web サイトにアクセスして詳細を確認できます)

ps :公式ウェブサイトの最後にPublisher Confirmsメッセージ確認の仕組みがあります。プロデューサーが信頼できるメッセージを送信する方法を指します。

4.2.2 シンプルワークキューモード

メッセージは 1 つのコンシューマによって消費されます (複数のコンシューマがある場合、デフォルトでローテーション メカニズムが使用されて、メッセージがコンシューマに配信されます)。

1、配置类

RabbitMQ の Spring 構成クラスを構成しますSimpleRabbitConfig。これにより、メッセージ キュー オブジェクト、メッセージを送信するオブジェクト ( SimpleSender)、およびメッセージを受信するオブジェクト ( SimpleReceiver) が作成されます。これらのオブジェクトは Spring フレームワークによって管理および挿入されます。

ここに画像の説明を挿入します

2、消息发送者

ここに画像の説明を挿入します

3、消息消费者

ここに画像の説明を挿入します

4、简单工作队列模式的控制层接口

ここに画像の説明を挿入します

5、swagger发送效果

swagger を開始できない場合は、以前のブログ投稿を参照してください: mall: redis プロジェクトのソース コード分析_Yi~成功ブログ-CSDN ブログ

ここに画像の説明を挿入します

6、rabbitmq服务端的界面显示效果

ここに画像の説明を挿入します

7、idea控制台打印的日志信息

ここに画像の説明を挿入します

4.2.3 ワークキューモード

Fair queue は、より多くの作業を実行できる人がより多くの作業を実行できるメッセージ キュー モデルです。キューは、コンシューマへのメッセージの送信を続行する前に、コンシューマから手動 ACKを受信する必要があります。(模擬消費量)

1、定义了一些消息队列以及相应的消息接收器和发送器

ここに画像の説明を挿入します

2、消息发送者

ここに画像の説明を挿入します

3、消息消费者

ここに画像の説明を挿入します

4、工作队列模式的控制层接口

ここに画像の説明を挿入します

5、idea控制台打印的日志信息

ここに画像の説明を挿入します

4.2.4 パブリッシュ/サブスクライブ モデル

メッセージは複数のコンシューマーによって消費されます。

1、配置类

ここに画像の説明を挿入します

2、消息发送者

ここに画像の説明を挿入します

3、消息消费者

ここに画像の説明を挿入します

4、发布/订阅模式的控制层接口

ここに画像の説明を挿入します

5、rabbitmq服务端的界面显示效果

ここに画像の説明を挿入します

6、idea控制台打印的日志信息

ここに画像の説明を挿入します

4.2.5 ルーティングモード

メッセージを選択して受信します。

1、配置类

異なるバインディング キーを設定することにより、異なるキューを同じスイッチにバインドして、メッセージのルーティングと配信を実装できます。

ここに画像の説明を挿入します

2、消息发送者

ここに画像の説明を挿入します

3、消息消费者

ここに画像の説明を挿入します

4、路由模式的控制层接口

ここに画像の説明を挿入します

5、idea控制台打印的日志信息

ここに画像の説明を挿入します

4.2.5 テーマモード

特定のルールに基づいてメッセージを選択的に受信します。

1、配置类

ここに画像の説明を挿入します

2、消息发送者

ここに画像の説明を挿入します

3、消息消费者

ここに画像の説明を挿入します

4、路由模式的控制层接口

ここに画像の説明を挿入します

5、idea控制台打印的日志信息

ここに画像の説明を挿入します

5. まとめ

この記事では、RabbitMQ メッセージ キューを学ぶために、まず実際のプロジェクトから要件を取得し、学習するソース コードと組み合わせて、mallオープンソース プロジェクトから RabbitMQ を学ぶことができ、非常に得をしたと感じています。この記事がお役に立てば幸いです。

将来的には、このフレームワークを組み合わせて他のテクノロジー スタックも学習する予定です。

盈若安好,便是晴天

おすすめ

転載: blog.csdn.net/qq_51601665/article/details/132587126