消息队列RabbitMQ.01.安装部署与基本使用

目录

 RabbitMQ的作用

Message queue 释义

 问题思考

 存在的问题

优化方案 

案例分析 

带来的好处 

消息队列特点

 Email邮件案例分析

Docker安装部署RabbitMQ

1.下拉镜像

2.运行RabbitMQ

 3.打开防火墙端口号并重新运行防火墙

4.容器启动后,可以通过 docker logs 容器 查看日志

6.通过刚才填写的用户名和密码登录 admin 

 springboot连接配置

1.配置spring账号

2.创建两个springboot项目publisher consumer 选择依赖 

3.配置yml文件 

4.生产者配置类

5.生成者测试类

6.消费者接受信息


 RabbitMQ的作用


Message queue 释义

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

 问题思考

假设我们在淘宝下了一笔订单后 , 淘宝后台需要做这些事情:
  1.  消息通知系统:通知商家,你有一笔新的订单,请及时发货
  2.  推荐系统:更新用户画像,重新给用户推荐他可能感兴趣的商品
  3.  会员系统:更新用户的积分和等级信息
createOrder(...) {
// 完成订单服务
doCreateOrder(...);
// 调用其他服务接口
sendMsg(...);
updateUserInterestedGoods(...);
updateMemberCreditInfo(...);
}

 存在的问题

  • 过度耦合:如果后面创建订单时,需要触发新的动作,那就得去改代码,在原有的创建订单函数末尾,再追加一行代码
  • 缺少缓冲:如果创建订单时,会员系统恰好处于非常忙碌或者宕机的状态,那这时更新会员信息就会失败,我们需要一个地方,来暂时存放无法被消费的消息

优化方案 

我们需要一个消息中间件 , 来实现解耦和缓冲的功能 .

Server(Broker): 接收客户端连接 , 实现 AMQP 协议的消息队列和路由功能的进程 .
Virtual Host :虚拟主机的概念 , 类似权限控制组 , 一个 Virtual Host 里可以有多个 Exchange Queue.
Exchange: 交换机 , 接收生产者发送的消息 , 并根据 Routing Key 将消息路由到服务器中的队列 Queue.
ExchangeType: 交换机类型决定了路由消息行为 ,RabbitMQ 中有三种类型 Exchange, 分别是 fanout direct topic.
Message Queue :消息队列 , 用于存储还未被消费者消费的消息 .
Message :由 Header body 组成 ,Header 是由生产者添加的各种属性的集合 , 包括 Message 是否被持久化、优先级是多少、由哪个 Message Queue 接收等 .body 是真正需要发送的数据内
.
BindingKey :绑定关键字 , 将一个特定的 Exchange 和一个特定的 Queue 绑定起来 .

案例分析 

小红希望小明多读书 , 常寻找好书给小明看 , 之前的方式是这样:小红问小明什么时候有空 , 把书给小明送去 , 并亲眼监督小明读完书才走 . 久而久之 , 两人都觉得麻烦 .
后来的方式改成了:小红对小明说「我放到书架上的书你都要看」 , 然后小红每次发现不错的书都放到书架上 , 小明则看到书架上有书就拿下来看 .
书架就是一个消息队列 , 小红是生产者 , 小明是消费者
带来的好处 
1. 小红想给小明书的时候 , 不必问小明什么时候有空 , 亲手把书交给他了 , 小红只把书放到书架上就行了 . 这样小红小明的时间都更自由 .
2. 小红相信小明的读书自觉和读书能力 , 不必亲眼观察小明的读书过程 , 小红只要做一个放书的动作 , 很节省时间 .
3. 当明天有另一个爱读书的小伙伴小强加入 , 小红仍旧只需要把书放到书架上 , 小明和小强从书架上取书即可
4. 书架上的书放在那里 , 小明阅读速度快就早点看完 , 阅读速度慢就晚点看完 , 没关系 , 比起小红把书递给小明并监督小明读完的方式 , 小明的压力会小一些 .
消息队列特点
1. 解耦 : 每个成员不必受其他成员影响 , 可以更独立自主 , 只通过一个简单的容器来联系 .
2. 提速 : 小红选只要做一个放书的动作 , 为自己节省了大量时间 .
3. 广播 : 小红只需要劳动一次 , 就可以让多个小伙伴有书可读 , 这大大地节省了她的时间 , 也让新的小伙伴的加入成本很低 .
4. 错峰与流控 : 小红给书的频率不稳定 , 如果今明两天连给了五本 , 之后隔三个月才又给一本 , 那小明只要在三个月内从书架上陆续取走五本书读完就行了 , 压力就不那么大了 .

 Email邮件案例分析

