RabbitMQ安装和快速入门

文章目录

  • 1. RabbitMQ
  • 2. 安装RabbitMQ
    • 2.1 创建shell文件
    • 2.2 编写shell文件
    • 2.3 检查rabbitmq状态
    • 2.4 设置开机自启动
    • 2.5 启动插件
    • 2.6 开放端口号
    • 2.7 创建用户
    • 2.8 登入管理页面
  • 3. SpringBoot中集成RabbitMQ
    • 3.1 依赖安装
    • 3.2 SpringBoot配置
    • 3.3 RabbitMQ的配置类
    • 3.4 定义消费者和生产者
    • 3.5 确认的三种方式
  • 4. RabbitMQ详解
    • 4.1 RabbitMQ的监听器机制
      • 4.1.1 Simple模式
      • 4.1.2 Direct模式
    • 4.2 Channel和Connection
    • 4.3 Exchange和Queue
      • 4.3.1 Exchange的作用
      • 4.3.2 Routing Key
      • 4.3.3 Queue的作用

1. RabbitMQ

RabbitMQ是一个消息队列,用于异步处理事务。所谓的消息队列本质上就是生产者-消费者模式,生产者产生消息,将消息压入消息队列中,消费者阻塞式读取消息队列,读取到数据后进行处理。消费者和生产者是两个独立的线程,通过将生产者和消费者分离,实现异步操作,提高高并发的性能。RabbitMQ作为一个专门用于实现消息队列的中间件相比于Redis有更丰富的功能。

2. 安装RabbitMQ

官网下载:https://www.rabbitmq.com/download.html
在Ubuntu22.04上安装RabbitMQ,官方提供了shell文件,直接运行shell文件就可以一步到位安装完毕。
注意:最新版的RabbitMQ是没有config文件的,如果想要进行RabbitMQ的配置需要登入Web管理页面。

2.1 创建shell文件

touch rabbitmq.sh

2.2 编写shell文件

以下是官方提供的Ubuntu22.0.4的安装脚本,如果是其他版本请参考官方教程将jammy改为对应的版本号。jammy是Ubuntu 22.0.4的代号,不同版本的系统有不同的代号,问chatgpt就知道了。

#!/bin/shsudo apt-get install curl gnupg apt-transport-https -y## Team RabbitMQ's main signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
## Community mirror of Cloudsmith: modern Erlang repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
## Community mirror of Cloudsmith: RabbitMQ repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null## Add apt repositories maintained by Team RabbitMQ
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main# another mirror for redundancy
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy main## Provides RabbitMQ
##
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main# another mirror for redundancy
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy main
EOF## Update package indices
sudo apt-get update -y## Install Erlang packages
sudo apt-get install -y erlang-base \erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \erlang-runtime-tools erlang-snmp erlang-ssl \erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing

2.3 检查rabbitmq状态

systemctl status rabbitmq-server

2.4 设置开机自启动

systemctl enable rabbitmq-server

2.5 启动插件

sudo rabbitmq-plugins enable rabbitmq_management
systemctl restart rabbitmq-server

2.6 开放端口号

udo firewall-cmd --add-port=5672/tcp --permanent
udo firewall-cmd --add-port=15672/tcp --permanent
firewall-cmd --list-ports 

2.7 创建用户

默认用户只能本地访问,如果想要远程访问必须新增用户

sudo rabbitmqctl add_user your_username your_password
sudo rabbitmqctl set_user_tags your_username administrator
sudo rabbitmqctl set_permissions -p / your_username ".*" ".*" ".*"

2.8 登入管理页面

管理页面的网址为:IP地址:15672
在这里插入图片描述
管理页面中的功能非常的多,建议用到时再按需学习

3. SpringBoot中集成RabbitMQ

3.1 依赖安装

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>3.1.5</version>
</dependency>

3.2 SpringBoot配置

spring:rabbitmq:host: 主机地址username: rabbitmq用户名password: 密码port: 5672virtual-host: 虚拟机默认为/listener:simple:acknowledge-mode: manualconcurrency: 1max-concurrency: 2prefetch: 3type: simple

3.3 RabbitMQ的配置类

package com.hmdp.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {/*** 创建队列* **/@Beanpublic Queue hello(){return new Queue("hello",true,false,false);}
}

3.4 定义消费者和生产者

package com.hmdp.demo;import com.hmdp.dto.Result;
import com.hmdp.entity.User;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;@RestController
@RequestMapping("/demo/rabbit")
public class RabbitDemoController {/*** 生产者*/@AutowiredRabbitTemplate rabbitTemplate;@PostMapping("/send")public void send(){String msg="Hello World";// 第一个参数:交换机名字 第二个参数:routeKey 第三个参数:消息rabbitTemplate.convertAndSend("hello",msg);System.out.println("生产者发送成功");}/*** 消费者*/@RabbitListener(queues = {"hello"})public void receive(String msg, Message message, Channel channel) throws IOException, InterruptedException {System.out.println("消费者收到消息:"+msg);System.out.println(message);channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);Thread.sleep(1000);System.out.println("******消费者"+message.getMessageProperties().getDeliveryTag()+"读取完毕,用时3s******");}
}

3.5 确认的三种方式

