搭建RabbitMQ消息服务,整合SpringBoot实现收发消息

news2024/12/1 0:40:20

作者主页:Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。

目录

  • 一、前言
    • 1.1 什么是消息队列
    • 1.2 RabbitMQ 是什么
    • 1.3 为什么需要用到 RabbitMQ
    • 1.4 RabbitMQ 相比 Kafka 的优势
  • 二、搭建 RabbitMQ 环境
    • 2.1 安装 Erlang
      • 2.1.1 下载
      • 2.1.2 安装
      • 2.1.3 环境变量配置
    • 2.2 安装 RabbitMQ
      • 2.2.1 下载
      • 2.2.2 安装
      • 2.2.3 初始化
      • 2.2.4 验证
    • 2.3 配置外网访问
      • 2.3.1 添加新用户
      • 2.3.2 Virtual Host 配置
  • 三、整合 RabbitMQ 消息服务
    • 3.1 创建新的 SpringBoot 项目
    • 3.2 引入依赖
    • 3.3 配置文件
    • 3.4 创建消息发送工具类
    • 3.5 发消息功能测试
    • 3.6 创建消息接收工具类
    • 3.7 收消息功能测试
  • 四、总结

一、前言

1.1 什么是消息队列

消息队列是一种在应用程序之间传递数据的通信机制,它基于 发布-订阅 模式,将消息发送者(发布者)和消息接收者(订阅者)解耦,使得它们可以独立地进行消息的发送和接收。

在消息队列中,消息发送者将消息发送到队列中,而消息接收者则从队列中获取消息进行处理。消息队列提供了一种异步的通信方式,即发送者发送消息后不需要等待接收者的回复,而可以立即继续执行其他操作。同时,消息队列还可以实现消息的持久化存储,确保消息在发送和接收过程中的可靠性。

消息队列的应用场景非常广泛,例如:

  • 在分布式系统中,可以用消息队列来实现不同模块之间的解耦;
  • 在高并发系统中,可以利用消息队列来缓解系统压力;
  • 在实时数据处理中,可以将数据存储在消息队列中,再由数据处理模块进行处理。

在这里插入图片描述

1.2 RabbitMQ 是什么

RabbitMQ是一个开源的消息队列中间件,它实现了高级消息队列协议),并提供了可靠的消息传递机制。

RabbitMQ使用Erlang语言编写,具有高度可靠、可扩展、灵活和可插拔的特性,被广泛应用于分布式系统、微服务架构、异步任务处理等场景。

RabbitMQ基于生产者和消费者模型工作。生产者将消息发送到RabbitMQ的交换机,然后交换机将消息路由到一个或多个队列,消费者从队列中获取消息并进行处理。

RabbitMQ 支持多种消息传递模式,同时还提供了消息的持久化、消息优先级、消息确认机制等特性,确保消息的可靠性和可靠传输。

RabbitMQ是一个成熟、可靠的消息队列中间件,提供了强大的消息传递机制和丰富的特性,被广泛应用于分布式系统和异步消息处理中。

在这里插入图片描述

1.3 为什么需要用到 RabbitMQ

  1. 解耦:RabbitMQ通过消息队列实现了生产者和消费者的解耦。生产者将消息发送到队列中,而消费者从队列中获取消息并进行处理。这种解耦使得系统中的不同模块能够独立进行开发和部署,提高了系统的灵活性和可维护性。

  2. 异步通信:RabbitMQ提供了一种异步通信机制。生产者发送消息到队列后,不需要等待消费者立即处理,而可以继续执行其他操作。这种异步通信能够提升系统的并发性能和响应速度。

  3. 缓冲和削峰:RabbitMQ可以作为一个缓冲区,用于存储来自生产者的消息。这样可以避免生产者和消费者之间的直接耦合,同时也能够应对瞬时的高并发请求,减轻系统压力。

  4. 可靠性和可恢复性:RabbitMQ提供了持久化消息的功能,即使在消息队列或消费者故障的情况下,消息也可以得到保留和恢复。这种可靠性保证了消息的不丢失和可靠传递。

  5. 扩展性:RabbitMQ是一个可扩展的消息队列中间件,可以在需要的时候增加更多的消息队列和消费者节点,以应对不断增长的业务需求。

  6. 多语言支持:RabbitMQ提供了多种编程语言的客户端,如Java、Python、C#等,使得开发者可以选择合适自己的编程语言与RabbitMQ进行交互。

