Spring Boot 项目应用消息服务器RabbitMQ(简单介绍)

news2024/11/16 1:32:31

一、背景

本章讲述的是在用户下单环节,消息服务器RabbitMQ 的应用

1.1 消息服务器的应用

在写一个电商项目的小demo,在电商项目中,消息服务器的应用:

1、订单状态通知:当用户下单、支付成功、订单发货、订单完成等关键节点时,可以通过消息服务器向用户发送相应的订单状态通知。

2、消息推送:通过消息服务器,可以向用户推送个性化的推荐商品、促销活动等消息,以提高用户参与度和购买率。

3、异步处理:在一些涉及到耗时操作的场景中,比如库存扣减、物流跟踪等,可以将任务交给消息服务器进行异步处理,以提高系统的并发性和响应速度。

4、实时聊天:如果你的电商系统支持在线客服或用户之间的实时沟通,消息服务器可以用于实现即时通讯功能。

5、消息队列:消息服务器还可以作为消息队列的承载者,实现系统内不同模块之间的解耦和异步通信。

消息服务器的选择可以考虑使用开源的消息队列中间件,比如RabbitMQ、Apache Kafka、ActiveMQ等,或者云服务提供商提供的消息队列服务,比如阿里云的消息队列RocketMQ、腾讯云的消息队列CMQ等。

需要注意的是,在使用消息服务器时,确保数据的安全性和可靠性,并合理设计消息的格式和传输方式,以确保系统的正常运行和用户体验。

1.2 下单这个环节,消息服务器应用场景

用户下单这个环节,应用消息服务器有以下几个常见的应用场景:

1、异步处理订单:当用户下单后,可以将订单信息发送到消息服务器中,由消息服务器异步处理。这样可以减少用户等待时间,并提高系统的并发能力。消息服务器可以负责处理订单的各种业务逻辑,比如库存扣减、生成物流单号等操作。

2、订单状态通知:在用户下单后,可以通过消息服务器向用户发送订单状态的通知,比如订单已提交、支付成功、订单发货、订单完成等。消息服务器可以实时地将通知推送给用户,提供良好的用户体验。

3、订单状态跟踪:在整个订单生命周期中,消息服务器可以记录和跟踪订单的状态变化。当用户查询订单状态时,可以通过消息服务器获取最新的订单状态信息,确保订单状态的准确性和实时性。

4、消息队列:消息服务器可以作为消息队列的组件,对订单相关的消息进行队列化处理。这样可以解耦订单模块与其他模块之间的依赖关系,提高系统的稳定性和可扩展性。

二、RabbitMQ 的下载与安装

2.1 RabbitMQ的官网地址:

RabbitMQ的官网地址:

RabbitMQ: easy to use, flexible messaging and streaming — 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 status

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 administrator

配置用户可以远程登录
rabbitmqctl set_permissions -p "/" miaojaing ".*" ".*" ".*"

查看新添加的账户

rabbitmqctl list_users

查看用于的权限
rabbitmqctl list_permissions -p /

三、Spring Boot 项目应用RabbitMQ

3.1、添加Maven依赖:

在你的项目的pom.xml文件中添加RabbitMQ客户端库的依赖

<!--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的连接信息。

application.properties:

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管理后台添加对列

步骤:

  1. 打开浏览器,输入RabbitMQ管理后台的URL。默认情况下,该URL为http://localhost:15672/。请确保你的RabbitMQ服务器正在运行,并且端口号正确。

  2. 输入用户名和密码以登录到RabbitMQ管理后台。默认情况下,用户名为guest,密码也为guest。如果你修改过用户名和密码,请使用你的自定义凭据进行登录。

  3. 成功登录后,你将看到RabbitMQ管理后台的主界面。在顶部导航栏中,选择Queues选项卡。

  4. Queues页面上,你将看到已经存在的队列列表。如果你想要创建一个新队列,请点击Add a new queue按钮。

  5. 在添加队列的页面上,填写以下信息:

    • Name:队列的名称。为队列提供一个唯一的名称。(如myQueue)
    • Durability:队列的持久性。选择是或否,以指定队列是否应该在RabbitMQ服务重启后保留。
    • Auto delete:队列的自动删除。选择是或否,以指定当最后一个消费者断开连接后,是否删除队列。
    • Arguments:队列的其他参数。这是可选的,你可以为队列设置一些特定的参数。
  6. 填写完队列信息后,点击Add queue按钮以创建队列。

  7. 创建成功后,你将在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 替换为适当的路由键(如果使用)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

训练、验证和测试一句话搞懂

文章目录 训练集&#xff08;training dataset&#xff09;验证集(validation dataset)测试集(test dataset)训练集可划分为训练集和验证集二二六&#xff0c;一一八&#xff0c;一一一百 训练集&#xff08;training dataset&#xff09; 类比课堂知识&#xff0c;训练模型得…

Python中enumerate用法详解

目录 1.简介 2.语法 3.参数 4.返回值 5.详解 6.实例 7.补充 1.简介 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 2.语法 以下是 enumerate() 方法的语…

勘探开发人工智能应用:人工智能概述

0 提纲 机器学习、深度学习、计算机视觉等技术已在勘探开发、油气生产、炼油炼化、经营管理等重点环节进行应用与推广。请思考&#xff1a; 输入&#xff1a;数据是什么(数字、文本、图)&#xff1f;如何理解数据&#xff1f;如何清洗数据&#xff1f;(需要专业领域知识)输出&…

鉴权服务-天G报错引发的感想:一定要有如果报错的预案

