RabbitMQ的基本使用&入门

这篇具有很好参考价值的文章主要介绍了RabbitMQ的基本使用&入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

RabbitMQ是一个开源的消息代理软件,用于处理应用程序之间的消息传递。它实现了高级消息队列协议(AMQP),是一个可靠且灵活的消息中间件,广泛用于构建分布式系统、微服务架构以及异构系统之间的通信 ,本期文章将为大家带来RabbitMQ的基本使用及入门

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

 一.RabbitMQ基本介绍

RabbitMQ可以实现可靠的异步通信,解耦系统中的组件,以及处理高并发和大规模的消息流。它在许多领域,如微服务架构、日志处理、任务调度等方面都有广泛的应用

消息队列(Message Queue): RabbitMQ作为消息中间件,它允许应用程序之间通过消息进行通信。消息被发送到队列中,然后由消费者从队列中接收并处理。

生产者(Producer): 生产者是将消息发送到RabbitMQ的应用程序。它将消息发布到一个或多个队列。

消费者(Consumer): 消费者是从RabbitMQ接收消息并进行处理的应用程序。一个队列可以有多个消费者,但每条消息只会被一个消费者处理。

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

交换机(Exchange): 交换机负责将消息路由到一个或多个队列。生产者将消息发送到交换机,而交换机则将消息路由到相关的队列。

队列(Queue): 队列是存储消息的地方,它是消息的终点。消费者从队列中获取消息并进行处理。

绑定(Binding): 绑定是交换机和队列之间的关系,它定义了如何将消息从交换机路由到队列。

  1. 持久性(Durable): RabbitMQ支持将队列和消息标记为持久性,以确保在服务器重启时数据不会丢失。

  2. 虚拟主机(Virtual Host): 虚拟主机是RabbitMQ中消息隔离的单位,允许在同一RabbitMQ服务器上创建多个独立的消息代理。

  3. ACK(Acknowledgment): 消费者在处理完消息后发送ACK,通知RabbitMQ该消息已被成功处理。这确保消息不会在处理失败时丢失。

  4. 插件系统: RabbitMQ具有丰富的插件系统,允许扩展和定制其功能

1.常见消息队列

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

2.Docker安装部署RabbitMQ

1.拉取镜像

docker pull  rabbitmq:management

2.创建容器

命令详解:

在后台运行一个RabbitMQ容器,通过主机的5672端口可以访问RabbitMQ的AMQP服务,通过主机的15672端口可以访问RabbitMQ的管理界面。RabbitMQ的默认虚拟主机为"my_vhost",默认用户名和密码为"admin"。容器的主机名被设置为"my-rabbitmq-host"。容器将在守护进程启动时自动重新启动

在虚拟机中运行以下命令 

docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management

开放端口

firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent

容器创建运行完成后我们可以在自己的主机上通过IP:15672进入到管理员界面,账号密码为我们上面命令指定的admin,登录即可

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

3.添加用户

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器 添加用户输入账户名和密码指定当前用户身份

4.分配操作虚拟主机

刚创建完的用户还不能进行一个登录,需要给它分配一个能够操作的虚拟主机

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器 Virtal Host是可以分配的虚拟主机,Set permission可以对其进行分配

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

 分配完成后的用户就可以对当前虚拟主机进行登录等操作了

二.RabbitMQ实现简单队列

1.项目创建

我们以生产者和消费者的形式创建SpringBoot项目

 RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

创建时需要注意,以SpringBoot项目为例在勾选依赖时,要将Spring for Rabbit勾选

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

2.对生产者和消费者进行配置

生产者和消费者的配置文件都需要更改

注意:端口不能相同防止端口冲突,要将ip修改为自己的主机ip以及用户名和密码

server:
    port: 8888
spring:
    rabbitmq:
        host: Rabbit所在主机的ip
        username: YU
        password: 123456
        port: 5672
        virtual-host: my_vhost

3.创建RabbitMQ队列的Spring配置类

通过@Bean注解,它定义了一个名为firstQueue的Bean,该Bean是一个Queue实例,代表了一个名为"firstQueue"的RabbitMQ队列。这样的配置允许应用程序使用该队列进行消息的生产和消费

package com.yu.publisher;

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

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
@Bean
    public Queue firstQueue() {
        return new Queue("firstQueue");
    }
}

4.创建控制层进行访问测试

1.生产者

我们通过导入Spring AMQP框架中用于发送消息的AmqpTemplate接口,调用amqpTemplateconvertAndSend方法向名为"firstQueue"的RabbitMQ队列发送消息,消息内容为"hello world",发送成功后返回一个字符串"🚀",作为HTTP响应体。

package com.yu.publisher;

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;

@RestController
public class TestController {
    @Autowired
    private AmqpTemplate amqpTemplate;

    @RequestMapping("send1")
    public String send1(){
        //向消息队列发送消息
        amqpTemplate.convertAndSend("firstQueue","hello world");
        return "🚀";
    }
}

测试阶段:

启动生产者,在浏览器调用send1(Controller中的方法)进行访问测试

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

这时我们打开RabbitMQ控制面板中的消息队列就可以看到我们刚刚发送的消息了

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器 

 2.消费者

我们通过注解@RabbitHandler指定该类监听名为"firstQueue"的RabbitMQ队列和@RabbitHandler注解标识该方法为处理RabbitMQ消息的方法,使用Lombok生成的日志记录器记录接收到的消息,将"接收到:"与消息内容拼接并记录为警告级别的日志,当队列"firstQueue"中有消息到达时,process方法会被调用,将接收到的消息记录到日志中

package com.yu.consumer;

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

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue")
public class Receiver {
@RabbitHandler
public void process(String msg) {
log.warn("接收到:" + msg);
}
}