有大量用户注册你的软件 , 再高并发情况下注册请求开始出现一些问题 .
例如邮件接口承受不住 , 或是分析信息时的大量计算使 cpu 满载 , 这将会出现虽然用户数据记录很快的添加到数据库中了 , 但是却卡在发邮件或分析信息时的情况 .
导致请求的响应时间大幅增长 , 甚至出现超时 , 这就有点不划算了 . 面对这种情况一般也是将这些操作放入消息队列 ( 生产者消费者模型 ), 消息队列慢慢的进行处理 , 同时可以很快的完成注册请
, 不会影响用户使用其他功能

Docker安装部署RabbitMQ


1.下拉镜像

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

2.运行RabbitMQ

docker run -itd \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management
--hostname :主机名 (RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据 , 默认为主机名 )
-e :指定环境变量 :
RABBITMQ_DEFAULT_VHOST :默认虚拟机名
RABBITMQ_DEFAULT_USER :默认的用户名
RABBITMQ_DEFAULT_PASS :默认用户名的密码

 3.打开防火墙端口号并重新运行防火墙

firewall-cmd --zone=public --add-port=15672/tcp --permanentfirewall-cmd --reload

4.容器启动后,可以通过 docker logs 容器 查看日志

docker logs my-rabbitmq

5.通过主机网址进入管理后台

虚拟机ip地址/15672

6.通过刚才填写的用户名和密码登录 admin 

 springboot连接配置


1.配置spring账号

切记需要授权

2.创建两个springboot项目publisher consumer 选择依赖 

3.配置yml文件 

#publisher
server:port: 8888
spring:rabbitmq:host: 192.168.241.130username: springpassword: 123456port: 5672virtual-host: my_vhost#consumer
server:port: 9999
spring:rabbitmq:host: 192.168.241.130username: springpassword: 123456port: 5672virtual-host: my_vhost

4.生产者配置类

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {@Beanpublic Queue firstQueue() {return new Queue("firstQueue");}@Beanpublic Queue secondQueue() {return new Queue("secondQueue");}
}

5.生成者测试类

public class TestController {@Autowiredprivate AmqpTemplate template;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping("/send1")public String send1(){//向消息队列发送消息template.convertAndSend("firstQueue","hello world");return "🤣";}@RequestMapping("/send2")public String send2() throws Exception{User jack = new User("jack", "123");String json = objectMapper.writeValueAsString(jack);//向消息队列发送消息template.convertAndSend("secondQueue",jack);return "🤣";}
}

因为消息队列支持的对象传参必须consumer 和 publisher 两个项目的pojo包路径完全一致所以使用:

@Autowired
private ObjectMapper objectMapper;
User jack = new User("jack", "123");

记得抛出异常 throws Exception 不然会报错

6.消费者接受信息

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue")
public class Receiver {@RabbitHandlerpublic void process(String msg) {log.warn("接收到:" + msg);}
}
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue")
public class PojoReceiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void process(String json) throws Exception{User user=objectMapper.readValue(json,User.class);log.warn("接收到:" + json);}
}

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

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

相关文章

如何使用宝塔面板搭建Discuz论坛服务并结合内网穿透远程访问

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board(以下简称 Discuz!)是一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上&a…

(三) MySQL字符集

MySQL字符集包括 基字符集(CHARACTER)与校对规则(COLLATION)这两个概念: latin1支持西欧字符、希腊字符等gbk支持中文简体字符big5支持中文繁体字符utf8几乎支持世界所有国家的字符utf8mb4是真正意义上的utf-8 查看当…

Git学习笔记(第6章):GitHub操作(远程库操作)

目录 6.1 远程库操作 6.1.1 创建远程库 6.1.2 命名远程库 6.1.3 本地库推送到远程库(push) 6.1.4 远程库拉取到本地库(pull) 6.1.5 远程库克隆到本地库(clone) 6.2 团队内协作 6.3 跨团队协作 6.4 SSH免密登录 6.1 远程库操作 命令 作用 git remote -v 查看所有远程…

【EISCOPUS双检索】2024电子、通信与智能科学国际会议(ECIS 2024)征稿通知!

2024年5月24日-27日 中国|长沙 会议重要日期 一轮截稿时间:2024年3月10日 录用通知时间:投稿后7-15天 注册截止时间:2024年5月10日 一、大会背景 随着互联网的不断创新,电子、通信和智能科学已经广泛应用于各个领域。为了为…

智慧博物馆信息化系统建设(1)

