Rabbit MQ的基本使用

目录

 

1. MQ是什么,有哪些作用?

2. 主要的MQ框架有哪些?

3. RabbitMQ安装

4. RabbitMQ中的主要概念

5. 消息队列的核心概念

6. 一个简单的生产者和消费者示例

6.1 消息发送者模块

6.1.1 引入必要的依赖

6.1.2 项目配置文件

6.1.3 启动类

6.1.4 RabbitMQ配置类

6.1.5 编写服务,用于向队列中存放 消息

 6.1.6 编写消费者,消费消息


1. MQ是什么,有哪些作用?



消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。是程序与程序之间传递信息的一种方式。

作用:

  • 异步: 一般适用于耗时但非核心业务的处理,即:程序无需等待非核心业务处理完成,即可进行下一步操作,有点像电路中的并行电路
  • 解耦:通过引入消息总线,将模块之间的直接的调用,转化为消息的传递。
  • 消峰:对于来不及及时处理的消息,可以暂存于消息队列里排队。
  • 缺点:
  • 可用性降低:系统加了对消费队列服务的依赖,依赖越多的系统越脆弱。
  • 复杂度提高:加入消息队列,如果消息有重复如何处理? 消息丢失如何处理?
  • 一致性问题:方法的调用者不需等待执行者的返回,如果执行者失败,则容易造成状态不一致。

2. 主要的MQ框架有哪些?



MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。本文主要介绍RabbitMq。

RabbitMQ是以AMQP协议实现的一种消息中间件产品。AMQP是Advanced Message Queuing Protocol的简称,是一个面向消息中间件的开放式标准应用层协议。

常用消息队列对照表:

3. RabbitMQ安装


1)下载rabbitmq镜像

docker pull rabbitmq:management
使用management标签是下载包含管理控制台的版本,在下载镜像时没有指定版本号,则会到docker仓库中下载最新的镜像版本。

2)运行镜像

##方式一:默认guest用户,密码也是guest

$ docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
方式二

 $ docker run -d \--name my-rabbitmq \-p 5672:5672 -p 15672:15672 \-v /data:/var/lib/rabbitmq \--hostname my-rabbitmq-host \-e RABBITMQ_DEFAULT_VHOST=my_vhost \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=admin \--restart=always \rabbitmq:management 

参数说明:

-d:后台运行容器

-name:指定容器名

-p:指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号)

-v:映射目录或文件,启动了一个数据卷容器,数据卷路径为:/var/lib/rabbitmq,再将此数据卷映射到住宿主机的/data目录

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

-e:指定环境变量;(

RABBITMQ_DEFAULT_VHOST:默认虚拟机名;

RABBITMQ_DEFAULT_USER:默认的用户名;

RABBITMQ_DEFAULT_PASS:默认用户名的密码)

--restart=always:当Docker重启时,容器能自动启动

rabbitmq:management:镜像名

注1:RABBITMQ_DEFAULT_VHOST=my_vhost,my_vhost名字请记好,在之后的编程中要用到,

如果启动时没指定,默认值为/

#4.进入RabbitMQ管理平台进行相关操作

注1:容器启动后,可以通过docker logs 窗口ID/容器名字 查看日志

docker logs my-rabbitmq

注2:停止并删除所有容器

docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
 

docker ps

4)开放端口

firewall-cmd --zone=public --add-port=15672/tcp --permanent   # 开放15672端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent 
firewall-cmd --reload   # 配置立即生效

5.运行测试

http://192.168.164.128:15672/#/

4. RabbitMQ中的主要概念


RabbitMQ是实现了高级消息服务队列协议(AMQP)的开源消息代理软件,也称为面向消息的中间件。使用erlang语言开发。AMQP是Advanced Message Queuing Protocol的简称,是面向消息中间件的开放式标准应用协议,这样意味着RabbitMQ可以更容易的构建异构的系统。

1)Server(Broker) 服务器(或叫经纪人)

可以理解为消息队列服务器的主体,接收客户端连接,实现AMQP协议的消息队列和路由功能的进程