        /*** 【1 确认】* deliveryTag:消息的标识符* multiple:*     false:仅确认当前消息*     true:确认所有消息*/channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);/***  【2 拒绝】*  第一个参数是消息的唯一ID*  第二个参数表示是否批量处理*  第三个参数表示是否将消息重发回队列*///channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);/*** 【3 拒绝】* 第一个参数deliveryTag表示消息ID* 第二个参数为true表示是否重新入列,如果是true则重新丢回队列里等待再次消费,否则数据只是被消费,不会丢回队列里*///channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);

4. RabbitMQ详解

在这里插入图片描述

4.1 RabbitMQ的监听器机制

RabbitMQ通过@RabbitMQListener注解设置消费者者监听器,监听器有两种,默认情况下使用simple类型的监听器进行单线程的消费监听,即一个消费者对应一个消息队列,一个消费者就是一个线程。在高并发的情况下如果只有一个消费者,可能会造成消息堆积的现象,因此我们可以通过设置多个消费者读取同一个消息队列,从而提高系统的并发性。
在springboot中,可以通过设置

    listener:simple:acknowledge-mode: manualconcurrency: 1max-concurrency: 2prefetch: 3

来指定最大和最小的并发消费者数量。其中``用于指定每个消费者最多缓存多少个unack的消息,通过该参数能够避免本地消费者无限制的缓存消息,从而导致内存爆炸。通过对消费者进行限流,达到削峰填谷的作用。

4.1.1 Simple模式

一个消费者对应一条线程
在这里插入图片描述

4.1.2 Direct模式

多个消费者公用一个线程池
在这里插入图片描述

4.2 Channel和Connection

在这里插入图片描述

一个TCP 被多个消费者线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。也就是rabbitMq采用一个TCP连接处理多个消费者的多线程请求,实际上就是多路复用。通过设置channel可以防止频繁的建立TCP连接。

4.3 Exchange和Queue

4.3.1 Exchange的作用

交换机(Exchange)是RabbitMQ中最重要的部分,交换机与多个队列绑定,通过设置相应的Routing Key(路由键),将生产者产生的消息分发到不同的Queue中。

4.3.2 Routing Key

交换机转发消息的转发规则。

4.3.3 Queue的作用

缓存队列,用于存储生产者产生的消息,一个Queue可以绑定多个消费者。

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

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

相关文章

Redis-集群

主从哨兵集群分布部署 2、哨兵模式 除了redisl master、redis slave&#xff0c;我们有另外的一个节点&#xff0c;叫redis Sentinel啊。redis Sentinel会去同时连接master和slave啊。这个sentinel&#xff0c;它是同时和我们对应的master和slave&#xff0c;保持了一个心跳的…

jmeter--2.常用组件以及作用域

目录 1.常用的组件以及执行顺序 2.常用的组件作用 2.1 测试计划&#xff1a;jmeter启动&#xff0c;其它组件的容器 2.2 线程组&#xff08;测试片段&#xff09;&#xff1a;代表一定虚拟用户数&#xff0c;测试片段代表模块 2.3 配置元件&#xff1a;配置信息 2.4 前置处…

设计一个简易版的数据库路由

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

如何解决TCP拥塞问题?

目录 流量控制 流量整形和限速 拥塞感知和路由优化 负载均衡 网络优化 流量控制 加强网络质量管理&#xff0c;例如提高宽带、加速网络、限制宽带占用、 实施流量控制机制&#xff0c;如拥塞控制算法&#xff0c;通过动态调整数据包发送速率来避免网络拥塞。 使用拥塞避…

DETR tensorRT 的 C++ 部署

DETR tensorRT 的 C 部署 本篇说说DETR tensorRT 的 C 部署。 【完整代码、模型、测试图片】 1 导出 onnx 模型&#xff08;建议先看&#xff09; 方法1&#xff1a;导出DETR onnx并修改模型输出Gather层&#xff0c;解决tesorrt 推理输出结果全为0问题&#xff0c;参考【D…

数据类型、数据类型转换(Java)

一、数据类型的分类 1. byte&#xff1a;1字节&#xff0c;-128~127 2. short&#xff1a;2字节&#xff0c;-32768~32767 3. int&#xff1a;4字节 默认整型 4. long&#xff1a;8字节 注意&#xff1a;随便写一个整型字面量会默认是整型的&#xff0c;所以我们在写一个…

加速 Android Studio 依赖项下载