博物馆RFID藏品管理系统 博物馆藏品保管是一项十分复杂又繁琐的工作。从事保管工作除了经常、及时地进行藏品的登记、分类、编目、保养和修复等一系列工作外,还需要把有关藏品的信息迅速、正确地提供给利用者。要提高保管工作的效率,达到现代化的科学管理,从发展趋势看,进…

街机模拟游戏逆向工程(HACKROM)教程:[19]思路的多样性

在上一章,我们找到了检测敌人出现条件的地方,并测试成功,但是找到这个位置的思路并不只有这个方法,这里我们提供另一个思路。 我们已经知道,敌人出现需要一个条件,当这个条件满足时,敌人的出现,程序会需要初始化这个敌人出现的位置,也就是说,我们可以利用敌人的坐标…

教你三个方法去除图片上的涂鸦快收藏起来吧

在数字时代,我们经常需要在图片上进行各种编辑和修改,以使其符合我们的需求。然而,有时候我们会遇到一些图片上的涂鸦,这些涂鸦不仅影响了图片的美观度,还破坏了图片的整体效果。那么图片上的涂鸦怎么去掉,…

怎么移除WordPress后台工具栏“新建”菜单?如何添加“新建文章”菜单?

默认情况下,WordPress后台顶部管理工具栏有左侧有一个“新建”菜单,而且还有下拉菜单文章、媒体、链接、页面和用户等,不过我们平时用得最多的就是“新建文章”,虽然可以直接点击“新建”,或点击“新建 – 文章”&…

docker安装Rabbitmq教程(详细图文)

目录 1.下载Rabbitmq的镜像 2.创建并运行rabbitmq容器 3.启动web客户端 4.访问rabbitmq的微博客户端 5.遇到的问题 问题描述:在rabbitmq的web客户端发现界面会弹出如下提示框Stats in management UI are disabled on this node 解决方法 (1&#…

赠书活动~

关注公众号获得,发送抽奖

JSON简单了解

文章目录 1、JSON介绍2、ES6模版字符串3、JS对象转化为JSON字符串3.1、手动JS对象转化为JSON字符串3.2、自动JS对象转化为JSON字符串 4、JS对象和java互相转换 1、JSON介绍 JSON 概念:JavaScript Object Notation。JavaScript 对象表示法,简单理解JSON是…

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(九)

26.搭建开发环境 开发环境 | webpack 中文文档 (docschina.org) 之前运行时出现的警告和mode配置有关 目标11:配置开发服务器环境 webpack-dev-server 11.1 下载 webpack-dev-server 软件包到当前项目 11.2 设置打包的模式为开发模式,配置自定义命令 11…

OpenGL ES 实现图像腐蚀、膨胀、边缘检测

前文我们详细讲了图像锐化的基本原理,本文再介绍一下图像基本处理之腐蚀、膨胀和边缘检测,它们在图像处理和计算机视觉领域有着广泛的应用。 图像腐蚀(Image Erosion):用于缩小或消除图像中物体的边界。主要用于去除图像中的小细节、噪声或不规则物体。 实现图像腐蚀的片…

高清短视频素材网站有哪些?分享十个做短视频必备的素材下载网站!

对于专注于短视频制作和剪辑的朋友来说,找到高质量的视频素材至关重要。你可能会想:“高清短视频素材网站有哪些?”别担心,今天我要为大家推荐十个提供优质素材的网站,帮你轻松搞定短视频制作! 怪木素材网…

垃圾收集算法

垃圾收集算法有如下几种: 分代收集理论:年龄代和老年代选择各自的垃圾收集算法。 复制算法:可达性分析算法找非垃圾对象,然后把非垃圾对象移动到另一端,这一端的垃圾对象清除,该方法浪费内…

SpringBoot解决Slow HTTP慢速攻击漏洞

项目场景: 扫描到的漏洞截图: 攻击原理: Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送…

〖大前端 - ES6篇①〗- ES6简介

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

burp靶场--host攻击

burp靶场–host攻击 https://portswigger.net/web-security/host-header#what-is-an-http-host-header-attack 在本节中,我们将讨论错误配置和有缺陷的业务逻辑如何通过 HTTP 主机标头使网站遭受各种攻击。我们将概述用于识别易受 HTTP 主机标头攻击的网站的高级方…

PolarDB无感切换特性助力游戏领域高可用实践

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…

零代码编程:用ChatGPT智能批量删除文件标题中的某些字符

文件里面有很多个mp4视频文件,要批量删除文件标题中的“Little Fox - ”“Level 04”、“Level 4”、“Level04”“ - ”、“-”、“_”等字母和符号。 在ChatGPT中输入提示词如下: 你是一个Python编程专家,要完成一个批量重命名文件标题的任…