当前位置: 首页 > news >正文

如何使用Spring Cloud搭建MQ(Message Queue)消息队列

Spring Cloud是一个开源框架,用于构建基于微服务架构的应用程序。它提供了多种工具和技术,用于实现各种微服务模式,并使它们易于管理和部署。MQ(消息队列)则是一种重要的异步通信机制,用于在不同的应用程序之间进行通信。在本篇博客中,我们将详细讲解如何使用Spring Cloud搭建MQ。

目录

第一部分:什么是Spring Cloud?

第二部分:什么是MQ?

第三部分:使用Spring Cloud搭建MQ

1. 准备工作

2. 添加依赖项

3. 配置RabbitMQ

4. 创建生产者

5. 创建消费者

6. 配置消息队列

7. 测试应用程序

8. 高级配置

8.1 定义交换器

8.2 定义队列

8.3 定义绑定

8.4 配置RabbitMQ连接

8.5 测试应用程序

总结


第一部分:什么是Spring Cloud?

Spring Cloud是一个基于Spring Framework的开源框架,用于构建基于微服务架构的应用程序。它为开发人员提供了一套工具和技术,可以轻松地实现和管理各种微服务模式。Spring Cloud提供了各种解决方案,包括服务发现、配置管理、负载均衡、断路器、API网关等,使得开发人员能够轻松地创建和管理微服务。

第二部分:什么是MQ?

MQ(消息队列)是一种重要的异步通信机制,用于在不同的应用程序之间进行通信。它允许应用程序之间的异步通信,可以提高应用程序的可伸缩性和可靠性。MQ通常由生产者、消费者和消息队列组成,其中生产者将消息发送到消息队列,消费者从消息队列中接收消息并对其进行处理。MQ还提供了一些高级功能,如消息持久性、事务支持、消息路由和过滤器等。

第三部分:使用Spring Cloud搭建MQ

1. 准备工作

在开始搭建MQ之前,我们需要进行一些准备工作。首先,我们需要安装RabbitMQ服务器,并确保其已启动。其次,我们需要确保已安装Spring Boot和Spring Cloud,并已将它们添加到项目依赖中。最后,我们需要创建一个Spring Boot项目,以便我们可以开始编写代码。

2. 添加依赖项

在开始编写代码之前,我们需要添加一些必要的依赖项。在pom.xml文件中添加以下依赖项:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

这将使我们能够使用Spring Cloud Stream,它是Spring Cloud用于构建消息驱动微服务的解决方案。

3. 配置RabbitMQ

在我们可以开始使用RabbitMQ之前,我们需要配置它。我们可以在application.properties文件中添加以下属性:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

这些属性指定了RabbitMQ服务器的主机名、端口号、用户名和密码。

4. 创建生产者

现在我们已经准备好了,我们可以开始编写代码了。首先,我们将创建一个生产者,它将发送消息到RabbitMQ消息队列。以下是一个简单的生产者实现:

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class Producer implements CommandLineRunner {@Autowiredprivate RabbitTemplate rabbitTemplate;@Overridepublic void run(String... args) throws Exception {String message = "Hello RabbitMQ!";rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message.getBytes());System.out.println("Sent message: " + message);}
}

在这个例子中,我们使用了Spring Boot的CommandLineRunner接口来定义我们的生产者。在run()方法中,我们使用RabbitTemplate来发送消息到名为"myExchange"的交换器,并使用"myRoutingKey"路由键。我们还打印了发送的消息以供参考。

5. 创建消费者

接下来,我们将创建一个消费者,它将从RabbitMQ消息队列中接收消息并对其进行处理。以下是一个简单的消费者实现:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class Consumer {@RabbitListener(queues = "myQueue")public void processMessage(byte[] message) {String text = new String(message);System.out.println("Received message: " + text);}
}

在这个例子中,我们使用了Spring Boot的RabbitListener注解来定义我们的消费者。processMessage()方法将接收到的字节数组转换为字符串,并打印出接收到的消息。

6. 配置消息队列

在我们可以测试我们的生产者和消费者之前,我们需要配置消息队列。在Spring Boot中,我们可以使用注解来定义消息队列。以下是我们需要在应用程序中添加的注解:

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {@Beanpublic Queue myQueue() {return new Queue("myQueue", false);}
}

