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/sh

sudo 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: 5672
    virtual-host: 虚拟机默认为/
    listener:
      simple:
        acknowledge-mode: manual
        concurrency: 1
        max-concurrency: 2
        prefetch: 3
      type: 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 {
    /**
     * 创建队列
     * **/
    @Bean
    public 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 {
    /**
     * 生产者
     */
    @Autowired
    RabbitTemplate 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: manual
        concurrency: 1
        max-concurrency: 2
        prefetch: 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可以绑定多个消费者。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Cadence】sprobe的使用

实验目的&#xff1a;通过sprobe测试电路中某个节点的阻抗 这里通过sprobe测试输入阻抗&#xff0c;可以通过port来验证 设置如下&#xff1a; 说明&#xff1a;Z1代表sprobe往left看&#xff0c;Z2代表sprobe往right看 结果如下&#xff1a; 可以看到ZM1I0.Z2 顺便给出了I…

谷歌浏览器打不开设置

场景&#xff1a;谷歌浏览器页面空白&#xff0c;并且点击设置没有反应 忘记我是在哪找的解决方案了&#xff0c;先留个记号在这&#xff0c;方便下次查阅

0x53 区间DP

0x53 区间DP 到目前为止&#xff0c;我们介绍的线性DP一般从初态开始&#xff0c;沿着阶段的扩张向某个方向递推&#xff0c;直至计算出目标状态。区间DP也属于线性DP中的一种&#xff0c;它以“区间长度”作为DP的“阶段”&#xff0c;使用两个坐标&#xff08;区间的左右端点…

MongoDB查找命令find,让数据返回称心如意

业务系统接入数据库后&#xff0c;每天都有大量的数据写入数据库。面对逐日增加的数据&#xff0c;开发人员或数据分析人员&#xff0c;该如何读取数据&#xff0c;怎样设置条件&#xff0c;从数据库中查询数据&#xff1f; 本文基于mongodb的官方文档&#xff0c;整理出find命…

计算机组成原理-程序查询方式(流程图 演示过程 例题 定时查询 独占查询)

文章目录 总览IO方式简介程序查询方式程序查询方式流程图程序查询方式-例题小结 总览 IO方式简介 每次输一个字&#xff0c;就认为状态完成&#xff0c;CPU就会取走数据寄存器的内容 程序查询方式 此时模拟打印三个字符 假设此时三个字符在主存&#xff0c;CPU先从主存读一…

避免重复扣款:分布式支付系统的幂等性原理与实践

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;6&#xff09;篇。 本文主要讲清楚什么是幂等性原理&#xff0c;在支付系统中的重要应用&#xff0c;业务幂等、全部幂等这些不同的幂等方案选型带来的收益和复杂度权衡&#xff0c;幂等击穿场景及可能的严重…

期末查分系统(c,链表实现)

主要功能&#xff1a; 分为三个身份: 学生:可以通过学号查询个人分数 老师&#xff1a;可以看所有学生成绩&#xff0c;单科排名&#xff08;正序&#xff0c;倒序&#xff09;&#xff0c;统计绩点&#xff0c;查看绩点排名前百分之n的学生 管理员端&#xff1a;可以创建链…

揭秘区块链的奥秘:链上智能如何诊断加密生态系统的健康状况

作者&#xff1a;shellyfootprint.network 数据源&#xff1a;Wallet Profile 在加密市场中&#xff0c;波动是家常便饭。就拿 2022 年来说&#xff0c;像 Terra、Celsius 和 FTX 这样的主要项目相继崩盘&#xff0c;搞得市场一片狼藉。这些情况往往让人措手不及&#xff0c;直…

openGauss学习笔记-192 openGauss 数据库运维-常见故障定位案例-XFS文件系统问题

文章目录 openGauss学习笔记-192 openGauss 数据库运维-常见故障定位案例-XFS文件系统问题192.1 在XFS文件系统中&#xff0c;使用du命令查询数据文件大小大于文件实际大小192.1.1 问题现象192.1.2 原因分析192.1.3 处理办法 192.2 在XFS文件系统中&#xff0c;出现文件损坏192…

工业智能网关如何保障数据通信安全

工业智能网关是组成工业物联网的重要设备&#xff0c;不仅可以起到数据交换、通信、边缘计算的功能&#xff0c;还可以发挥数据安全保障功能&#xff0c;保障工业物联网稳定、可持续。本篇就为大家简单介绍一下工业智能网关增强和确保数据通信安全的几种措施&#xff1a; 1、软…

nuxt pm2配置及使用

pm2简介 pm2是一个进程管理工具,可以用它来管理node进程&#xff0c;并查看node进程的状态&#xff0c;当然也支持性能监控&#xff0c;进程守护&#xff0c;负载均衡等功能&#xff0c;在前端和nodejs的世界中用的很多 pm2安装 安装pm2: $ npm install -g pm2查看pm2的安装…

232转Profinet实现协议互转的配置步骤

通常说的RS232是一种串口通信&#xff0c;通过发送和接收的电压变化来传递信息&#xff0c;是点对点通信&#xff0c;通信双方直接连接&#xff0c;通信速率较低。Profinet是一种以太网协议通信&#xff0c;具有传输速度快&#xff0c;支持多个设备实时应用&#xff0c;而且有更…

链表--141.环形链表/easy C级理解

141.环形链表 1、题目2、题目分析3、解题步骤4、复杂度最优解代码示例5、抽象与扩展 1、题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链…

如何保护linux服务器远程使用的安全

服务器安全是一个非常敏感的问题&#xff0c;因服务器远程入侵导致数据丢失的安全问题频频出现&#xff0c;一旦服务器入侵就会对个人和企业造成巨大的损失。因此&#xff0c;在日常使用服务器的时候&#xff0c;我们需要采取一些安全措施来保障服务器的安全性。 目前服务器系…

基于6个IGBT的全桥电路simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 三相逆变器全桥电路原理 4.2 全桥电路应用领域 5.完整工程文件 1.课题概述 基于6个IGBT的全桥电路simulink建模与仿真. 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a 02_018m …

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…

STM32-05-STM32_SYSTEM文件夹

文章目录 STM32 SYSTEM文件夹介绍1. delay文件夹2. sys文件夹 STM32 SYSTEM文件夹介绍 1. delay文件夹 delay文件夹中的文件delay.c和delay.h用来实现系统的延时功能&#xff0c;其包括7个函数&#xff1a; //仅在操作系统的支持下使用 void delay_osschedlock(void); void d…

2024年Google Ads新手指南——广告运作与类型、工具

谷歌广告投放是出海企业的必备运营动作&#xff0c;但你需要先了解他的运作逻辑、广告类型、投放必备的工具类型&#xff0c;之后可以为你的投放的高速转化做好万全准备&#xff0c;毕竟每一分钱都要花在刀刃上&#xff01;废话不多说&#xff0c;下面开始为新手准备了基础指南…

【数据库】MySQL锁

一、锁的基本概念 1、锁的定义 锁是协调多个进程或线程并发访问数据库资源的一种机制。 MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性。但加锁是消耗资源的&#xff0c;锁的各种操作&#xff0c;包括获得锁、检测锁是否已解除、…

dubbo的springboot集成

1.什么是dubbo&#xff1f; Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo …