1. 背景
この章では、ユーザーが注文するときのメッセージ サーバー RabbitMQ のアプリケーションについて説明します。
1.1 メッセージサーバーの応用
私は電子商取引プロジェクトの小さなデモを書いています。電子商取引プロジェクトでは、メッセージ サーバーのアプリケーションが次のようになります。
1. 注文ステータス通知: ユーザーが注文するとき、支払いが成功するとき、注文が発送されるとき、注文が完了するとき、およびその他の主要ノードでは、対応する注文ステータス通知をメッセージ サーバーを通じてユーザーに送信できます。
2. メッセージプッシュ: メッセージサーバーを通じて、パーソナライズされた推奨製品、プロモーション活動、その他のメッセージをユーザーにプッシュして、ユーザーの参加率と購入率を高めることができます。
3. 非同期処理: 在庫控除、物流追跡など、時間のかかる操作を伴う一部のシナリオでは、タスクをメッセージ サーバーに引き渡して非同期処理を行うことで、システムの同時実行性と応答速度を向上させることができます。
4. リアルタイム チャット: 電子商取引システムがオンライン カスタマー サービスやユーザー間のリアルタイム通信をサポートしている場合、メッセージ サーバーを使用してインスタント メッセージングを実装できます。
5. メッセージ キュー: メッセージ サーバーは、システム内の異なるモジュール間の分離と非同期通信を実現するために、メッセージ キューのキャリアとしても機能します。
メッセージ サーバーの選択では、RabbitMQ、Apache Kafka、ActiveMQ などのオープン ソースのメッセージ キュー ミドルウェアの使用、または Alibaba Cloud のメッセージ キュー RocketMQ、Tencent Cloud のメッセージ キュー CMQ などのクラウド サービス プロバイダーが提供するメッセージ キュー サービスの使用を検討できます。等
メッセージ サーバーを使用する場合は、データのセキュリティと信頼性を確保し、システムの正常な動作とユーザー エクスペリエンスを確保するためにメッセージの形式と送信方法を合理的に設計する必要があることに注意してください。
1.2 注文リンクにおけるメッセージサーバーの適用シナリオ
ユーザーが注文すると、アプリケーション メッセージ サーバーには次の一般的なアプリケーション シナリオがあります。
1. 非同期注文処理: ユーザーが注文した後、注文情報はメッセージ サーバーに送信され、メッセージ サーバーによって非同期に処理されます。これにより、ユーザーの待ち時間が短縮され、システムの同時実行性が向上します。メッセージ サーバーは、在庫控除、物流注文番号の生成、その他の操作など、注文のさまざまなビジネス ロジックの処理を担当できます。
2. 注文ステータス通知: ユーザーが注文した後、通知サーバーは、注文が送信された、支払いが成功した、注文が発送された、注文が発送されたなどの注文ステータス通知をユーザーに送信できます。完成しました。メッセージ サーバーは、リアルタイムでユーザーに通知をプッシュし、優れたユーザー エクスペリエンスを提供できます。
3. 注文ステータスの追跡: 注文ライフサイクル全体において、メッセージ サーバーは注文のステータス変更を記録および追跡できます。ユーザーが注文ステータスをクエリすると、メッセージ サーバーを通じて最新の注文ステータス情報を取得できるため、注文ステータスの正確さとリアルタイムのパフォーマンスが保証されます。
4. メッセージ キュー: メッセージ サーバーは、注文関連のメッセージをキューに入れるためのメッセージ キューのコンポーネントとして使用できます。このようにして、注文モジュールと他のモジュール間の依存関係を分離することができ、システムの安定性と拡張性を向上させることができます。
2. RabbitMQのダウンロードとインストール
2.1 RabbitMQ の公式 Web サイトのアドレス:
RabbitMQ の公式 Web サイトのアドレス:
RabbitMQ: 使いやすく、柔軟なメッセージングとストリーミング — RabbitMQ
2.2. brew を使用してインストールする
1. インストール
brew install rabbitmq
インストール結果:
Rabbitmq のインストール パス:
/opt/homebrew/opt/rabbitmq
2. 環境変数を設定する
vi ~/.bash_profile
export RABBIT_HOME=${PATH}:/opt/homebrew/opt/rabbitmq
export PATH=${PATH}:$RABBIT_HOME/sbin
source ~/.bash_profile
2.3 RabbitMQの起動
1.フォアグラウンドで
Rabbitmq-serverを実行します。
2.バックグラウンドで
Rabbitmq-server-detachedを実行します。
3. 実行ステータスの表示
Rabbitmqctl ステータス
4. Web プラグインを開始します
Rabbitmq-plugins Enable Rabbitmq_management
5. 再起動
Rabbitmq-server restart
5.
Rabbitmqctl stopを閉じる
2.4. MQ へのアクセス
1. ブラウザのアドレス
http://localhost:15672/
デフォルトのユーザー名とパスワードは guest です。
ユーザーの追加
Rabbitmqctl add_user miaojiang 123
ユーザーを管理者として設定します
Rabbitmqctl set_user_tags miaojiang 管理者
ユーザーが Rabbitmqctl にリモートでログインするように設定します。
set_permissions -p "/" miaojaing ".*" ".*" ".*"
新しく追加されたアカウントを表示する
Rabbitmqctl list_users
使用されている権限を表示
Rabbitmqctl list_permissions -p /
3. Spring Boot プロジェクト アプリケーション RabbitMQ
3.1. Maven 依存関係を追加します。
RabbitMQ クライアント ライブラリの依存関係をプロジェクトの pom.xml ファイルに追加します。
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.2. RabbitMQ 接続の設定:
Spring Boot 構成ファイル (application.properties または application.yml) に RabbitMQ 接続情報を追加します。
アプリケーションのプロパティ:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
application.yml で mq パラメーターを構成します。
spring:
rabbitmq:
#设置RabbitMQ的IP地址
host: localhost
#设置rabbitmq服务器用户名
username: guest
#设置rabbitmq服务器密码
password: guest
#设置rabbitmq服务器连接端口
port: 5672
3.3 スイッチの作成
カスタムスイッチ名
「myExchange」という名前の交換を作成します
package com.example.usermanagement.mq;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
/*
使用 @Configuration 注解创建一个配置类,并通过 @Bean 注解创建了一个名为 declareExchange 的方法,用于声明创建交换机。请根据实际情况修改交换机名称、类型和持久化设置。
*/
public static final String EXCHANGE_NAME = "myExchange";
@Bean
public Exchange declareExchange() {
return ExchangeBuilder.directExchange(EXCHANGE_NAME)
.durable(true)
.build();
}
}
3.4 メッセージ送信者の作成
メッセージ送信者の作成: RabbitMQ にメッセージを送信するためのメッセージ送信者クラスを作成します。
package com.example.usermanagement.mq;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MessageSender{
private final AmqpTemplate amqpTemplate;
private final String exchangeName = "myExchange"; // 自定义交换机名称
@Autowired
public MessageSender(AmqpTemplate amqpTemplate) {
this.amqpTemplate = amqpTemplate;
}
public void sendMessage(Object message) {
amqpTemplate.convertAndSend(exchangeName, "", message); // 发送消息到默认交换机和空路由键
}
}
知らせ:
sendMessage タイプは Object タイプを使用します
3.5 列を追加するための RabbitMQ 管理の背景
ステップ:
-
ブラウザを開き、RabbitMQ 管理バックグラウンドの URL を入力します。デフォルトでは、URL は です
http://localhost:15672/
。RabbitMQ サーバーが正しいポート番号で実行されていることを確認してください。 -
ユーザー名とパスワードを入力して、RabbitMQ 管理バックグラウンドにログインします。デフォルトでは、ユーザー名は で
guest
、パスワードも ですguest
。ユーザー名とパスワードを変更した場合は、カスタム認証情報を使用してログインしてください。 -
ログインに成功すると、RabbitMQ 管理バックグラウンドのメイン インターフェイスが表示されます。上部のナビゲーション バーで、
Queues
[タブ] を選択します。 -
このページには
Queues
、既存のキューのリストが表示されます。新しいキューを作成する場合は、Add a new queue
ボタンをクリックします。 -
キューを追加するページで、次の情報を入力します。
Name
: キューの名前。キューに一意の名前を付けます。(myQueueなど)Durability
: キューの永続性。[はい] または [いいえ] を選択して、RabbitMQ サービスの再起動後もキューを維持するかどうかを指定します。Auto delete
:キューを自動削除します。[はい] または [いいえ] を選択して、最後のコンシューマーが切断したときにキューを削除するかどうかを指定します。Arguments
: キューの追加パラメータ。これはオプションで、キューに特定のパラメータをいくつか設定できます。
-
キュー情報を入力したら、
Add queue
ボタンをクリックしてキューを作成します。 -
作成が成功すると、
Queues
新しく追加されたキューがページに表示されます。このページでは、メッセージ数、コンシューマー数などのキューの詳細を表示できます。
http://localhost:15672/#/queues
キュー名を追加するだけです
3.6 プロデューサーに電話する
1. インジェクションMessageSender
インスタンス
@Autowired
private MessageSender messageSender;
2. メッセージを送信する必要があるメソッドを呼び出しますmessageSender.sendMessage
。ビジネス ロジックに応じて、適切な場所でこのメソッドを呼び出すことができます。たとえば、注文が正常に作成された後、次のコードを追加できます。
messageSender.sendMessage("订单已创建:" + order.getOrderId());
3.7 メッセージ受信者の作成
メッセージ レシーバーの作成: 受信した RabbitMQ メッセージを処理するためのメッセージ レシーバー クラスを作成します。
ここでは、RabbitMQ メッセージを処理するロジックを直接記述します。
package com.example.usermanagement.mq;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MessageReceiver {
@RabbitListener(bindings = @QueueBinding(
value = @Queue("your_queue_name"),
exchange = @Exchange(value = RabbitMQConfig.EXCHANGE_NAME)
// key = "your_routing_key"
))
public void receiveMessage(Object message) {
System.out.println("Received message: " + message);
// 处理消息逻辑
}
}
知らせ:
sendMessage タイプは Object タイプを使用します
your_queue_name
リッスンするキューの名前に置き換えます(myQueue など) 。
your_routing_key
適切なルーティング キーに置き換えます(使用されている場合)。