RabbitMQ入门概念

目录

一、RabbitMQ入门

1.1 rabbitmq是啥?

1.2 应用场景

1.3 AMQP协议与RabbitMQ工作流程

1.4 Docker安装部署RabbitMQ

二、SpringBoot连接MQ配置

2.1 示例1

 2.1 示例2 —— 发送实体


一、RabbitMQ入门

1.1 rabbitmq是啥?

MQ(Message queue 释义):消息队列,本质上就是一个队列。

  • 服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信)
  • 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端,称为延迟消息通讯(异步通信)

        而消息队列(Message Queue)是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。

1.2 应用场景

        RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。

ribbitmq主要解决异步处理、应用解耦、流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构

  • 异步处理

如图所示:当一个用户购买了商品,订单开始发送发货通知——>刷新商品推荐(重新计算用户的喜好)——>增加会员积分,这些时间加一起就要150ms。而使用的RabbitMQ之后,将订单的求情放到rabbitmq容器中,不需要等待其他服务处理完再返回结果,让他们自己去rabbitmq排队处理。

  • 解耦 

如图所示:假设有系统B、C、D都需要系统A的数据,于是系统A调用三个方法发送数据到B、C、D。这时,系统D不需要了,那就需要在系统A把相关的代码删掉。假设这时有个新的系统E需要数据,这时系统A又要增加调用系统E的代码。为了降低这种强耦合,就可以使用MQ,系统A只需要把数据发送到MQ,其他系统如果需要数据,则从MQ中获取即可。 

  • 削峰 

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列

  1. 可以控制活动的人数
  2. 可以缓解短时间内高流量压垮应用 

如图所示:这其实是MQ一个很重要的应用。假设用户在某一段时间请求数暴增,有5000个请求发送过来,系统这时就会发送5000条SQL进入MySQL进行执行,MySQL对于如此庞大的请求当然处理不过来,MySQL就会崩溃,导致系统瘫痪。如果使用MQ,系统不再是直接发送SQL到数据库,而是把数据发送到MQ,MQ短时间积压数据,然后由消费者每次拉取2000条进行处理,防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃

1.3 AMQP协议与RabbitMQ工作流程

        AMQP:一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

像RabbitMQ这样的消息队列实现是基于AMQP协议的,如果先了解一条消息从投递到消息队列到被消费者消费的生命周期,再来深入了解RabbitMQ的使用那就很easy。

  • 消息(Message):即客户端与消息中间件传送的数据。
  • 生产者(Publisher):消息发起人。
  • 消费者(Consumer):消息消费者。
  • 交换机(Exchange):接收消息,并将消息路由转发给消息队列。
  • 虚拟主机(Virtual Host):进行逻辑隔离,一个虚拟主机可以创建若干个交换机和队列。
  • 绑定(Binding):交换机和队列之间的虚拟连接。
  • 路由键(Routing Key):路由规则,虚拟机可以用来确定如何路由一个特定的消息。
  • 队列(Queue):存储即将被消费者消费掉的消息。
  • 中间件(Broker ):实现AMQP实体服务,比如常见的RabbitMQ、Azure Service Bus等。
  • 信道(Channel):网络信道,是建立在Connection连接之上的一种轻量级的连接,可以创建多个信道。
  • 连接(Connection):一个网络连接,比如TCP/IP连接。AMQP连接通常是长连接,当一个应用不再需要连接到AMQP代理的时候,需要释放掉 AMQP 连接,而不是直接将TCP连接关闭。

工作过程:

1.生产者发布消息,经由交换机。
2.交换机根据路由规则将收到的消息分发给与该交换机绑定的队列。
3.最后消息中间件会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

4.消费者在成功处理消息后向 RabbitMQ 发送确认(ACK)。这告诉 RabbitMQ 可以安全地从队列中删除该消息。如果消费者在处理消息时发生错误,RabbitMQ 可以将消息重新分发给其他消费者。

可靠性与持久性:RabbitMQ 提供了消息的持久性选项,允许将消息和队列标记为持久的。这确保即使 RabbitMQ 服务器重启,消息和队列也不会丢失。

技术选型:

1.4 Docker安装部署RabbitMQ

  •  拉取镜像
docker pull rabbitmq:management

注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面。

  •  创建容器

1、创建宿主机目录

防火墙开放端口:

firewall-cmd --zone=public --add-port=5672(15672)/tcp --permanent

docker run -itd \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /home/rabbitmq:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=ycxw \
-e RABBITMQ_DEFAULT_PASS=123 \
--restart=always \
rabbitmq:management

--hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)