在这里插入图片描述

1.4 RabbitMQ 相比 Kafka 的优势

RabbitMQ 提供了简单易用的 API 和管理界面,使得开发者可以快速上手并进行配置和管理,相比之下,Kafka 的配置和管理相对复杂一些。

RabbitMQ 支持多种消息传递模式和消息的路由选择机制,可以根据需求进行灵活的消息处理,而Kafka更适用于大规模的高吞吐量流式处理,通常使用发布-订阅模式。

RabbitMQ 具备持久化消息、消息确认机制等特性,可以确保消息的可靠传输,而 Kafka 通过多副本机制和消息日志的方式,提供了高度可靠性的消息传递。

RabbitMQ 可以通过设置队列的限流策略和消费者的消费速率来进行流量控制和削峰处理,能够保护消费者免受过多的消息推送,而Kafka则将消费者的消费速率控制交给消费者自身,在高并发场景下可能需要额外处理。

RabbitMQ 提供了多种编程语言的客户端,开发者可以根据自己的编程需求选择合适的客户端进行交互,而Kafka的客户端主要集中在Java语言上,对其他语言的支持相对较少。

RabbitMQ 拥有庞大的开源社区和丰富的生态系统,提供了丰富的插件和集成工具,方便开发者进行扩展和集成,Kafka的生态系统相对较小,但在大数据领域有广泛的应用和支持。

在这里插入图片描述


二、搭建 RabbitMQ 环境

2.1 安装 Erlang

Erlang 是 RabbitMQ 消息服务的基础环境,就像 Java 的 JDK 一样,是必须安装的。

2.1.1 下载

Erlang 官网下载地址:下载地址。

在这里插入图片描述

因为我们要把 RabbitMQ 服务装在服务器上,所以同学们可以在服务器上下载 Erlang 安装包,或者下载后手动上传至服务器。

2.1.2 安装

下载完成后双击安装包,按照提示流程正常安装即可,截图如下所示。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.3 环境变量配置

变量名如下,变量值是安装的路径,如下图所示。

ERLANG_HOME

在这里插入图片描述

在这里插入图片描述

验证命令如下:

erl -v

在这里插入图片描述

2.2 安装 RabbitMQ

2.2.1 下载

RabbitMQ 需要在 Github 中下载,下载地址。

RabbitMQ 版本需要和 Erlang 对应,本文安装的是 3.9.5 版本。

2.2.2 安装

安装流程如下图所示。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2.3 初始化

安装完成后,使用 cmd 窗口,进入 RabbitMQ 的 sbin 目录,如下图所示。

在这里插入图片描述
接着输入以下命令,完成初始化安装。

rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

2.2.4 验证

打开浏览器,输入:

http://localhost:15672

账号密码都是:

guest

在这里插入图片描述
在这里插入图片描述

2.3 配置外网访问

2.3.1 添加新用户

RabbitMQ 默认端口为15672,用户名和密码都为guest,是不允许外部访问的。

所以我们要添加新用户,实现外网访问,操作流程如下图所示。

在这里插入图片描述

点击添加后,输入新用户的账号和密码,如下图所示。

在这里插入图片描述

2.3.2 Virtual Host 配置

Virtual Host 需要允许添加的用户访问,如下图所示。

在这里插入图片描述

进入子界面后,选择用户后提交,如下图所示。

在这里插入图片描述

然后,我们就完成了外网访问的配置。