在这个例子中,我们使用了@Configuration注解来定义我们的配置类。我们还使用@Bean注解来定义名为"myQueue"的消息队列。

7. 测试应用程序

现在我们已经完成了所有的设置和配置,可以测试我们的应用程序了。运行应用程序并检查控制台输出,确保生产者已成功发送消息并且消费者已成功接收并处理消息。

8. 高级配置

Spring Cloud还提供了一些高级配置选项,可以帮助我们更好地管理和控制消息队列。例如,我们可以使用以下注解来定义交换器和路由键:

8.1 定义交换器

交换器用于将消息路由到正确的队列。在这个例子中,我们将使用Spring Boot的ExchangeBuilder来创建一个名为"myExchange"的直接交换器:

@Bean
public Exchange myExchange() {return ExchangeBuilder.directExchange("myExchange").durable(true).build();
}

在这个例子中,我们使用了@Bean注解来定义名为"myExchange"的直接交换器。我们还使用了durable(true)选项来使交换器持久化,这样即使在RabbitMQ服务器关闭后也能保留交换器。

8.2 定义队列

在这个例子中,我们将创建两个队列,一个用于普通消息,一个用于重要消息。以下是我们需要在应用程序中添加的注解:

@Bean
public Queue myQueue() {return new Queue("myQueue", false);
}@Bean
public Queue importantQueue() {return new Queue("importantQueue", false);
}

在这个例子中,我们使用了@Bean注解来定义名为"myQueue"和"importantQueue"的两个队列。我们还使用了durable(false)选项来使队列非持久化,这样如果RabbitMQ服务器关闭,队列中的消息将会丢失。

8.3 定义绑定

在这个例子中,我们将定义绑定,将交换器和队列连接起来。以下是我们需要在应用程序中添加的注解:

@Bean
public Binding myBinding() {return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey").noargs();
}@Bean
public Binding importantBinding() {return BindingBuilder.bind(importantQueue()).to(myExchange()).with("importantRoutingKey").noargs();
}

在这个例子中,我们使用了@Bean注解来定义名为"myBinding"和"importantBinding"的两个绑定。我们还使用了with()选项来指定路由键,以便将消息发送到正确的队列。

8.4 配置RabbitMQ连接

在这个例子中,我们还需要配置RabbitMQ连接,以便我们的应用程序可以与RabbitMQ服务器通信。以下是我们需要在应用程序中添加的属性:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在这个例子中,我们使用了Spring Boot的属性文件来配置RabbitMQ连接。我们指定了RabbitMQ服务器的主机名、端口号、用户名和密码。

8.5 测试应用程序

现在我们已经完成了所有的设置和配置,可以测试我们的应用程序了。运行应用程序并检查控制台输出,确保生产者已成功发送消息并且消费者已成功接收并处理消息。还要确保消息已正确地路由到相应的队列中。

总结

在本文中,我们介绍了RabbitMQ作为消息代理的基本概念,包括交换器、队列、绑定和路由键等。我们还介绍了Spring Boot如何与RabbitMQ集成,并使用Spring Cloud Stream来简化消息传输和处理过程。

在代码示例中,我们展示了如何创建生产者和消费者,并使用注解来定义交换器、队列和绑定。我们还演示了如何配置RabbitMQ连接,并测试了应用程序的正确性和可靠性。

总的来说,本文是一个入门级别的指南,希望能够帮助读者更好地理解和应用Spring Cloud和消息队列技术。如果您想深入学习和了解更多高级主题,可以参考官方文档和其他在线资源。

相关文章:

如何使用Spring Cloud搭建MQ(Message Queue)消息队列

Spring Cloud是一个开源框架&#xff0c;用于构建基于微服务架构的应用程序。它提供了多种工具和技术&#xff0c;用于实现各种微服务模式&#xff0c;并使它们易于管理和部署。MQ&#xff08;消息队列&#xff09;则是一种重要的异步通信机制&#xff0c;用于在不同的应用程序…...

iphone备忘录删除怎么恢复?分享苹果数据找回办法