-e:指定环境变量:

  • RABBITMQ_DEFAULT_VHOST:默认虚拟机名
  • RABBITMQ_DEFAULT_USER:默认的用户名
  • RABBITMQ_DEFAULT_PASS:默认用户名的密码
  • 访问RabbitMQ管理平台

 登录进入之后就可看到一些用户数据、所管理的虚拟主机、队列等等。。。这里不做详细讲解,简单了解请看目录:1.3

二、SpringBoot连接MQ配置

2.1 示例1

1、创建项目:publisher 生成者 , consumer 消费者

rabbitmq需要导入amqp依赖

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

 2、rabbitmq连接配置

生产者端口:8888        消费者端口:6666

注意!!!

        需等生产者创建队列后并发送过一次信息被rabbitmq接受,消费者才能启动项目,不然会报错找不到连接的队列名

server:port: 8888
spring:rabbitmq:#虚拟机地址host: 192.168.83.129port: 5672#rabbitmq注册用户与密码username: ycxwpassword: 123virtual-host: my_vhost
  • 生产者(publisher) 

3、创建Rabbit配置类RabbitConfig,配置类主要用来配置队列、交换器、路由等高级信息

package com.ycxw.publisher.demos;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitConfig {@Beanpublic Queue firstQueue() {return new Queue("firstQueue");}
}

4、创建消息产生者类

package com.ycxw.publisher.demos;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Sender {@Autowiredprivate AmqpTemplate rabbitTemplate;@RequestMapping("/send1")public String sendFirst() {/*向消息队列发送消息 converAndSend(队列名,发送的信息)*/rabbitTemplate.convertAndSend("firstQueue", "Hello World");return "🫶";}
}

  • 消费者

5、编写接受队列的消息方法

package com.ycxw.consumer.demos;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue") //监听消息队列
public class Receiver {//处理接受的信息@RabbitHandlerpublic void process(String msg) {log.warn("接收到:" + msg);}
}

 6、测试

生产者发起请求:

rabbitmq管理界面查看数据:

消费者接受信息:

 2.1 示例2 —— 发送实体

注意!!!

  1. 处理不同请求许再创建一个队列
  2. 实体需进行序列化才可发送
  3. 发送实体,需要两个模块的实体必须同名同包下         

1、创建实体类

package com.ycxw.publisher.demos;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;//实现spring自带序列化接口
@SuppressWarnings("all")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {private String username;private String userpwd;
}

 

 2、创建队列(生产者)

3、 编写发送信息方法

注入ObjectMapper类将实体装换成json格式的数据进行发送 

 4、接受信息(消费者)

package com.ycxw.consumer.demos;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue") //监听消息队列
public class Receiver2 {@Autowiredprivate ObjectMapper objectMapper;//处理接受的信息@RabbitHandlerpublic void process(String json) throws JsonProcessingException {//将接受的json数据转换成实体User ycxw = objectMapper.readValue(json, User.class);log.warn("接收到:" + ycxw);}
}

5、测试

消费者接受的信息

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

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

相关文章

ArcGIS Pro字段编号相关代码

字段属于SHP文件的重要组成部分&#xff0c;在某些时候需要对字段进行编号&#xff0c;这里为大家介绍一下字段编号相关的代码&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了POI数据&#xff0c;常见的GIS数据都可…

C语言第十四弹---函数递归

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么&#xff1f; 1.1、递归的思想&#xff1a; 1.2、递归的限制条件 2、递归举例 2.1、举例1&#xff1a;求n的阶乘 2.1.1、分析和代码…

Transformer 代码补充

本文是对Transformer - Attention is all you need 论文阅读-CSDN博客以及【李宏毅机器学习】Transformer 内容补充-CSDN博客的补充&#xff0c;是对相关代码的理解。 先说个题外话&#xff0c;在之前李宏毅老师的课程中提到multi-head attention是把得到的qkv分别乘上不同的矩…

【Java】Lombok的使用

一、Lombok是什么&#xff1f; Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要为类编写getter或eques方法&#xff0c;同时可以自动化日志变量&#x1f680; 在我们封装一个类时&#xff0c;最常用…

CUDA编程- - GPU线程的理解 thread,block,grid - 学习记录

GPU线程的理解 thread,block,grid 一、从 cpu 多线程角度理解 gpu 多线程1、cpu 多线程并行加速2、gpu多线程并行加速2.1、cpu 线程与 gpu 线程的理解&#xff08;核函数&#xff09;2.1.1 、第一步&#xff1a;编写核函数2.1.2、第二步&#xff1a;调用核函数&#xff08;使用…

网络代理用途

网络代理的用途广泛&#xff0c;常用于代理爬虫&#xff0c;代理VPN &#xff0c;代理注入等。使用网络 代理能够将入侵痕迹进一步减少&#xff0c;能够突破自身IP的访问限制&#xff0c;提高访问速度&#xff0c; 以及隐藏真实IP &#xff0c;还能起到一定的防止攻击的作用。下…