2) Virtual Host 虚拟机

虚拟主机的概念,它是对Broker的虚拟划分,将消息生产者,消费者,和它们依赖的AMQP相关的结构进行隔离,一般是从安全方面的考虑。类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue。类似于一个数据库实例中可以创建多个数据库的概念。每个Virtual Host都是个独立的。

3)Exchange 交换机

交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue。交换机分为:fanout、direct、topic三种类型

4) Queue 队列

消息队列,用于存储还未被消费者消费的消息,用于存放业务数据

5)Message 消息

由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等;body是真正需要发送的数据内容;

在业务系统中代码真正的业务数据

6)Binding Key 绑定关键字

绑定关键字,将一个特定的Exchange和一个特定的Queue绑定起来

7)Routing key:路由关键字,Exchange根据这个关键字进行消息投递

8)connection:连接,代理生产者,消费者、Broker之间通信的物理网络。

9)Channel:消息通道,用于连接生产者和消费者的逻辑结构。在客户端的每个连接里可以建立多个Channel,每个Channel代表一个会话,通过Channel可以隔离同一个连接中的不同交互内容。

10)Producer: 消息的生产者,制造消息并发送消息的程序

11)Consumer:消息消费者,接收并处理消息的程序


5. 消息队列的核心概念


消息队列中的核心概念包括以下几个:生产者、队列、消费者、消息 。

生产者生产消息并投递到队列中,

消费者可以从队列中获取消息并消费,

消息指的是各个服务之间要传递的数据。

6. 一个简单的生产者和消费者示例


本示例包含一个消息生产者,队列(RabbitMQ),消息消费者。消息生产者生产消息,并将消费发送到队列服务器,消息消费者监听并消费队列中的消息。

备注:本示例通过在原有的springcloud示例项目中加入新模块来演示RabbitMQ的基本使用。

6.1 消息发送者模块


6.1.1 引入必要的依赖


<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

6.1.2 项目配置文件


 server.port=8080
## rabbitmq config
spring.rabbitmq.host=192.168.199.144
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=my_vhost

6.1.3 启动类


/*** @author Administrator* @create 2020-02-1518:53*/
@SpringBootApplication
public class SenderApp {public static void main(String[] args) {SpringApplication.run(SenderApp.class, args);}}

6.1.4 RabbitMQ配置类


/*** @author Administrator* @create 2020-02-1519:04*/
@Configuration
@Slf4j
public class RabbitMQConfig {@Beanpublic Queue helloQueue() {return new Queue("hello");}}

6.1.5 编写服务,用于向队列中存放 消息


package com.zking.rabbit.rabbitmqdemo.controller;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;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;@RestController
public class ProviderController {@Autowired
private AmqpTemplate amqpTemplate;@RequestMapping("/send")
public String send(){amqpTemplate.convertAndSend("hello","这是 生产向队列hello投递消息 时间:"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));return "success";}
}

 刷星一次页面 数量随着而变化

 6.1.6 编写消费者,消费消息


package com.zking.rabbit.rabbitmqdemo.component;import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RabbitListener(queues = {"hello"})
public class Consumer {@RabbitHandlerpublic void handler(String msg){System.out.println("消费者接收 -- "+ msg);}
}

重启查看效果

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

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

相关文章

【探索 Kubernetes|作业管理篇 系列 14】StatefulSet 存储状态

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们讲解了 StatefulSet 的拓扑状态&#xff1b;我们发现&#xff0c;它的拓扑状态&#xff0c;就是顺序启动/删除、Pod 名称编号命名、将 Pod 名称设为 Hostname 名称、通过 Service 无头服务的 DNS 记录访问。 …

uniapp打包app后,微信授权登录

官方文档&#xff1a;App端OAuth(登录鉴权)模块 关键配置项说明&#xff1a; 1、appid 微信开放平台申请应用的AppID值。 2、appSecret&#xff08;HBuilderX3.4.18 不再提供此参数的可视化配置&#xff09; 微信开放平台申请应用的AppSecret值。 找到manifest.json文件&am…

