RabbitMQ 安装和使用Demo

news2024/11/24 13:59:47

同步是阻塞

MQ:消息队列,基础数据结构中"先进先出"的数据结构。用来解决应用解耦,异步消息,流量消峰等问题。
RabbitMQ、RocketMQ、Kafka
RocketMQ 是阿里的
应用层开发使用RabbitMQ
大数据开发Kafka

MQ是不是微服务都可以用

RabbitMQ

是什么?
RabbitMQ是实现了高级消息协议(AMQP)的开源消息代理软件,是MQ的产品之一,目前最火的MQ中间件之一。用Erlang语言编写的。
依赖

配置

spring:
  rabbitmq:
    host: 121.36.5.100
    port: 5672
    username: guest
    password: guest

docker安装
执行命令,先查看是否有Docker
docker --version
在这里插入图片描述
如果想要删除:yum -y remove docker-ce

如果没有需要安装:

1.执行命令,实现Docker安装

yum install -y yum-utils

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

yum -y install docker-ce
在这里插入图片描述
在这里插入图片描述
2.验证

docker --version
在这里插入图片描述
3.启动Docker

启动:systemctl start docker

停止:systemctl stop docker

查看状态:systemctl status docker

重启:systemctl restart docker

0.安装
采⽤Docker安装RabbitMQ
0.执⾏命令
docker run -d --name rabbitmq5672 -p 15672:15672 -p 5672:5672 rabbitmq:management
在这里插入图片描述

1.查看正在运行容器
docker ps
在这里插入图片描述
2.进入容器内部
docker exec -it ae2804d96c53 /bin/bash

3.运行rabbitmq
rabbitmq-plugins enable rabbitmq_management

4.浏览器运行:
http://自己的ip:15672/
在这里插入图片描述

依赖jar包

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

实现配置:

spring:
  rabbitmq:
    host: XXXXX
    port: 5672
    username: guest
    password: guest

1.创建队列:
注意导入的包

package com.yd.rabbitmq01.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //配置 类似 beans 标签
public class RabbitMQConfig {

    //创建队列
    @Bean // IOC bean标签
    public Queue createQ1() {
        return new Queue("j2310-yd");
    }
}

在这里插入图片描述
template.convertAndSend(“”,“j2310-yd”,msg);
补充:第一个校验器,第二个队列名

2.发消息

@RestController
public class MqSendController {
    @Resource
    private RabbitTemplate template;

    @GetMapping("send1")
    public String send(String msg) {
        //发送消息
        template.convertAndSend("","j2310-yd",msg);
        return "ok";
    }
}

在这里插入图片描述

在这里插入图片描述

3.消费消息
监听器listener,监听队列中的消息变化

接收消息

@Slf4j
@Component // IOC
public class MsgListener {

    @RabbitListener(queues = "j2310-yd")
    public void hander(String msg) {
        log.info("消费者获取消息{}",msg);
    }
}

二、RubbitMq核心:

*一个单词
#任意一个

2.1消息模式-简单消息

特点:一个队列对应一个消费者,一个消息只能被消费1次
在这里插入图片描述
示例:
1.定义队列
2.发送消息—到—队列中
3.监听消息—从—队列中
代码:
package com.yd.rabbitmq01.config;

@Configuration //配置 类似 beans 标签
public class RabbitMQConfig {
    //简单消息
    @Bean // IOC bean标签
    public Queue createQ2() {
        return new Queue("yd-p2p-1");
    }
}

package com.yd.rabbitmq01.controller;

package com.yd.rabbitmq01.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 12:54:02
 * @description MqSendControllerApi
 */
@RestController
public class MqSendController {
    @Resource
    private RabbitTemplate template;

    //简单消息
    @GetMapping("send2")
    public String send2(String msg) {
        //发送消息
        template.convertAndSend("","yd-p2p-1",msg);
        return "ok";
    }
}

package com.yd.rabbitmq01.listener;

package com.yd.rabbitmq01.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 12:56:32
 * @description MsgListenerApi
 */
@Slf4j
@Component // IOC
public class MsgListener {
    //简单消息
    @RabbitListener(queues = "yd-p2p-1")
    public void hander2(String msg) {
        log.info("普通消息,消费者,获取消息,{}",msg);
    }
}