在某些网络环境中&#xff0c;访问互联网可能受到限制&#xff0c;在Android Studio中&#xff0c;项目构建时可能需要下载依赖项&#xff0c;如果网络受到限制&#xff0c;就无法下载或下载速度非常慢只有十几 kb/s &#xff0c;设置可以帮助解决下载问题。 进入设置页面找到…

RTC wake sotp

static void RTC_Config(void) { RTC_InitTypeDef RTC_InitStructure; RTC_TimeTypeDef RTC_TimeStructure; uint32_t LSIFreq 0; RCC_BackupResetCmd(ENABLE);RCC_BackupResetCmd(DISABLE);//增加避免 复位脚引起初始化不通过&#xff01; /* Enab…

每日算法打卡:机器人跳跃 day 11

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例1&#xff1a;输出样例1&#xff1a;输入样例2&#xff1a;输出样例2&#xff1a;输入样例3&#xff1a;输出样例3&#xff1a; 题目分析示例代码 原题链接 730. 机器人跳跃问题 题目难度&#xff1a;中等 题目来…

【2024.1.12】C++STL容器常用方法

Vector 1.构造函数 #include <vector> //直接通过数组创建一个vector vector<int> vecA {1, 2, 3, 4};//复制迭代器区间内的元素到vector中 vector<int> vecB(vecA.begin(), vecA.end());//复制另一个数组的元素到vector中 int Array[4] {1, 2, 3, 4}; v…

Pandas实战100例 | 案例 2: 数据探索 - 查看和理解数据

案例 2: 数据探索 - 查看和理解数据 知识点讲解 在数据分析的早期阶段&#xff0c;对数据进行初步的探索是非常重要的。这包括查看数据的基本信息、统计摘要、以及数据的形状。 示例代码 查看数据的基本信息 # 显示 DataFrame 的基本信息&#xff0c;包括列名、非空值数量…

RK3568驱动指南|第十一篇 pinctrl 子系统-第126章 通过pinctrl状态设置引脚复用实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

电影《艾里甫与赛乃姆》简介

电影《艾里甫与赛乃姆》由天山电影制片厂于1981年摄制&#xff0c;该片由傅杰执导&#xff0c;由买买提祖农司马依、布维古丽、阿布里米提沙迪克、努力曼阿不力孜、买买提依不拉音江、阿不都热合曼艾力等主演。 该片改编自维吾尔族民间爱情叙事长诗《艾里甫与赛乃姆》&#xf…

postgre数据库清除表数据,保留表结构,并且自增列重新从1自增

1.mysql mysql中如果需要清空表&#xff0c;只需要 TRUNCATE table_name;即可&#xff0c;如果有自增的 id 字段&#xff0c;也会还原回 1 2. postgresql 与 mysql 稍有不同&#xff0c;postgresql 的自增字段 是通过 序列 sequence来实现的 所以在清空表的时候&#xff0c…

如何正确使用高速探头前端--probe head

目前市面上的高速有源探头种类丰富&#xff0c;使用灵活&#xff0c;如下图所示&#xff0c;结构多为放大器焊接前端的组合&#xff0c;以E2677B探头前端为例&#xff0c;其焊接前端电阻有三种选择&#xff0c;91ohm时可实现全带宽使用&#xff08;12GHz&#xff09;&#xff0…

【嵌入式——C语言】共用体

【嵌入式——C语言】共用体 定义&#xff1a;共用体和结构体类似&#xff0c;也是一种构造类型的数据结构&#xff0c;在进行某些算法时&#xff0c;需要使用几种不同类型的变量存到同一段内存单元中&#xff0c;几个变量所使用空间相互重叠&#xff0c;这几个不同的变量共同占…

nginx相关-nginx启动、nginx关闭、nginx地址重定向

笔记贴 记录下nginx相关的知识点 1.启动 注意&#xff1a;路径不要用中文名 否则启动不了 打开conf里面nginx.conf文件修改端口等一些配置项 在nginx.exe对应的文件夹cmd&#xff0c;然后输入nginx.exe执行 浏览器打开配置的端口就能浏览了 比如localhost:8083 2.关闭 windo…

飞天使-k8s知识点10-kubernetes资源对象3-controller

文章目录 pod探针 控制器 pod 概述&#xff1a; 1. pod是k8s中的最小单元 2. 一个pod中可以运行一个容器&#xff0c;也可以运行多个容器 3. 运行多个容器的话&#xff0c;这些容器是一起被调度的 4. Pod的生命周期是短暂的&#xff0c;不会自愈&#xff0c;是用完就销毁的实体…

互联网 HR 眼中的好简历是什么样子的?

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

Redis 分布式锁有什么缺陷?

Redis 分布式锁有什么缺陷&#xff1f; 虽然 Redis 分布式锁是一种常见的实践&#xff0c;但它也存在一些潜在的缺陷和问题。下面是一些可能的缺陷&#xff0c;以及在使用 Redis 分布式锁时应该考虑的因素&#xff1a; 时钟漂移问题&#xff1a; 如果多个 Redis 节点的系统时间…