手机备忘录上写记录&#xff0c;这是不少上班族的小习惯。因为它可以先记录紧急事务&#xff0c;然后再慢慢的解决。也可以把我们一些重要的账号密码存在备忘录里&#xff0c;方便在何时何地直接登入使用。那么如果我们不小心删除了iphone备忘录呢?碰到这种事该怎么办呢?有没…...

【PPT】《我去!还有这种网站?》-知识点目录

《我去&#xff01;还有这种网站&#xff1f;》 1. Vega AI 输入提示&#xff1a; girl&#xff0c;粉头发2. 物理画线&#xff1a;休闲小游戏 3. Dialogue&#xff1a;影视台词搜索 4. Can you run it&#xff1a;游戏设备要求查询 5. Deviceshots&#xff1a;使用设备边…...

SQL 将查询结果插入到另一张表中

INSERT INTO &#xff08;1&#xff09; 如果两张表&#xff08;导出表和目标表&#xff09;的字段一致&#xff0c;并且希望插入全部数据&#xff0c;可以用这种方法&#xff1a; INSERT INTO 目标表 SELECT * FROM 来源表 WHERE 条件;例如&#xff0c;要将 test 表插入到 n…...

代码随想录算法训练营day48 | 动态规划 121 买卖股票的最佳时机 122 买卖股票的最佳时机II

day48121. 买卖股票的最佳时机1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组122.买卖股票的最佳时机II121. 买卖股票的最佳时机 题目链接 解题思路&#xff1a; 动规五部曲分析如下&#xff1a…...

MediaTek 天玑 8000 5G移动平台详细参数

MediaTek 天玑 8000 移动平台 采用先进的 台积电 5nm 工艺&#xff0c;拥有出众的性能和能效&#xff0c;为高端智能手机用户提供出色的高帧率游戏和 5G 移动体验。 天玑 8000 采用了 MediaTek 诸多先进技术&#xff0c;内置 MediaTek Imagiq 780影像引擎、第五代 AI 处理器APU…...

Kafka

这里写目录标题1.Kafka1.1 Kafka概述1.2 kafka安装和配置1.3 入门案例1.4 kafka生产者详解1.4.1 生产者的参数1.Kafka 1.1 Kafka概述 Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。 producer&#xff1a;发布消息的对象称之为主题生产者&#xff08;Ka…...

数据结构——第三章 栈与队列(2)

