Rabbit MQ的基本使用

news2025/1/8 4:26:03

目录

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

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

3. RabbitMQ安装

4. RabbitMQ中的主要概念

5. 消息队列的核心概念

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

6.1 消息发送者模块


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 消息发送者模块

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>

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

3)启动类

/**
 * @author Administrator
 * @create 2020-02-1518:53
 */
@SpringBootApplication
public class SenderApp {

    public static void main(String[] args) {
        SpringApplication.run(SenderApp.class, args);
    }

}

4) RabbitMQ配置类

/**
 * @author Administrator
 * @create 2020-02-1519:04
 */
@Configuration
@Slf4j
public class RabbitMQConfig {

    @Bean
    public Queue helloQueue() {
        return new Queue("hello");
    }

}

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.编写消费者,消费消息

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 {
    @RabbitHandler
    public void handler(String msg){
        System.out.println("消费者接收 -- "+ msg);
    }
}

 重启查看效果

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

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

相关文章

Jenkins配合git构建持续构建流程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 理解CI CI(Continuous Integration)翻译成持续集成&#xff0c;是指在源代码变更后自动检测、检出、构建、自动化测试到发布的过程。常见的开源CI工具有J…

Go类型与进制

iota:总是从0开始&#xff0c;递增为1的整数 一、进制 二进制0b1001000 0100 1000 八进制 0o110 01 001 000》 1 * 8^21 * 8^10 * 8^072 十六进制0x48 0100 1000 十进制转二进制 除以基数2&#xff0c;直到商为0为止&#xff0c;反向提取余数。 转为十六进制 除以基…

机器视觉(六):频域图像增强

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

【云原生】Grafana Alerting 告警模块介绍与实战操作

文章目录一、概述二、Grafana Alerting 模块介绍三、配置图表四、告警告警规则五、配置告警通道&#xff08;Contact points&#xff09;1&#xff09;Email1、配置smtp&#xff08;grafana.ini&#xff09;2、配置消息模板3、配置告警通道2&#xff09;WebHook1、编写webhook …

【问题记录与解决】TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

目录 一、报错内容二、尝试再运行(最终解决)一、报错内容 先来看报错截图: 再往上看看: 程序其实是正确执行了一部分的,可以看出首次运行时,是需要下载一些东西的。 二、尝试再运行(最终解决) 所测试的代码如下: # 昵 称:XieXu # 时 间: 2022/12/24/0024 18:44 fr…

刷机-把机顶盒当服务器使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、为啥要刷机顶盒什么&#xff1f;二、使用步骤1.拆机2.准备下载工具3.准备烧录软件和固件4.烧录5.如何使用总结前言 今天给大家分享一篇关于如何把机顶盒刷机…

国考省考行测:接语选择题,接下来最可能讲,上文可能谈,引言可能谈,有过渡句,看新主体,无过渡句,看主旨意思

国考省考行测&#xff1a;接语选择题&#xff0c;接下来最可能讲&#xff0c;上文可能谈&#xff0c;引言可能谈&#xff0c;有过渡句&#xff0c;看新主体&#xff0c;无过渡句&#xff0c;看主旨意思 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能…

vue3 +ts 第二篇

1.watch watchEffect 监听汇总 watchwatchEffect默认情况是惰性的&#xff0c;也就是说仅在侦听的源数据变更时才执行回调。不需要手动传入依赖更明确哪些状态的改变会触发侦听器重新运行副作用&#xff1b;会先执行一次用来自动收集依赖获取到侦听状态变化前后的值。无法获取…

【概念理解】内存对齐问题详述

内存之对齐&#xff0c;一文即可知 文章目录内存对齐1.概述2.如何进行内存对齐3.位域对齐大端存储与小端存储1.基本概念参考博客&#x1f60a;点此到文末惊喜↩︎ 内存对齐 1.概述 定义&#xff08;什么是内存对齐&#xff09; 编译器为程序中的每个数据单元安排在适当的位置…

【深入浅出Spring原理及实战】「开发实战系列」OAuth2的技术体系架构和开发概览

