消息队列-RabbitMQ

news2024/11/20 11:43:50

文章目录

  • 1.什么是MQ
    • 1.1 特点
    • 1.2 MQ产品分类
  • 2.RabbitMQ
    • 2.1.RabbitMQ介绍
    • 2.2.使用Docker安装RabbitMQ
  • 3.SpringBoot中使用RabbitMQ
    • 3.1.SpringAMQP
    • 3.2使用步骤

1.什么是MQ

RabbitMQ官方文档

消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消息的容器。用于分布式系统之间进行异步通信

1.1 特点

解耦

在这里插入图片描述

异步

在这里插入图片描述

削峰

在这里插入图片描述

1.2 MQ产品分类

RabbitMQActiveMQRocketMQKafka
公司社区RabbitApacheApache 阿里Apache
开发语言ErlangJavaJavaScala&Java
协议AMQPOpenWire、AUTO、Stomp、MQTT自定义自定义
单机吞吐量万级万级(最差)十万级十万级
消息延迟微妙级毫秒级毫秒级毫秒以内
特性并发能力很强,延时很低老牌产品,文档较多MQ功能比较完备,扩展性佳只支持主要的MQ功能,毕竟是为大数据领域准备的。
  1. 中小型软件公司,建议选 RabbitMQ. 一方面,erlang 语言天生具备高并发的特性,RabbitMQ 的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。不考虑 RocketMQ 和 kafka 的原因是中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以 kafka 和 RocketMQ 排除。
  2. 大型软件公司,根据具体使用在 RocketMQ 和 kafka 之间二选一。一方面,大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对 RocketMQ,大型软件公司也可以抽出人手对 RocketMQ 进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于 kafka ,根据业务场景选择,如果有日志采集功能,肯定是首选 kafka 了。

2.RabbitMQ

2.1.RabbitMQ介绍

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

2007年,Rabbit 技术公司基于 AMQP 标准采用 Erlang 语言开发的 RabbitMQ1.0 发布。

AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。类似HTTP。
在这里插入图片描述

  • 生产者(Publisher):发送消息的应用
  • 消费者(Consumer):接收消息的应用
  • 队列(Queue):存储消息的缓存,一个队列queue存多条消息
  • 消息(Message):由生产者通过RabbitMQ发送给消费者的信息,消息存储在消息队列queue中
  • 连接(Connection):连接RabbitMQ和应用服务器的TCP连接
  • 通道(Channel):连接里的一个虚拟通道。发送或接收消息都是通过通道进行的
  • 交换机(Exchange):生产者发送消息先发送到交换机,再由交换机发送到队列中并保存在队列里。(相当于中转站)
  • 绑定(Binding):绑定是队列和交换机的一个关联连接。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
  • 路由键(Routing key):路由键是供交换机查看并根据键来决定如何分发消息到队列的一个键。(可以说是消息的目的地址)
  • 用户(Users):在RabbitMQ中,可以通过指定的用户名和密码进来连接。每个用户可以分配不同的权限,例如读权限,写权限以及在实例里进行配置的权限。
  • 服务器实体(Broker):表示消息队列服务器实体。
  • 虚拟主机(Virtual Host):虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。

2.2.使用Docker安装RabbitMQ

# 1.拉取RabbitMQ镜像
~]$ docker pull rabbitmq:3.10.6
# 2.创建容器并运行
~]$ docker run \
 -e RABBITMQ_DEFAULT_USER=rabbitmq \ #登录用户名
 -e RABBITMQ_DEFAULT_PASS=123456 \  #登录密码
 --name rabbitmq \
 --hostname rabbitmq \
 --restart=always \		#Docker启动容器启动
 -p 15672:15672 \			
 -p 5672:5672 \
 -d \
 rabbitmq:3.10.6
 # 3.进入容器内部
~]$ docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_management  # 开启WEB界面管理插件

#修改 management_agent.disable_metrics_collector = false
cd /etc/rabbitmq/conf.d/
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
 
#退出容器
exit

#重启rabbitmq容器
~]$ docker restart rabbitmq

在这里插入图片描述
在这里插入图片描述

3.SpringBoot中使用RabbitMQ

3.1.SpringAMQP

SpringBoot中提供了一个spring-boot-starter-amqp依赖用于简化RabbitMQ 在Spring中开发应用。