栈的运用1.括号匹配2.表达式求值2.1.算术表示式的形式2.2.后缀表达式求值2.3.将算术表达式转换为后缀表达式2.4.算术表达式直接求值3.栈与递归3.1.递归算法3.2.栈与函数调用3.3.递归工作与递归函数3.4.递归到非递归的转换1.括号匹配 void matching(char str[]) {//创建空栈Lin…...

【Linux学习】基础IO——理解缓冲区 | 理解文件系统

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 基础IO☕理解缓冲区&#x1f9c3;缓冲区的共识&#x1f9c3;缓冲区的位置&#x1f9c3;缓冲区的刷…...

RHCSA-重置root密码(3.3)

方法1&#xff1a;rd.break &#xff08;1&#xff09;首先重启系统&#xff0c;在此页面按e键&#xff0c;在屏幕上显示内核启动参数 &#xff08;2&#xff09;知道linux这行&#xff0c;末尾空格后输入rd.break&#xff0c;然后按ctrlx &#xff08;3&#xff09;查看&#…...

无公网IP快解析实现U+随时随地访问

现阶段商品从生产到消费者手中要经过多个环节&#xff0c;为实现对每一个环节进行管理&#xff0c;越来越多的企业选择通过信息化手段来实现。供应链管理系统配合供应链中各实体的业务需求&#xff0c;使操作流程和信息系统紧密配合&#xff0c;做到各环节无缝链接&#xff0c;…...

UVa 307 Sticks 木棍拼接 ID 迭代加深搜

题目链接&#xff1a;Sticks 题目描述&#xff1a; 小明一开始有一些长度相等的木棍&#xff0c;小明现在将木棍砍成了一些长度为整数的木棍&#xff0c;他现在忘记了最开始木棍的长度&#xff0c;你需要找到最短的可能木棍长度&#xff0c;例如给定5,2,1,5,2,1,5,2,15,2,1,5,2…...

阿里云(CentOS)中MySQL8忘记密码的解决方法

阿里云(CentOS)中MySQL8忘记密码的解决方法 方法 在 skip-grant-tables 模式下启动 MySQL&#xff0c;该模式下启动 MySQL 时不启动授权表功能&#xff0c;可以直接免密码登录 实现 编辑 /etc/my.cnf 文件 vim /etc/my.cnf在 [mysqld] 区域末尾添加配置&#xff0c;设置免密…...

三、Spring的入门程序

第一个Spring程序 创建新的空工程spring6 设置JDK版本17&#xff0c;编译器版本17 设置IDEA的Maven&#xff1a;关联自己的maven 在空的工程spring6中创建第一个maven模块&#xff1a;spring6-001-first 在pom.xml添加spring context依赖和junit依赖&#xff0c; <?x…...

摘录一下Python列表和元组的学习笔记

1 基础概念 列表一个值&#xff0c;列表值指的是列表本身&#xff0c;而不是列表中的内容 列表用[]表示 列表中的内容称为 表项 len()函数可以显示列表中表项的个数&#xff0c;比如下面这个例子 spam [cat, bat, dog, rat]print(len(spam))列表的范围选取中&#xff0c;比…...

【量化金融】收益率、对数收益率、年华收益、波动率、夏普比率、索提诺比率、阿尔法和贝塔、最大回撤

【量化金融】收益率、对数收益率、年华收益、波动率、夏普比率、索提诺比率、阿尔法和贝塔、最大回撤 1 收益率 在学术界&#xff0c;建模一般不直接使用资产价格&#xff0c;而是使用资产收益率(Returns)。因为收益率比价格具有更好的统计特性&#xff0c;更便于建模。下经典…...

1_机器学习概述—全流程

文章目录1 机器学习定义2 机器学习常见应用框架&#xff08;重点&#xff09;3 机器学习分类3.1 监督学习&#xff08;Supervised learning&#xff09;3.2 无监督学习&#xff08;Unsupervised learning&#xff09;3.3 半监督学习&#xff08;Semi-Supervised Learning&#…...

VUE中给对象添加新属性时,界面不刷新怎么办

一、直接添加属性的问题 举例&#xff1a; 定义一个p标签&#xff0c;通过v-for指令进行遍历 然后给botton标签绑定点击事件&#xff0c;我们预期点击按钮时&#xff0c;数据新增一个属性&#xff0c;界面也 新增一行。 <p v-for"(value,key) in item" :key&qu…...

视频号频出10w+,近期爆红的账号有哪些?

回顾2月&#xff0c;视频号持续放出大动作&#xff0c;不仅进行了16小时不间断的NBA全明星直播&#xff0c;还邀请国际奥委会入驻&#xff0c;分享奥运的最新资讯。视频号成为越来越多官方机构宣传推广的有效渠道。官方积极入驻&#xff0c;内容创作生态也在同步繁荣发展&#…...

企业寄件现代化管理教程

现代化企业为了跟上时代发展的步伐&#xff0c;在不断完善着管理制度&#xff0c;其中公司寄件管理&#xff0c;也是重要的一个模块。为了提高公司快递的寄件效率&#xff0c;以及节约寄件成本&#xff0c;实现快递寄件的规范化&#xff0c;越来越多的现代化企业&#xff0c;开…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …...

大模型智能体核心技术:CoT与ReAct深度解析

**导读&#xff1a;**在当今AI技术快速发展的背景下&#xff0c;大模型的推理能力和可解释性成为业界关注的焦点。本文深入解析了两项核心技术&#xff1a;CoT&#xff08;思维链&#xff09;和ReAct&#xff08;推理与行动&#xff09;&#xff0c;这两种方法正在重新定义大模…...

DROPP算法详解:专为时间序列和空间数据优化的PCA降维方案

DROPP (Dimensionality Reduction for Ordered Points via PCA) 是一种专门针对有序数据的降维方法。本文将详细介绍该算法的理论基础、实现步骤以及在降维任务中的具体应用。 在现代数据分析中&#xff0c;高维数据集普遍存在特征数量庞大的问题。这种高维特性不仅增加了计算…...