今天是HW第一天&#xff0c;下午运维人员说鉴权服务上不去了&#xff0c;看了眼天宫&#xff0c;结果重启了&#xff0c;后来的情况就是20多分钟半小时一重启&#xff0c;真么神奇。开始排查原因&#xff1a; 1、前两天发版换的agent版本发布&#xff0c;但是不知道有没有这个…

【Winform学习笔记(六)】warning MSB3274:引用dll版本冲突

warning MSB3274&#xff1a;引用dll版本冲突 前言正文1、解决方法 前言 在本文中主要介绍 解决 类库编译 Warning MSB3274 的方法&#xff1b; 在项目中引用了自定义控件库&#xff0c;界面设计时可以正常放置删除控件&#xff0c;但启动时会报异常&#xff1b; 编译提示&…

Selenium 是什么?简单明了的介绍

Selenium Selenium 是什么 Selenium 是一款 Web UI 测试工具&#xff0c;是一款 自动化测试 工具&#xff0c;使用 Selenium 测试工具进行的测试通常被称为 Selenium Testing&#xff0c;各种支持如下列表&#xff1a; UI 元素的支持与管理&#xff1a;自写代码实现浏览器支…

(八)穿越多媒体奇境:探索Streamlit的图像、音频与视频魔法

文章目录 1 前言2 st.image&#xff1a;嵌入图像内容2.1 图像展示与描述2.2 调整图像尺寸2.3 使用本地文件或URL 3 st.audio&#xff1a;嵌入音频内容3.1 播放音频文件3.2 生成音频数据播放 4 st.video&#xff1a;嵌入视频内容4.1 播放视频文件4.2 嵌入在线视频 5 结语&#x…

c语言每日一练(4)

五道选择题 1、有以下代码&#xff0c;程序的输出结果是( ) #include <stdio.h> int main() {int a 0, b 0;for (a 1, b 1; a < 100; a){if (b > 20) break;//1if (b % 3 1)//2{b b 3;continue;}b b-5;//3}printf("%d\n", a);return 0; } A.1…

JavaWeb(11)——前端综合案例5(小黑记事本)

一、实例需求 ⌛ 功能需求&#xff1a; ① 列表渲染 ② 删除功能 ③ 添加功能 ④ 底部统计 和 清空任务 二、代码实现 ☕ <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <meta http-equiv"X-UA-Compa…

intelJ IDEA\PHPStorm \WebStorm\PyCharm 通过ssh连接远程Mysql\Postgresql等数据库

最容易出错的地方是在general面板下的host&#xff0c;不应该填真实的host地址&#xff0c;而应该填localhost或者127.0.0.1 具体操作步骤见下图

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…

SpringBoot Thymeleaf模板引擎

Thymeleaf 模板引擎 前端交给我们的页面&#xff0c;是html页面。如果是我们以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp好处就是当我们查出一些数据转发到JSP页面以后&#xff0c;我们可以用jsp轻松实现数据的显示&#xff0c;及交互等。 jsp支持非常强大…

1077 Kuchiguse

PTA | 程序设计类实验辅助教学平台 一个测试点没过&#xff0c;不知道哪的原因 #include<bits/stdc.h> using namespace std; const int N210; int n; string s[N]; string str[N]; string ans; int main() {int len300;scanf("%d",&n);getchar();for(int…

[C初阶笔记]P1

什么是C语言 1、机器语言&#xff08;二进制&#xff09;>汇编语言&#xff08;助记符&#xff09;>高级语言&#xff08;C、C等&#xff09; 2、c语言擅长底层软件开发&#xff08;操作系统、驱动程序&#xff09;&#xff0c;并不意味着不能开发其他。 C语言更贴近操作…

linux挂载sd卡

1、确定设备名&#xff1a;打开终端窗口&#xff0c;运行以下命令来查看已连接的存储设备列表 rootws:/# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTmmcblk1 179:0 0 7.3G 0 disk |-mmcblk1p1 179:1 0 70M 0 part -mmcblk1p2 179:2 0…

用datagrip远程连接mysql超时怎么解决【连接mysql会遇到的坑】

目录 一.开放端口 【1】在linux打开防火墙或开放3306端口&#xff08;其实一般情况下服务器里的防火墙并没有开启&#xff09;​编辑 【2】在控制台的云安全组里开放端口 二.修改datagrip连接时高级的useSSL属性 先填好主机&#xff08;就是IP地址&#xff09;和端口&#…

ProComponent 用法学习

相信很多同学都用过 Ant Design 这一 react 著名组件库&#xff0c;而 ProComponents 则是在 antd 之上进行封装的页面级组件库&#xff08;指一个组件就可以搞定一个页面&#xff09;。它同时也是 Ant Design Pro 中后台框架所用的主要组件库。如果你手上有要用 react 开发的中…

Pytorch深度学习-----现有网络模型的使用及修改(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

photoshop PS 查看像素坐标、像素颜色、像素HSB颜色

方法一 photoshop 菜单栏 窗口菜单->信息菜单项(F8), 在信息窗口里会有当前的 x&#xff0c;y坐标 方法二 photoshop 菜单栏 视图菜单->标尺菜单项&#xff08;ctrlR&#xff09; 宽度和高度边上都有标尺&#xff0c;默认的是厘米&#xff0c;右键单机宽度和高度边上…

【自动化测试框架】关于unitttest你需要知道的事

一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时&#xff0c;判定测试用例失败。在自动化测试中&#xff0c;通过“断言”…