2.2 消息模式-Work消息

Work消息:一个队列可以有多个消费端,1个消息只能消费1次,多个消费者是按照轮询的形式轮流获取消息
可以解决:消息堆积(发的快,消费的慢)

MQ消息单表可扛1万
发送快,消费慢(要处理业务逻辑),导致消息堆积,队列先进先出,会把老的消息弄丢失。
消息堆积,解决方案:
1.加机器(成本高)
2.想办法优化消费的性能(不好搞定)
3.work消息,多来几个消费者,消费者之间什么关系?
Work消息:一个队列可以有多个消费者,1个消息只能消费1次
可以解决:消息堆积(发得快,消费的慢)

注意:对发送端没有影响。

轮训发送

补充:
1.redis解决存储上限的问题?

2.哨兵是解决什么问题?
哨兵是用来监听主库的,主库掉了,从库中选择一个上位
主从复制,主库没了,从库中选择一个
在这里插入图片描述
示例:
1.声明队列

	//Work消息
    @Bean // IOC bean标签
    public Queue createQ3() {
        return new Queue("yd-work-1");
    }

2.发送消息

//Work消息
    @GetMapping("send3")
    public String send3(String msg) {
        //发送消息 交换器,路由
        template.convertAndSend("","yd-work-1",msg);
        return "ok";
    }

在这里插入图片描述

3.监听消息

//Work消息
    @RabbitListener(queues = "yd-work-1")
    public void hander3(String msg) {
        log.info("work消息,work消费者01,获取消息,{}",msg);
    }
    //Work消息
    @RabbitListener(queues = "yd-work-1")
    public void hander4(String msg) {
        log.info("work消息,work消费者02,获取消息,{}",msg);
    }

2.3-消息模式-发布订阅

发布订阅:就是消息发送到Exchange(交换器),交换器再把消息发送到交换器绑定的队列上(绑定一个发送一个队列,绑定十个发送十个队列),1个消息可以给多个消费者(多个队列中)获取
Exchange:交换器,是RabbitMQ一个组成,可以接受消息。然后根据交换器的类型,选择对应的匹配模式,把匹配的消息转发到对应的队列中。
交换器的类型:

1.fanout:直接转发,不对消息做匹配处理
2.direct路由匹配,发送指定Routingkey(精准)匹配,发送的消息会指定,交换器绑定队列的时候也需要指定RountingKey
3.tipic路由匹配,发送消息指定 RoutingKey(模糊,支持 * #),交换器绑定队列的时候,也需要指定RoutingKey, *一个单词 #任意个单词
4.header:消息头匹配模式,发送消息的时候指定消息的请求消息头,交换器绑定队列的时候,也需要指定对应的请求消息头,any任意一个 all所有

在这里插入图片描述

示例:
1.创建队列
2.创建交换器
3.创建交换器和队列的绑定
4.发送消息
5.监听消息

package com.yd.rabbitmq01.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 消息模式-发布订阅
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 15:22:35
 * @description FanoutConfigApi
 */
@Configuration
public class FanoutConfig {

    //1.创建队列
    @Bean
    public Queue createQfang1() {
        return new Queue("q-fanout-01");
    }

    @Bean
    public Queue createQfang2() {
        return new Queue("q-fanout-02");
    }

    //2.创建交换器
    @Bean
    public FanoutExchange createFe() {
        return new FanoutExchange("ex-fanout-yd");
    }

    //3.实现绑定
    @Bean
    public Binding createBf1(FanoutExchange fe) {
        return BindingBuilder.bind(createQfang1()).to(fe);
    }
    @Bean
    public Binding createBf2(FanoutExchange fe) {
        return BindingBuilder.bind(createQfang2()).to(fe);
    }

}

4.发送消息

package com.yd.rabbitmq01.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 15:31:59
 * @description FanoutControllerApi
 */
@RestController
public class FanoutController {
    @Resource
    private RabbitTemplate template;

    /**
     * 消息模式-发布订阅
     * @param msg
     * @return
     */
    @GetMapping("fanout1")
    public String f1(String msg) {
    	// 第一个交换器,routingKey,msg
        template.convertAndSend("ex-fanout-yd","",msg);
        return "ok";
    }

    @GetMapping("direct1")
    public String d1(String msg, String type) {
        template.convertAndSend("ex-direct-yd",type,msg);
        return "ok";
    }
}

5.监听消息

package com.yd.rabbitmq01.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 12:56:32
 * @description MsgListenerApi
 */
@Slf4j
@Component // IOC
public class MsgListener {
    //消息模式-发布订阅
    @RabbitListener(queues = "q-fanout-01")
    public void hander5(String msg) {
        log.info("fanout消息,01队列,消费者,获取消息01,{}",msg);
    }
    //消息模式-发布订阅
    @RabbitListener(queues = "q-fanout-02")
    public void hander6(String msg) {
        log.info("fanout消息,02队列,消费者,获取消息02,{}",msg);
    }
}

D:所代表的意思是持久化
在这里插入图片描述
补充:
交换器怎么设计的:功能单一原则,方便解耦

交换器,路由
在这里插入图片描述

2.4 消息模式-路由匹配

路由消息:消息被发送到交换器,交换器的类型为direct,可以根据消息的路由关键字进行匹配,转发到匹配的所有的队列
RoutingKey:路由关键字,只支持精确的值
在这里插入图片描述
示例:
1、创建队列
2、创建交换器 direct
3、创建交换器和队列的绑定 指定RK
4、发送消息 指定RK
5、监听消息

1、创建队列

package com.yd.rabbitmq01.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 消息模式,路由匹配
 *
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 19:17:19
 * @description DirectConfigApi
 */
@Configuration
public class DirectConfig {
    // 1.创建队列
    @Bean
    public Queue createQdirect1() {
        return new Queue("q-direct-01");
    }
    @Bean
    public Queue createQdirect2() {
        return new Queue("q-direct-02");
    }
    @Bean
    public Queue createQdirect3() {
        return new Queue("q-direct-03");
    }
    //2.创建交换器
    @Bean
    public DirectExchange createDe() {
        return new DirectExchange("ex-direct-yd");
    }
    //3.实现绑定
    @Bean
    public Binding createBd1(DirectExchange fe){
        return BindingBuilder.bind(createQdirect1()).to(fe).with("error");
    }
    @Bean
    public Binding createBd2(DirectExchange fe){
        return BindingBuilder.bind(createQdirect2()).to(fe).with("info");
    }
    @Bean
    public Binding createBd3(DirectExchange fe){
        return BindingBuilder.bind(createQdirect3()).to(fe).with("info");
    }
}

4、发送消息 指定RK

package com.yd.rabbitmq01.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 15:31:59
 * @description FanoutControllerApi
 */
@RestController
public class FanoutController {
    @Resource
    private RabbitTemplate template;

    /**
     * 消息模式,路由匹配
     * @param msg
     * @param type
     * @return
     */
    @GetMapping("direct1")
    public String d1(String msg, String type) {
        template.convertAndSend("ex-direct-yd",type,msg);
        return "ok";
    }
}

在这里插入图片描述

2.5 消息模式-主题消息

主题消息,就是交换器的类型为Topic,跟路由模式的消息一样,都是通过RoutingKey匹配队列

区别:
主题消息 的RK支持模糊
特殊符号:区分单词是通过 . 区分的
* 一个单词,单词内容任意
# 任意个单词,单词内容任意

在这里插入图片描述
示例:
1.创建队列
2.创建交换器 topic
3.创建交换和队列的绑定 指定RK(支持模糊)
4.发送消息 指定RK
5.监听消息

1.创建队列

package com.yd.rabbitmq01.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 消息模式-主题消息
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 19:58:35
 * @description TopicconfigApi
 */
@Configuration
public class TopicConfig {
    //1.创建队列
    @Bean
    public Queue createQtopic1(){
        return new Queue("q-topic-01");
    }
    @Bean
    public Queue createQtopic2(){
        return new Queue("q-topic-02");
    }
    //2.创建交换器
    @Bean
    public TopicExchange createTe(){
        return new TopicExchange("ex-topic-yd");
    }
    //3.实现绑定
    @Bean
    public Binding createBt1(TopicExchange fe) {
        //*一个单词
        return BindingBuilder.bind(createQtopic1()).to(fe).with("error.*");
    }
    //3.实现绑定
    @Bean
    public Binding createBt2(TopicExchange fe) {
        //# 任意个单词 0-多个
        return BindingBuilder.bind(createQtopic2()).to(fe).with("info.#");
    }
}

4.发送消息 指定RK

package com.yd.rabbitmq01.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 消息模式-主题消息
 *
 * @author MaoXiqi
 * @organization: Lucky
 * @create 2023-10-13 20:05:20
 * @description TopicControllerApi
 */
@RestController
public class TopicController {
    @Resource
    private RabbitTemplate template;

    /**
     * 消息模式-主题消息
     * @param msg
     * @param rk
     * @return
     */
    @GetMapping("topic1")
    public String f1(String msg,String rk) {
        template.convertAndSend("ex-topic-yd",rk,msg);
        return "ok";
    }
}

在这里插入图片描述
发短信可能会延迟,用异步请求,可以使用MQ,
发邮箱

RabbitMQ基于死信实现延迟

RabbitMQ事务

怎么防止消息的成功?开启RabbitMQ手动应答
RabbitMQ手动应答

RabbitMQ如何保证消息的幂等性

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

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

相关文章

【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中&#xff0c;通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中&#xff0c;蚁群算法的基本步骤如下&#xff1a; 1. 初始化: …

【Redis】Redis持久化策略

目录 策略RDBbgsave执行流程RDB效果演示RDB优缺点 AOFAOF缓冲区刷新策略AOF的重写机制AOF重写机制的触发机制AOF重写流程 混合持久化同时存在aof和rdb快照&#xff0c;以谁为主&#xff1f;信号 策略 RDB > Redis DataBase 相当于定期的方式实现持久化AOF > Append Only…

Python网络编程改良版客户端

在《Python中套接字实现客户端和服务端3-3》中提到&#xff0c;客户端可以通过connect()方法连接服务端&#xff0c;而连接成功的前提是服务端在必须客户端连接之前就要等待连接。 1 当客户端连接时&#xff0c;服务端没有打开 如果客户端连接服务端时&#xff0c;服务端并没…

通过商品ID查询淘宝商品详情数据,可以拿到商品标题,商品价格,商品库存,商品销量,商品sku数据等,淘宝API接口

通过商品ID查询淘宝商品详情数据可以参考以下步骤&#xff1a; 进入淘宝网站&#xff0c;搜索需要查询的商品ID&#xff0c;例如&#xff1a;652874751412。复制该商品的ID号。点击获取请求key和secret地址&#xff0c;请求参数为num_iid商品ID&is_promotion1。发送请求&a…

企业立案信息API的优势与应用场景

引言 随着科技的不断进步&#xff0c;创业者和企业家们在创办新企业时愈发依赖数字化工具。其中&#xff0c;企业立案信息API成为了一项重要的资源&#xff0c;它提供了有关企业立案的关键信息&#xff0c;为企业家们提供了许多优势和丰富的应用场景。本文将探讨企业立案信息A…

【API篇】四、物理分区算子API

文章目录 1、 分区算子&#xff1a;随机分区2、分区算子&#xff1a;轮询分区3、分区算子&#xff1a;重缩放分区4、分区算子&#xff1a;广播5、分区算子&#xff1a;全局分区6、自定义分区 重分区&#xff0c;即数据"洗牌"&#xff0c;将数据分配到下游算子的并行子…

【日志与守护进程】

文章目录 1 :peach:日志:peach:1.1 :apple:对日志的基本理解:apple:1.2 :apple:对日志系统代码的基本编写:apple:1.2.1 :lemon:messageLog.hpp:lemon:1.2.2 :lemon:tcpServer:lemon: 1.3 :lemon:验证:lemon: 2 :peach:守护进程:peach:2.1 :apple:进程组与会话:apple:2.2 :apple…

Rabbitmq 的管理配置

1、Rabbitmq管理 1.1、多租户与权限 每一个RabbitMQ 服务器都能创建虚拟的消息服务器&#xff0c;我们称之为虚拟主机(virtual host) ,简称为vhost 。每一个vhost 本质上是一个独立的小型RabbitMQ 服务器&#xff0c;拥有自己独立的队列、交换器及绑定关系等&#xff0c;井且它…

用PHP爬取视频代码示例详细教程

以下是一个使用Symfony Panther和PHP进行爬虫的示例程序&#xff0c;用于爬虫企鹅上的视频。请注意&#xff0c;这个示例需要使用https://www.duoip.cn/get_proxy这段代码获取爬虫IP。 <?php // 引入所需的库 require vendor/autoload.php;use Symfony\Component\Panther\P…

多媒体应用设计师 第7章 多媒体数字压缩编码技术基础

1.多媒体数据压缩技术理论基础及压缩编码方法分类 必要性:大数据量的图像信息会给存储器的存储容量&#xff0c;通信线路的带宽&#xff0c;以及计算机的处理速度增加极大压力。如果没有多媒体编码压缩技术的发展&#xff0c;大容量图像&#xff0c;视频信息的存储和传输就难以…

林旅强 | AI+开源时代 - 开发者与治理者的机遇与挑战

点击以下链接收听本期 “大咖访谈” 播客&#xff0c;与大咖面对面&#xff1a; 大咖访谈链接&#xff1a;EP15&#xff1a;林旅强 | AI开源时代 - 开发者与治理者的机遇与挑战 刘天栋&#xff1a;访谈主持&#xff0c;开源雨林顾问&#xff0c;开源社联合创始人&#xff0c;Ap…

人工智能应该怎么学?

人工智能这个词炙手可热&#xff0c;为了跟上时代的步伐&#xff0c;有许多小伙伴就想学习人工智能&#xff0c;今天来介绍一下人工智能究竟是什么&#xff1f;应该怎么学&#xff1f;怎么入门&#xff1f; 首先来看一下什么是人工智能&#xff1f; 人工智能 人工智能 人工智能…

puppeteer学习笔记

目录 介绍启动方法功能一、爬虫优势如何实现爬虫小demo 功能二、执行脚本百度搜索脚本demo 功能三、获取cookie&#xff08;这个只能是模拟浏览器当前进入网页的cookie不是平时用的下载的的浏览器的cookie&#xff09;功能四、监控网页&#xff0c;进行性能分析 介绍 puppetee…

文旅部发布《旅游电子合同管理与服务规范》,推动旅游企业转型升级

日前&#xff0c;文化和旅游部批准发布了旅游电子合同领域的行业标准《旅游电子合同管理与服务规范》&#xff08;以下简称《标准》&#xff09;&#xff0c;将于2023年12月9日起实施。 《标准》聚焦旅游电子合同的适用范围、基本要素、操作规范、载体要求、安全保密等方面进…

【编译原理】对++*p++操作理解

目录 1. 代码段执行结果 2. *p的结合过程 3. 通过汇编代码判断执行结果 1. 代码段执行结果 对于以下代码&#xff1a; int main() { int i 0;int *p &i; *p ; return i; }输出结果为&#xff1a; ASM generation compiler returned: 0 Execution build compiler re…

隐写术--python隐写

0x00 背景 何为隐写术&#xff1f; 隐写术是一类可以隐藏自己写的一些东西的方法&#xff0c;是一门关于信息隐藏的技巧与科学。指的是采取一些不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容的方法。 可参考 一文让你完全弄懂Stegosaurus - 知乎 本文要…

机械设计中的结构要素、基本要求和准则

机械结构设计的任务是依据设计任务在总体设计构想的基础上&#xff0c;确定的原理方案&#xff0c;绘制出具体的结构图&#xff0c;以实现设计所要求的功能。设计的过程是将抽象的工作原理具体化为某类构件或零部件&#xff0c;包含确定结构件的材料、形状、尺寸、公差、热处理…

机器学习绪论

目录 第1关&#xff1a;什么是机器学习 相关知识 题目答案 第2关&#xff1a;机器学习的常见术语 相关知识 假设空间 归纳偏好 题目答案 第3关&#xff1a;机器学习的主要任务 相关知识 分类 回归 聚类 题目答案 第1关&#xff1a;什么是机器学习 相关知识 相信…