网络安全 | 密码基础知识介绍

概述 密码介绍 安全问题 保密性&#xff1a;对发送的消息进行获取完整性&#xff1a;对发送的消息进行篡改身份伪造&#xff1a;对发送的主体身份进行篡改&#xff0c;a发的消息&#xff0c;篡改为b发的行为抵赖&#xff1a;对发送的消息进行否认&#xff0c;丧失行为的可追…

SQL 优化(三):使用覆盖索引

摘要 今天跟大家分享一个比较常见的 SQL 优化手段——使用覆盖索引。需要特殊说明的是&#xff0c;MySQL 支持多种存储引擎&#xff0c;对索引的支持也不同&#xff0c;这里我们只关注 InnoDB 引擎的 BTree 索引 InnoDB 的索引实现 在介绍覆盖索引之前&#xff0c;我们先简单…

【MySQL】MVCC是如何解决快照读下的幻读问题的

文章目录 LBCC当前读 MVCC隐藏列undo logRead View 总结 我们从上文中了解到InnoDB默认的事务隔离级别是repeatable read&#xff08;后文中用简称RR&#xff09;&#xff0c;它为了解决该隔离级别下的幻读的并发问题&#xff0c;提出了LBCC和MVCC两种方案。其中LBCC解决的是当…

SAP 区分工单BOM物料是手工删除 还是 Teco后自动关闭需求

SAP 区分工单BOM物料是手工删除 还是 Teco后自动关闭需求 首先 resb表删除标识XLOEK 都为 ‘X’&#xff0c;无法通过其它字段直接区分 1先从前台界面区分 手工删除的&#xff0c;组件界面颜色正常&#xff0c;状态为-REL 删除 Teco自动关闭需求的&#xff0c;颜色不一样&am…

MAC电脑使用技巧

Mac打开根目录 /user下的文件 mac 上怎么显示隐藏的/user文件夹&#xff0c;有两种方法可选~~~ 1&#xff0c;Finder界面是&#xff0c;最上方&#xff0c;通过“前往”进入“电脑”或文件夹 先进入到需要显示隐藏文件的文件夹下 接着按Command苹果键F,在窗格上会显示搜索栏 然…

OpenCV(图像处理)-基于Python-轮廓查找

轮廓查找 1. 轮廓2.轮廓查找2.1 findContours()2.2 drawContours()2.3 contourArea()和arcLength()2.4 多边形逼近与凸包approxPolyDP()convexHull()2.5 外接矩形minAreaRect()boundingRect() 1. 轮廓 一个图像中具有相同颜色或强度&#xff08;灰度图&#xff09;的连续点所组…

springboot配置https

本身不是一个挺难的东西&#xff0c;但是也踩了很多坑&#xff0c;终于是可以了&#xff0c;在此记录一下。 就两步生成证书和springboot配置。 目录 1.生成证书2.springboot配置3.启动验证注意事项 1.生成证书 这里采用java自带的keytool进行生成。 注意jdk环境&#xff0c;…

最新,2023年6月CDGP设计及论述题解析

2023年6月CDGP设计及论述题解析 &#xff08;加gzh“大数据食铁兽”&#xff0c;回复“2023cdgp”获取完整版&#xff09; 酒店会员建模 结合国内外数据安全法律法规&#xff0c;谈谈境外传输数据安全管理体系建设 国内&#xff1a;《数据安全法》、《网络安全法》、2022年9月…

基于深度学习的高精度打电话检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度打电话检测识别系统可用于日常生活中或野外来检测与定位打电话目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的打电话目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

Docker 中的 .NET 异常了怎么抓 Dump

一&#xff1a;背景 1. 讲故事 有很多朋友跟我说&#xff0c;在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高&#xff0c;内存暴涨 等各种Dump&#xff0c;为什么你没有写在 Docker 中如何抓的相关文章呢&#xff1f;瞧不上吗&#xff1f; 哈哈&#xff0c;在DUMP的分…