SpringAMQP 是基于 AMQP 协议定义的一套API,提供了模板来发送和接收消息。包含两部分,spring-amqp 是基础抽象,spring-rabbit 是底层默认实现。 SpringAMQP 提供了三个功能:

  • 自动声明队列、交换机及其绑定关系
  • 基于注解的监听器模式,异步接收消息 (消费者)
  • 封装了 RabbitTemplate 工具,用于发送消息 (生产者)

SpringAMQP 是基于 RabbitMQ 封装的一套模板,配合 SpringBoot 让 RabbitMQ 使用变得非常简单

SpringAMQP 的官方地址:https://spring.io/projects/spring-amqp

3.2使用步骤

引入依赖

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

创建生产者测试类

@SpringBootTest
public class ProducerTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数
        factory.setHost("192.168.6.131");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("rabbitmq");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "basic.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();
    }
}

创建消费者测试类

public class ConsumerTest {

    @SneakyThrows
    public static void main(String[] args) throws IOException{
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数
        factory.setHost("192.168.6.131");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("rabbitmq");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();
        // 2.创建通道Channel
        Channel channel = connection.createChannel();
        // 3.创建队列
        String queueName = "basic.queue";
        channel.queueDeclare(queueName, false, false, false, null);
        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

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

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

相关文章

Learning C++ No.22【二叉树OJ题实战】

文章目录 引言&#xff1a;第一题&#xff1a;根据二叉树创建字符串第二题&#xff1a;二叉树的层序遍历第三题&#xff1a;自底向上实现层序遍历第四题&#xff1a;二叉树的最近公共祖先第五题&#xff1a;将搜索二叉树转换成双向链表第六题&#xff1a;从前序和中序遍历序列构…

修改USRPx410的ip地址

用 .\uhd_find_devices.exe查询设备 打印信息解释如下 在C:\Program Files\UHD\bin下打开powershell,输入如下指令ssh root@192.168.10.2 进入到设备内部 输入ifconfig,获取每个口的地址 输入ifconfig sfp0 192.168.10.3进行修改 重新.\uhd_find_devices.exe查询设备。 …

Linux:软件安装方法与命令yum.扩展ubantu系统的软件安装方法与命令apt

Linux&#xff1a;软件安装方法与命令yum: 这里的search可以想象成在linux的应用商店内搜索 例&#xff1a; 通过yum安装wget这个软件。 search搜索wget&#xff1a; 发现在“linux的应用市场”内有wget这个软件&#xff0c;现在再用yum -y install wget安装&#xff08;上面已…

你好:Zookeeper

Zookeeper 初识 初识ZookeeperZookeeper 安装Zookeeper 命令操作Zookeeper数据模型服务端命令客户端命令JavaAPI操作Curator常用操作&#xff1a;前置环境连接Zookeeper集群创建节点查询节点修改节点删除节点事件监听机制 – Watch分布式锁实现分布式锁得API 初识Zookeeper Zo…

排序篇:外排序(排序文件中的数据)

目录 前言&#xff1a; 一&#xff1a;大体思路 二&#xff1a;分割成有序的小文件 (1)先给代码 (2)解析 三&#xff1a;进行文件归并 (1)主逻辑 (2)归并两个有序文件 四&#xff1a;全部代码 前言&#xff1a; 如果要排序的数据量非常大&#xff0c;内存无法容纳&…

零基础自学软件测试我只用了105天,从月薪3000到15K, 我整理的超全学习指南!

我21年毕业于管理类专业&#xff0c;干了大半年行政打杂&#xff0c;工作平淡无快感。性格较内向&#xff0c;思维严谨独立。喜欢软件测试工作内容的系统性&#xff0c;技术性&#xff0c;丰富性。以上便是转行的最初心理&#xff0c;大家觉得可妥&#xff1f;说干就干去年6月底…

(前期准备工作2)白嫖Replit的免费云服务器搭建属于自己的应用

Replit介绍 Replit(原来是https://repl.it)是一个基于浏览器的云端协同开发平台,可用于构建开发环境、实时协作、托管网络应用等。Replit提供可创建动态或者静态网站的容器,并会自动生成免费https域名(格式为:项目名.用户名.http://repl.co)。这代表着任何人都可以试用…

Kafka的工作原理

一、Kafka是什么&#xff1f; Kafka是一个分布式的基于发布/订阅模式的消息队列。分布式消息队列可以看成是将这种先进先出的数据结构独立部署在服务器上&#xff0c;应用程序可以通过远程访问接口使用它。 二、Kafka的工作机制是什么&#xff1f; 1.基本概念 2.消息模型 发…

WiFi基础学习到实战(六:Beacon帧字段解析)

欢迎大家一起学习探讨通信之WLAN。上节我们基于Android设备分析了WiFi扫描的代码实现&#xff0c;具体执行WiFi网络扫描由WiFi模块实现。WLAN协议定义扫描方式有“被动扫描”和“主动扫描”。本节继续分析“被动扫描”依赖Beacon帧中的字段。 好。我们先来看Android11 WiFi扫描…

会计转行数据分析,可行性多高?

看到这样的问题&#xff0c;第一个想法是想劝退&#xff0c;毕竟通过不明真相的网友身上找自己的未来&#xff0c;这件事听着就不靠谱。转行难&#xff0c;转行做好更好&#xff0c;虽然会计也与数据有关&#xff0c;但是数据分析涉及的技术内容明显有很大的差别。所以&#xf…

重塑职业未来:在竞争激烈的职场上脱颖而出的关键策略

在竞争激烈的职场上&#xff0c;各种职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这都是需要去克服的问题。下面分享一下职场老人的经验&#xff01; 一、你遇到过哪些职场问题&#xff1f;分享一下你是怎么解决的呢&…

Type-C边充电边OTG转接器方案

随着生活水平的提高&#xff0c;大家的电子设备也多了起来&#xff0c;更有甚者会凑齐“全家桶”&#xff0c;手机&#xff0c;平板&#xff0c;笔记本电脑&#xff0c;智能手表&#xff0c;无线耳机&#xff0c;Switch&#xff0c;PS5&#xff0c;一样不落。那么多的电子设备&…

hibernate入门项目(一)

本节我们将演示如何搭建一个 Hibernate 工程。 搭建 Hibernate 工程需要以下 7 步&#xff1a; 下载 Hibernate 开发包 新建工程 创建数据库表 创建实体类 创建映射文件 创建 Hibernate 核心配置文件 测试 1. 下载 Hibernate 开发包 浏览器访问 Hibernate 官网 下载 Hibern…

520告白日!小红书关键词热度查询,今年的心动密码是什么?

520&#xff0c;又是一个有爱的日子&#xff0c;人们借机表达爱意的日子&#xff0c;品牌不会错过的好时机。今年520什么东西比较热呢&#xff1f;消费者比较关注什么&#xff1f;品牌有什么样动作&#xff1f;下面&#xff0c;借助小红书关键词热度查询、热词排行榜&#xff0…

基于C3D卷积神经网路的动作识别

对于基于视频分析的问题&#xff0c;2D卷积&#xff08;卷积核为二维&#xff09;不能很好得捕获时序上的信息&#xff0c;因此《3D convolutional neural networks for human action recognition》 这片论文提出了3D卷积并用于行为识别的&#xff0c;论文中将其用于行为识别&a…

商家中心之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

cpp test

1. 以下程序在linux 64位系统的输出结果&#xff08; &#xff09; #include <stdio.h> int main(void) {int buf[100] { 0 };printf("%d,%d,%d,%d,%d",sizeof(int), sizeof(long long), sizeof(buf),sizeof(buf)/sizeof(buf[0]), sizeof(&buf));retur…

【Linux Network】网络层协议——IP

目录 网络层 IP协议 基本概念 协议头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 路由表生成算法 Linux网络编程&#x1f337; 网络层 在复杂的网络环境中确定一个合适的路径&#xff1b; IP协议 基本概念 主机 : 配有 IP 地址 , 但是不进行路…

前端必学,crud,magic-Api

CRUD还要后端写&#xff1f; 前端自己搞定&#xff0c;只需要会写sql就行。 文档写的比我写的好太多&#xff0c;直接看文档 创建springBoot&#xff08;springBoot版本要小于3.0&#xff09; 引入pom <?xml version"1.0" encoding"UTF-8"?> &…

接口自动化——har 生成用例

这里写目录标题 一、目标二、应用场景三、Har 简介四、实现思路五、模板技术六、模版技术-环境安装&#xff08;Python&#xff09;七、har 生成用例实现思路1、python模板模板文件生成的测试文件 2、java模板模板文件生成的测试文件 3、httprunner模板模板文件生成的测试文件 …