ROS方向第二次汇报(2)

文章目录 1.本方向内学习内容&#xff1a;1.1.动作&#xff1a;1.1.1.案例接口定义:1.1.2.案例通信模型&#xff1a;1.1.3.服务器端代码&#xff1a;1.1.4.客户端源代码&#xff1a;1.1.5.动作命令行操作&#xff1a; 1.2.参数&#xff1a;1.2.1.查看参数列表&#xff1a;1.2.2…

dvwa靶场xss储存型

xss储存型 xxs储存型lowmessage框插入恶意代码name栏插入恶意代码 medium绕过方法 high xxs储存型 攻击者事先将恶意代码上传或储存到漏洞服务器中&#xff0c;只要受害者浏览包含此恶意代码的页面就会执行恶意代码。产生层面:后端漏洞特征:持久性的、前端执行、储存在后端数据…

4JS表达式和运算符expression and operator

表达式&#xff08;expression&#xff09;JavaScript中的一个短语&#xff0c;JavaScript解释器会将其计算&#xff08;evaluate&#xff09;出一个结果。程序中的常量是最简单的一类表达式。变量名也是一种简单的表达式&#xff0c;它的值就是赋值给变量的值。复杂表达式是由…

类与对象(中篇)

1、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 2、构造函数---初始…

Java技术栈 —— Spring MVC 与 Spring Boot

参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC

CRM系统主要干什么的

阅读本文&#xff0c;你将了解&#xff1a;一、CRM系统是什么&#xff1b;二、CRM系统主要干什么的&#xff1b;三、CRM系统在企业管理中的重要作用&#xff1b;四、企业落地案例分享——大吉包装。 本文所提及的功能演示和图片内容均来自于我们公司正在使用的简道云CRM系统&a…

【JVM】类加载流程

目录 1.加载 2.链接 &#xff08;1&#xff09;校验 &#xff08;2&#xff09;准备 &#xff08;3&#xff09;解析 3.初始化 4.使用 5.卸载 1.加载 加载阶段&#xff0c;简言之&#xff0c;查找并加载类的二进制数据&#xff0c;生成 Class 的实例 在加载类时&#x…

【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr

目录 1 -> 引用 1.1 -> 引用概念 1.2 -> 引用特性 1.3 -> 常引用 1.4 -> 使用场景 1.5 -> 传值、传引用效率比较 1.6 -> 值和引用作为返回值类型的性能比较 1.7 -> 引用和指针的区别 2 -> 内联函数 2.1 -> 概念 2.2 -> 特性 3 -…

Linux ---- Shell编程三剑客之AWK

一、awk处理文本工具 1、awk概述 awk 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。AWK是专门为文本处理设计的编程语言&#xff0c;也是行处理软件&#xff0c;通常用于扫描、过滤、统计汇总工作。用来处理列。数据可以来自标准输入也可以是管道或文件。…

共享的IP隔一段时间就变?用这种方法可以不需要知道电脑IP

前言 一般来说,电脑接入路由器之后,IP是由路由器自动分配的(DHCP),但如果隔一段时间不开机连接路由器,或者更换了别的网卡进行连接,自动分配的IP就会更改。 比如你手机连接着电脑的共享IP:192.168.1.10,但过段时间之后,电脑的IP突然变成了192.168.1.11,那么你的所有…

Qt+css绘制标题

之前学过html和小程序&#xff0c;帮老师做项目的时候也用过vue&#xff0c;在想qt绘制界面是不是也可以使用css,然后查了一些资料&#xff0c;绘制了一个标题&#xff0c;准备用到智能家居的上位机上面。 成果 源码 重写了paintEvent函数和TimeEvent函数&#xff0c;一个用于绘…

幻兽帕鲁服务器多少钱一个?26元,阿里云腾讯云华为云

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

透明拼接屏造型:多样拼接与影响因素

透明拼接屏&#xff0c;以其独特的透明显示效果和灵活的拼接方式&#xff0c;在现代显示领域中独树一帜。其造型多样&#xff0c;包括横屏拼接、竖屏拼接、异形拼接以及定制拼接等多种方式&#xff0c;满足了不同场景和应用的需求。尼伽小编将详细介绍这些拼接方式&#xff0c;…

PR转场模板|超级炫酷故障特效电影游戏视频转场PR模板剪辑素材

premiere转场&#xff0c;包含200个带有Sound FX的独特视频转场效果。加强剪辑视频视觉效果&#xff0c;在镜头之间的剪辑和添加文字动画&#xff01; MYFX Extension可帮助您一键浏览和应用预设&#xff01;可以喜爱预设&#xff0c;并拥有自己亲手挑选的库。如果您有任何问题…