背景介绍 主要实现 OAuth2的三种授权模式&#xff1a;密码模式、客户端模式和授权码模式&#xff0c;包括展示授权服务器、资源服务器、客户端等几种角色的交互&#xff0c;以及JWT的整合。并且每个实例都提供两个代码版本&#xff1a;一个是基于旧的 Spring Security OAuth2 …

基于java学生成绩管理系统

开发工具eclipse,jdk1.8 技术&#xff1a;java swing 数据库&#xff1a;mysql5.7 学生选课系统功能&#xff1a;管理员、教师、学生三个角色 一、管理员功能&#xff1a; 1.登录、修改密码、退出系统 2.学生管理&#xff1a;添加、修改、删除、查询 3.班级管理&#x…

python文件夹拷贝思路

最近在做项目中&#xff0c;要使用python&#xff0c;对文件拷贝有了一些了解&#xff0c;这里将自己理解的文件拷贝整理出来。 如下所示&#xff0c;文件拷贝思路&#xff1a; 文件拷贝&#xff0c;从io上来说就是读文件&#xff0c;写文件到另一个指定的地方。 拷贝&#xff…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《1》

原论文&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 开源代码&#xff1a;https://github.com/ijkguo/mx-rcnn Parallel Faster R-CNN implementation with MXNet&#xff0c;使用MXNet实现快速并行的区域提议的卷积神经网络…

[oeasy]python0032_杀死进程_进程后台运行不输出_nohup_ps_显示进程

查看进程 回忆上次内容 上次先ctrl z 挂起进程 然后运行 bg程序继续跑起来而且不断输出到标准输出流甚至连ctrl c 都无法结束进程了这可怎么办呢&#xff1f;只能新开一个终端想办法 查询进程 搜索 debian进程查询找到具体方法 进程 具体方法动手试试 新开一个终端 运行ps…

新冠阳性的第五篇博客,宝塔面板如何快速部署一个SpringBoot项目

宝塔面板如何快速部署一个SpringBoot项目1.删除旧版本的Java2.安装Java3.配置Java环境变量4.宝塔快速部署1.删除旧版本的Java 删除旧版本的Java&#xff0c;防止对我们的服务产生影响&#xff01; 如果你的服务器上没有下载过Java&#xff0c;则跳过此步骤&#xff01; 查找…

【K3s】第1篇 K3s入门级介绍及架构详解

目录 1、什么是 K3s? 2、为什么叫 K3s? 3、适用场景 4、架构详解 单节点架构 高可用架构 K3s高可用架构&#xff1a; 固定 agent 节点的注册地址 注册 Agent 节点 1、什么是 K3s? K3s 是一个轻量级的 Kubernetes 发行版&#xff0c;它针对边缘计算、物联网等场景进…

SpringBoot图文详解 | 系统性学习 | 无知的我费曼笔记

无知的我复盘&#xff0c;顺便上传笔记。 对比Spring&#xff0c;SpringBoot 其实就是简化了固定的开发步骤。如坐标、Web3.0配置类、配置类 文章目录1 SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.…

【问题记录与解决】OSError: [WinError 127] 找不到指定的程序。

目录 一、报错记录二、尝试解决(已解决)2.1 先 卸载掉 几个与torch相关的模块2.2 重新下载几个模块,并分别安装一、报错记录 首先来看报错的截图: 报错的具体代码,可以看这里,和这里使用的一样的: 【Pytorch_Geometric】(GCN)基本使用:数据集与邻接矩阵格式,图形(…

河道水尺水位监测系统 基于opencv

河道水尺水位监测系统基于pythonopencv对现场画面中水位进行实时监测&#xff0c;当监测到画面中水位异常变化时&#xff0c;立即抓拍存档同步回传图片给后台。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流行&#xff0c;主要是因为它的简…

用Python写个实用工具 - TheFuck(命令纠正工具)

前言 哈喽啊&#xff0c;我亲爱的铁铁们&#xff0c;I am back &#xff01; 别管&#xff0c;我也是阳过的人了&#xff0c;这么久都没有更新&#xff0c;今天就带来个小玩意吧 我们在学习python的时候&#xff0c;有个小工具&#xff0c;是可以纠正我们写错的命令 The Fu…