启动消费者,这时,当我们再去访问生产者时,在日志信息中就会返回生产者所发送的消息

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

5.通过消息队列发送对象

 在RabbitMQ中发送对象通常需要进行对象的序列化和反序列化,以便将对象转换为消息体发送到队列,然后从队列接收消息并还原为对象

1.在生产者中创建实体User

实现序列化接口

package com.yu.publisher;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@SuppressWarnings("all")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String username;
private String userpwd;
}

2.配置RabbitMQ的Quene实例

package com.yu.publisher;

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

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
    @Bean
    public Queue secondQueue() {
        return new Queue("secondQueue");
    }

}

3.创建发送信息方法

使用ObjectMapper将其序列化为JSON字符串,然后通过amqpTemplate.convertAndSend将这个JSON字符串发送到名为"secondQueue"的RabbitMQ队列

package com.yu.publisher;

import com.fasterxml.jackson.databind.ObjectMapper;
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;

@RestController
public class TestController {
    @Autowired
    private AmqpTemplate amqpTemplate;
    @Autowired
    private ObjectMapper objectMapper;

    @RequestMapping("send2")
    public String send2() throws Exception{
        User user = new User("YU","123");
        String YU = objectMapper.writeValueAsString(user);
        //向消息队列发送消息
        amqpTemplate.convertAndSend("secondQueue",YU);
        return "🚀";
    }
}

4.创建接受信息方法

声明一个方法作为消息处理器,标记方法用于处理从RabbitMQ队列接收到的消息,处理消息的方法,该方法接收一个JSON字符串参数使用ObjectMapper将JSON字符串转换为User对象,使用Slf4j日志框架记录接收到的User对象,这里使用warn级别,接收并处理从"secondQueue"队列中接收到的消息

package com.yu.consumer;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue")
public class PojoReceiver {

    @Autowired
    private ObjectMapper objectMapper;
    @RabbitHandler
    public void process(String json) throws Exception {
        User user = objectMapper.readValue(json, User.class);
        log.warn("接收到:" + user);
    }
}

测试阶段:

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器

当我们向消息队列中发送一个对象,消费者再进行接收

RabbitMQ的基本使用&入门,rabbitmq,分布式,docker,容器文章来源地址https://www.toymoban.com/news/detail-811853.html

到了这里,关于RabbitMQ的基本使用&入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫分布式架构 - Redis/RabbitMQ工作流程介绍

    在大规模数据采集和处理任务中,使用分布式架构可以提高效率和可扩展性。本文将介绍Python爬虫分布式架构中常用的消息队列工具Redis和RabbitMQ的工作流程,帮助你理解分布式爬虫的原理和应用。 为什么需要分布式架构? 在数据采集任务中,单机爬虫可能面临性能瓶颈和资

    2024年02月11日
    浏览(34)
  • 分布式消息队列:Kafka vs RabbitMQ vs ActiveMQ

    在现代分布式系统中,消息队列是一种常见的异步通信模式,它可以帮助系统处理高并发、高可用性以及容错等问题。在这篇文章中,我们将深入探讨三种流行的分布式消息队列:Apache Kafka、RabbitMQ和ActiveMQ。我们将讨论它们的核心概念、算法原理、特点以及使用场景。 随着

    2024年02月02日
    浏览(51)
  • 微服务学习:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目录 一、高级篇 二、面试篇 ==============实用篇============== day05-Elasticsearch01 1.初识elasticsearch 1.4.安装es、kibana 1.4.1.部署单点es 1.4.2.部署kibana 1.4.3.安装IK分词器 1.4.4.总结 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.

    2024年02月02日
    浏览(43)
  • (黑马出品_07)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 聚合 可以让我们极其方便

    2024年03月12日
    浏览(40)
  • 分布式搜索引擎(Elastic Search)+消息队列(RabbitMQ)部署(商城4)

    1、全文搜索 Elastic search可以用于实现全文搜索功能,例如商城中对商品搜索、搜索、分类搜索、订单搜索、客户搜索等。它支持复杂的查询语句、中文分词、近似搜索等功能,可以快速地搜索并返回匹配的结果。 2、日志分析 Elastic search可以用于实现实时日志分析,例

    2024年02月04日
    浏览(37)
  • 分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 同步调用 方案一:同步调用 基本步骤如下: hotel-demo对外提供接口,用来修改elasticsearch中的数据 酒店管理服务在完成数据库操

    2024年04月11日
    浏览(36)
  • 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

    org.springframework.boot spring-boot-starter-amqp mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-jdbc com.alibaba fastjson 1.2.17 3.2.1.2配置文件内容: server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=tru

    2024年04月14日
    浏览(48)
  • (黑马出品_高级篇_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 消息队列在使用过程中,面

    2024年03月19日
    浏览(38)
  • SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈

    我们发现在微服务中有一个令人头疼的问题——部署,用Docker去解决这个部署难题 1、项目部署的问题 2、Docker 扔到一台机器上,它们的依赖难道没有干扰吗?不会,docker将打包好的程序放到一个隔离容器去运行,使用沙箱机制,避免互相干扰,之间不可见,这样就解决了混

    2023年04月24日
    浏览(35)
  • RabbitMQ:高效传递消息的魔法棒,一篇带你助力构建可靠的分布式系统(上篇)

    MQ是消息队列( Message Queue )的缩写,是一种在应用程序之间传递消息的技术。通常用于 分布式系统 或 异步通信 中,其中 发送者 将消息放入队列,而 接收者 从队列中获取消息。 这种异步通信模式允许发送者和接收者在不需要实时连接的情况下进行通信,从而提高了应用

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包