三、整合 RabbitMQ 消息服务

3.1 创建新的 SpringBoot 项目

打开 IDEA 工具,新建项目,如下图所示。

在这里插入图片描述

新项目创建完成后,如下图所示。

在这里插入图片描述

3.2 引入依赖

首先,请在 pom.xml 中引入依赖,代码如下。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3.3 配置文件

application.yml 配置如下。

spring:
  rabbitmq:
    host: 118.126.82.167
    port: 5672
    username: zwz
    password: 123456
    listener:
      simple:
        retry:
          enabled: true
          max-attempts: 5
          initial-interval: 2s

3.4 创建消息发送工具类

请同学们创建 SimpleProducer 工具类,代码如下。

package cn.zwz.send;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class SimpleProducer {

    public static void main(String[] args) {
        //1. 创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //1.1 设置连接IP
        connectionFactory.setHost("118.126.82.167");
        //1.2 设置连接端口
        connectionFactory.setPort(5672);
        //1.3 设置用户名
        connectionFactory.setUsername("zwz");
        //1.4 设置密码
        connectionFactory.setPassword("123456");
        //1.5 设置虚拟访问节点,就是消息发送的目标路径
        connectionFactory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;
        try {
            //2. 创建连接Connection
            connection = connectionFactory.newConnection("ZWZ-Connection");
            //3. 通过连接获取通道Channel
            channel = connection.createChannel();
            //4. 通过通道创建交换机,声明队列,绑定关系,路由key,发送消息,接收消息
            String queueName = "ZWZ-TOPIC";
            /**
             * channel.queueDeclare有5个参数
             * params1: 队列的名称
             * params2: 是否要持久化, false:非持久化 true:持久化
             * params3: 排他性,是否独占队列
             * params4: 是否自动删除,如果为true,队列会随着最后一个消费消费完后将队列自动删除,false:消息全部消费完后,队列保留
             * params5: 携带的附加参数
             */
            channel.queueDeclare(queueName, true, false, false, null);
            //5. 消息内容
            String message = "HELLO World!";
            //6. 将消息发送到队列
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println("消息发送成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7. 关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //8. 关闭连接
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

3.5 发消息功能测试

发消息很简单,运行 main 函数即可。

在这里插入图片描述

发送成功后,后台可以接收到数据,如下图所示。

在这里插入图片描述
在这里插入图片描述

3.6 创建消息接收工具类

请同学们创建 SimpleConsumer 工具类,代码如下。

package cn.zwz.send;

import com.rabbitmq.client.*;

import java.io.IOException;

public class SimpleConsumer {

    public static void work() {
        //1. 创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //1.1 设置连接IP
        connectionFactory.setHost("118.126.82.167");
        //1.2 设置连接端口
        connectionFactory.setPort(5672);
        //1.3 设置用户名
        connectionFactory.setUsername("zwz");
        //1.4 设置密码
        connectionFactory.setPassword("123456");
        //1.5 设置虚拟访问节点,就是消息发送的目标路径
        connectionFactory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;
        try {
            //2. 创建连接Connection
            connection = connectionFactory.newConnection("ZWZ-Connection");
            //3. 通过连接获取通道Channel
            channel = connection.createChannel();
            //4. 通过通道创建交换机,声明队列,绑定关系,路由key,发送消息,接收消息
            String queueName = "ZWZ-TOPIC";
            //5. 接收消息并消费消息
            channel.basicConsume(queueName, true, new DeliverCallback() {
                @Override
                public void handle(String consumerTag, Delivery message) throws IOException {
                    System.out.println("接收到的消息内容是:" + new String(message.getBody(), "UTF-8"));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String consumerTag) throws IOException {
                    System.out.println("消息接收失败。。。");
                }
            });
            System.out.println("开始接受消息。。。。");
            //阻断程序
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7. 关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //8. 关闭连接
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

接着在启动类上配置运行,代码如下。

package cn.zwz.send;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SendApplication {

	public static void main(String[] args) {
		new SimpleConsumer().work();
		SpringApplication.run(SendApplication.class, args);
	}
}

3.7 收消息功能测试

请同学们运行 SpringBoot 启动类,然后再次发送消息,就可以看到消息内容了,如下图所示。

在这里插入图片描述

四、总结

本文首先简单介绍了 RabbitMQ,然后和 Kafka 等热门消息队列进行对比,最后演示了 RabbitMQ 的完整安装配置整合流程,帮助零基础的小白入门 RabbitMQ 开发。


在这里插入图片描述

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

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

相关文章

【AI】机器学习——线性模型(线性回归)

线性模型既能体现出重要的基本思想&#xff0c;又能构造出功能更加强大的非线性模型 文章目录 3.1 线性模型3.1.1 数据3.1.2 目标/应用 3.2 线性回归3.2.1 回归模型历史3.2.2 回归分析研究内容回归分析步骤 3.2.3 回归分析分类3.2.4 回归模型3.2.5 损失函数梯度下降法一元回归模…

【数据仓库基础(二)】数据仓库架构

文章目录 一. 基本架构二. 主要数据仓库架构1. 数据集市架构1.1. 独立数据集市1.2. 从属数据集市1.3. Inmon企业信息工厂架构 2. Kimball数据仓库架构3. 混合型数据仓库架构 三. 操作数据存储&#xff08;ODS&#xff09; 一. 基本架构 架构是指系统的一个或多个结构。结构中包…

stride与padding对输出尺寸的计算

公式&#xff1a; 练习&#xff1a; 图1&#xff1a; input4&#xff0c;filter3&#xff0c;padding0&#xff0c;stride1 output2 图2&#xff1a; input5&#xff0c;filter3&#xff0c;padding0&#xff0c;stride2 output2 图3&#xff1a; input6&#xff0c;filter3&am…

设计模式之观察者模式、访问者模式与模板方法模式

目录 观察者模式 简介 优缺点 结构 实现 运用场景 访问者模式 简介 优缺点 结构 实现 运用场景 模板方法模式 简介 优缺点 结构 实现 运用场景 观察者模式 简介 又叫发布-订阅模式&#xff0c;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改…

Android 应用程序通过MediaPipe 图片识别

MediaPipe 中使用目标检测模型可以实现实时检测图像或视频中的物体&#xff0c;并标记出物体的位置和类别。MediaPipe 中的目标检测模型基于机器学习算法&#xff0c;经过训练以识别特定的物体类别&#xff1b; 以下是在 Android 应用程序中集成 MediaPipe Object Detection 的…

SpringMVC应用

文章目录 一、常用注解二、参数传递2.1 基础类型String2.2 复杂类型2.3 RequestParam2.4.路径传参 PathVariable2.4 Json数据传参 RequestBody2.5 RequestHeader 三、方法返回值3.1 void3.2 Stringmodel3.3 ModelAndView 一、常用注解 SpringMVC是一个基于Java的Web框架&#…

Nacos启动连接mysql报错

问题 Nacos启动后&#xff0c;访问http://localhost:8848/nacos/index.html一直访问不了&#xff0c;查看nacos安装目录下的logs/config-fatal.log日志文件发现连接mysql报错&#xff0c;但是通过客户端连接工具测试mysql连接正常&#xff1b;核心报错如下&#xff1a; Cause…

【线程池】面试被问到线程池参数如何配置时该如何回答

前言 没有基于业务场景&#xff0c;直接抛出这个问题&#xff0c;等同于耍流氓。 八股文告诉我们CPU密集型就核心数1&#xff0c;IO密集型就核心数*2&#xff0c;那么真实业务中该怎么去配置呢。 方法论还是有的 1.需要分析线程池执行的任务的特性&#xff1a; CPU 密集型还是 …

【操作】安防监控/视频汇聚/视频云存储EasyCVR平台AI智能分析网关V3接入教程2.0

TSINGSEE的边缘计算硬件智能分析网关V3内置多种AI算法模型&#xff0c;包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合TSINGSEE青犀的视频汇聚/安…

数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度

0 数据结构概述 四门课的关系 1 绪论 数据对象、数据元素、数据项关系 1.1 数据结构的基本概念 1.2 算法和算法评价 小练习 空间复杂度中的递归调用 n只是传入 n也是数组&#xff0c;计算存储数组flag的空间大小

HTTPS协议和SOCKS5协议的区别

HTTPS协议和SOCKS5协议是两种不同的网络协议&#xff0c;它们在传输数据的方式、安全性和使用场景等方面都有所不同。下面将介绍HTTPS协议与SOCKS5协议的区别。 传输数据的方式 HTTPS协议是一种基于HTTP协议的安全协议&#xff0c;它使用SSL/TLS协议对数据进行加密和解密。在传…

Kafka3.0.0版本——消费者(独立消费者消费某一个主题数据案例__订阅主题)

目录 一、独立消费者消费某一个主题数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题数据案例 1.1、案例需求 创建一个独立消费者&#xff0c;消费firstTopic主题中数据&#xff0c;所下图所示&#xff1a; 注意&#xff1a;在消费者 API 代码中必…

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09; 目录 时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测&#xff08;风电功率预测&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1…

Matlab 如何把频谱图的纵坐标设置为分贝刻度

Matlab 如何把频谱图的纵坐标设置为分贝刻度 Matlab代码如下&#xff1a; % 如何把频谱图的纵坐标设置为分贝刻度 % % pr2_2_6 clc; clear; close all;load pr2_2_6_sndata1.mat % 读入数据 X fft(y); % FFT n2 1:L/21; % 计算正频率…

天翼云不做备案接入,如何绑定域名,不用80端口,443端口。

443&#xff0c;80端口不开启。 第一步&#xff1a; 宝塔更改web端口 搞个复杂的端口。 第二步&#xff1a; 在天翼云策略组上面开启修改过的web端口。 第三步&#xff1a;接入cdn&#xff0c;端口改成修改过的端口。

EVA: Visual Representation Fantasies from BAAI

本文做个简单总结&#xff0c;博主不是做自监督领域的&#xff0c;如果错误&#xff0c;欢迎指正。 链接 Code&#xff1a; Official&#xff1a;baaivision/EVA MMpretrain&#xff1a;open-mmlab/mmpretrain/tree/main/configs/eva02 Paper&#xff1a; EVA01&#xff1a;…

LAMP搭建WordPress

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php yum -y install php php-fpm php-server php-mysql1.1、 启动php-fpm并自启 systemctl enable php-fpm --now[rootecs-1cee ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process ManagerLoa…

Ae 效果:CC Cross Blur

模糊和锐化/CC Cross Blur Blur & Sharpen/CC Cross Blur CC Cross Blur&#xff08;CC 交叉模糊&#xff09;可以通过单独控制水平和垂直方向的模糊程度来创建独特的交叉模糊效果&#xff0c;可以产生类似光线交错的视觉外观。 ◆ ◆ ◆ 效果属性说明 Radius X 半径 X 用…

CSS笔记(黑马程序员pink老师前端)盒子阴影,文字阴影

盒子阴影 属性值为box-shadow,盒子阴影不占空间,不影响盒子之间的距离. 值说明h-shadow必需,水平阴影位置,允许为负值v-shadow必需,水平阴影位置,允许为负值blur可选,模糊距离,数值越大影子越模糊spread可选,影子的尺寸color可选,影子的颜色inset可选, 将外阴影改为内阴影(省…

Python调试学习资料

Python调试学习资料 python -m pdb example.py网络资源 Python代码调试的几种方法总结Python 程序如何高效地调试&#xff1f;Python Debugging With Pdbpdb — The Python DebuggerThe Python Debugger (pdb)Python Debugger with Examples