『RabbitMQ』入门指南(安装,配置,应用)

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

前言

RabbitMQ 是在 AMQP(Advanced Message Queuing Protocol) 协议标准基础上完整的,可复用的企业消息系统。它遵循 Mozilla Public License 开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,建立在 Erlang OTP 平台上(因为采用 Erlang 开发,所以 RabbitMQ 稳定性和可靠性比较高

其他主流 MQ 产品

  • ActiveMQ:Apache 出品,最流行的,能力强劲的开源消息总线,基于 JMS(Java Message Service)规范
  • RocketMQ:阿里低延迟、高并发、高可用、高可靠的分布式消息中间件,基于 JMS,目前由 Apache 基金会维护
  • Kafka:分布式,分区的,多副本的,多订阅者的消息发布订阅系统(分布式 MQ 系统),可以用于搜索日志,监控日志,访问日志等

本文为 RabbitMQ 入门教程,主要将会讲解 RabbitMQ 安装配置(Windows),相关概念,及项目中具体应用

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

安装

Erlang

官网下载链接:Downloads - Erlang/OTP

RabbitMQ 服务器必须首先安装 Erlang 运行环境,同时安装时需要注意 RabbityMQ 所依赖的 Erlang 版本,我们可以查看下方官方版本对应信息

版本对应:RabbitMQ Erlang Version Requirements — RabbitMQ

本次使用版本 Erlang OTP 25.3(点击跳转下载链接)

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

双击执行 exe 安装程序,除了安装路径其他都按照默认即可

然后配置环境变量

ERLANG_HOME = D:\Erlang\Erlang\Erlang OTP

并且添加 /bin 目录到 Path 环境变量中,即添加 %ERLANG_HOME%\bin 到 Path 中

安装配置之后,打开 CMD,输入 erl 然后回车键,会弹出版本信息,表示 Erlang 安装成功

RabbitMQ

官方下载页面:RabbitMQ Changelog — RabbitMQ

下载链接: RabbitMQ 3.12.0

安装 exe 文件,执行安装包,同样除了安装路径外其他保持默认

配置环境变量

RABBITMQ_SERVER = D:\RabbitMQ\RabbitMQ\rabbitmq_server-3.12.0

然后添加 %RABBITMQ_SERVER%\sbin 到 Path 环境变量中

查看所有插件

rabbitmq-plugins list

注:如果出现问题请参考最后一章 彻底卸载

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

之后我们需要安装 rabbitmq_management 插件,可以使用可视化的方式查看 RabbitMQ 服务器实例的状态,以及操控 RabbitMQ 服务器

# 安装插件
rabbitmq-plugins enable rabbitmq_management

访问管理界面: http://localhost:15672/ (账号密码:guest / guest)

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

前期安装配置完毕,下面可以配合官方入门文档学习

官方文档:RabbitMQ Tutorials — RabbitMQ

消息队列

定义

消息指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。

“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

作用

解耦。如图所示。假设有系统 B、C、D 都需要系统 A 的数据,于是系统 A 调用三个方法发送数据到 B、C、D。这时,系统 D 不需要了,那就需要在系统 A 把相关的代码删掉。假设这时有个新的系统 E 需要数据,这时系统 A 又要增加调用系统 E 的代码。为了降低这种强耦合,就可以使用 MQ,系统 A 只需要把数据发送到 MQ,其他系统如果需要数据,则从 MQ 中获取即可

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

异步。如图所示。一个客户端请求发送进来,系统 A 会调用系统 B、C、D 三个系统,同步请求的话,响应时间就是系统 A、B、C、D 的总和,也就是 800ms。如果使用 MQ,系统 A 发送数据到 MQ,然后就可以返回响应给客户端,不需要再等待系统 B、C、D 的响应,可以大大地提高性能。对于一些非必要的业务,比如发送短信,发送邮件等等,就可以采用 MQ

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

削峰。如图所示。这其实是 MQ 一个很重要的应用。假设系统 A 在某一段时间请求数暴增,有 5000 个请求发送过来,系统 A 这时就会发送 5000 条 SQL 进入 MySQL 进行执行,MySQL 对于如此庞大的请求当然处理不过来,MySQL 就会崩溃,导致系统瘫痪。如果使用 MQ,系统 A 不再是直接发送 SQL 到数据库,而是把数据发送到 MQ,MQ 短时间积压数据是可以接受的,然后由消费者每次拉取 2000 条进行处理,防止在请求峰值时期大量的请求直接发送到 MySQL 导致系统崩溃

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

特点

可靠性:通过支持消息持久化,支持事务,支持消费和传输的 ack 等来确保可靠性

路由机制:支持主流的订阅消费模式,如广播,订阅,headers 匹配等

扩展性:多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点

高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队仍然可用

多种协议:RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP,MQTT 等多种消息中间件协议

多语言客户端:RabbitMQ 几乎支持所有常用语言,比如 Java、Python、Ruby、PHP、C#、JavaScript 等

管理界面:RabbitMQ 提供了易用的用户界面,使得用户可以监控和管理消息、集群中的节点等

插件机制:RabbitMQ 提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件

应用

本章将会集成 rabbitmq 到 SpringBoot 中,并使用 rabbitmq-provider (生产者)和 rabbitmq-consumer(消费者) 两个项目进行具体讲解, 也可以在父项目中创建这两个模块(本文采用父子模块方式)

所有代码示例已经上传到 GitHub 仓库

仓库地址:ReturnTmp/rabbitmq-demo: rabbitmq 实例代码 (github.com)

生产者

配置

创建子模块 rabbitmq-provider

依赖配置(也可以 IDEA 初始化模块直接勾选)

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

application.yml

server:  
  port: 8021  
spring:  
  application:  
    name: rabbitmq-provider  
  rabbitmq:  
    host: 127.0.0.1  
    port: 5672  
    username: root  
    password: 111111  
    virtual-host: RootHost

其中虚拟 host 配置项不是必须的,需要自行创建 vhost,如果未自行创建,默认为 virtual-host: /

注:vhost 可以理解为虚拟 broker,即 mini-RabbitMQ server,其内部均含有独立的 queue、bind、exchange 等,最重要的是拥有独立的权限系统,可以做到 vhost 范围内的用户控制。当然,从 RabbitMQ 全局角度,vhost 可以作为不同权限隔离的手段

可以按照如下步骤创建 vhost

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

然后创建用户(管理员)

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

然后我们需要为用户分配权限,指定使用我们刚刚创建的 vhost

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

代码

创建直连交换机配置类

注:RabbitMQ 共有四种交换机,分别为:直连交换机,扇形交换机,主题交换机,首部交换机。这里使用直连交换机演示,其他读者可以自行尝试

@Configuration
public class DirectRabbitConfig {

    //队列 起名:TestDirectQueue
    @Bean
    public Queue TestDirectQueue() {
        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
        //   return new Queue("TestDirectQueue",true,true,false);

        //一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue("TestDirectQueue", true);
    }

    //Direct交换机 起名:TestDirectExchange
    @Bean
    DirectExchange TestDirectExchange() {
        //  return new DirectExchange("TestDirectExchange",true,true);
        return new DirectExchange("TestDirectExchange", true, false);
    }

    //绑定  将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
    @Bean
    Binding bindingDirect() {
        return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");
    }


    @Bean
    DirectExchange lonelyDirectExchange() {
        return new DirectExchange("lonelyDirectExchange");
    }

}

然后写简单的接口进行消息推送(可以视情况写为定时任务)

@RestController
public class SendMessageController {

    @Autowired
    RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法

    @GetMapping("/sendDirectMessage")
    public String sendDirectMessage() {
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = "test message, hello!";
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String, Object> map = new HashMap<>();
        map.put("messageId", messageId);
        map.put("messageData", messageData);
        map.put("createTime", createTime);
        //将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
        rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);
        return "ok";
    }
}

启动项目,调用接口: http://localhost:8021/sendDirectMessage

查看 RabbitMQ 管理页面查看是否推送成功

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

消费者

配置

创建子模块 rabbitmq-consumer

依赖配置

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

application.yml

server:  
  port: 8022  
spring:  
  application:  
    name: rabbitmq-consumer  
  rabbitmq:  
    host: 127.0.0.1  
    port: 5672  
    username: root  
    password: 111111  
    virtual-host: RootHost
代码

创建消息接收监听类

@Component
@RabbitListener(queues = "TestDirectQueue")
public class DirectReceiver {

    @RabbitHandler
    public void process(Map testMessage) {
        System.out.println("DirectReceiver receive message: " + testMessage.toString());
    }
}

之后启动项目,查看消费者接收情况

『RabbitMQ』入门指南(安装,配置,应用),框架工具,RabbitMQ,消息队列,入门,Windows,SpringBoot

序列化

发送接收消息可能出现 Failed to convert message 问题,可以通过使用 JSON 序列化传输信息方式解决

生产者
@Configuration
public class RabbitMQConfig implements InitializingBean {

    /**
     * 自动注入RabbitTemplate模板
     */
    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息JSON序列化
     */
    @Override
    public void afterPropertiesSet() {
        //使用JSON序列化
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
    }
}
消费者
@Configuration
public class RabbitMQConfig {

    @Bean
    public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {
        return new Jackson2JsonMessageConverter(objectMapper);
    }
}

彻底卸载

我们安装中可能出现各种问题,一般情况下是 RabbitMQ 和 Erlang 版本不对应,需要完全卸载 RabbitMQ 和 Erlang,可以按照如下步骤卸载

注:博主首次安装使用的是 Erlang 20.3 Rabbit 3.7.15 ,之后似乎小版本不对应,出现问题,需要重新卸载安装

(1)打开 Windows 控制面板,双击“程序和功能”。

(2)在当前安装的程序列表中,右键单击 RabbitMQ Server,然后单击“卸载”。

(3)在当前安装的程序列表中,右键单击“Erlang OTP”,然后单击“卸载”。

(4)打开 Windows 任务管理器。

(5)在任务管理器中,查找进程 epmd.exe。 如果此进程仍在运行,请右键单击该进程,然后单击“结束进程”。

(6)删除 RabbitMQ 和 Erlang 的所有安装目录。

(7)删除文件 C:\Windows\System32\config\systemprofile.erlang.cookie如果存在)。

(8)转到用户文件夹:C:\Users\[username],然后删除文件.erlang.cookie。

(9)同样在 User 文件夹中,转到 AppData \ Roaming \ RabbitMQ。删除 RabbitMQ 文件夹。

(10)删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv 的子项。

(11)打开运行 cmd->sc delete RabbitMQ。

(12)打开运行->regedit 找到 RabbitMQ 节点,删掉即可(如果存在

参考链接

  • Windows 下安装 RabbitMQ 服务器及基本配置 - 蓝之风 - 博客园 (cnblogs.com)
  • RabbitMQ Windows 安装、配置、使用 - 小白教程-阿里云开发者社区 (aliyun.com)
  • Windows 如何完全卸载 RabbitMQ 和 Erlang 删除注册表
  • windows 下 Erlang 与 RabbitMQ 重新安装时,由于卸载不干净导致各类错误
  • 超详细的 RabbitMQ 入门,看这篇就够了!-阿里云开发者社区 (aliyun.com)
  • RabbitMQ 整合 Spring Boot,实现 Hello World
  • Springboot 整合 RabbitMq ,用心看完这一篇就够了
  • RabbitMq 核心知识点小结 - 知乎 (zhihu.com)
  • RabbitMQ消费消息坑:failed to convert serialized Message content - jiuchengi

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-751459.html

到了这里,关于『RabbitMQ』入门指南(安装,配置,应用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Django框架:入门指南与常用命令

    引言: 在当今的Web开发世界中,Django无疑是一个备受瞩目的框架。它以其强大的功能和易用性,吸引着越来越多的开发者。这篇博客将为你提供一个关于Django的概览,以及一些常用的命令,帮助你快速上手。 一、Django简介: Django是一个高级Python Web框架,它鼓励快速开发和干

    2024年02月03日
    浏览(42)
  • C++界面开发框架Qt 6.x入门指南 - 拥有程序主窗口

    Qt技术交流群:166830288      欢迎一起进群讨论 点击获取Qt组件下载 Qt Widget 是桌面环境中典型的用户界面元素,这些小部件很好地集成到底层平台,在 Windows、Linux 和 macOS 上提供原生外观。 这些小部件成熟且具有丰富的用户界面元素,适用于大多数传统用户界面。 与 

    2024年02月05日
    浏览(46)
  • 应用程序接口(API)安全的入门指南

    本文简单回顾了 API 的发展历史,其基本概念、功能、相关协议、以及使用场景,重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。   根据有记录的历史,随着 Salesforce 的销售自动化解决方案的推出,首个 Web API 在 1990 年底出现了。在那个时候,

    2024年02月03日
    浏览(47)
  • 前端桌面应用开发实践:Electron入门指南

    随着互联网的快速发展,前端开发不再局限于网页应用,而是逐渐涉及到桌面应用的开发。Electron作为一种流行的前端桌面应用开发框架,为开发者提供了一种快速构建跨平台桌面应用的方式。本文将介绍Electron的基本概念和使用方法,并通过一个简单的示例来说明其开发实践

    2024年02月11日
    浏览(47)
  • QSS盒子模型入门指南:了解和应用基础知识

    #概述 QSS(Qt Style Sheets)是一种用于美化和定制化Qt应用程序的样式表语言。了解和掌握QSS盒子模型的基本概念对于创建漂亮的用户界面布局至关重要。本文将详细介绍QSS盒子模型的各个组成部分,并提供一些入门级的示例,帮助您快速掌握盒子模型的基础知识。 在QSS盒子模

    2024年02月07日
    浏览(74)
  • 云原生入门指南:构建未来的弹性、高效和可靠应用

    什么是云原生? 云原生的定义 :云原生是一种构建和 运行在云端 的应用开发和部署方法论,旨在提高应用的弹性、可伸缩性、可观察性和容错性。 云原生与传统应用开发的区别:传统应用通常被设计和优化为运行在特定环境中,而云原生应用则利用云计算和容器化技术,

    2024年02月10日
    浏览(40)
  • Midjourney入门指南:简单提示词,搞定高质量应用设计

    Midjourney是一款文本到图像的AI工具,可以根据纯文本描述生成图片,例如UI屏幕、应用程序图标、产品图片、标志和吉祥物等。虽然它不能替代UI设计师,但它可以在产品设计和视觉探索的早期阶段成为有帮助的工具。要使用Midjourney,您需要加入Discord,并编写清晰的提示,阐

    2024年02月06日
    浏览(61)
  • PWA 入门指南:理解与构建现代化 Web 应用

    关于作者: 还是大剑师兰特 :曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。 热门专栏 精彩推荐

    2024年03月18日
    浏览(55)
  • Graphviz安装向导及入门指南

    目录 1、首先在官网下载graphviz 2、安装。 3、测试并在Windows命令行中使用 4、在Python中使用  5、在自带的gvedit.exe 程序中使用 6、在语雀中使用  7、绘制一棵简单的二叉树 8、详细语法介绍 8.1 带标签 8.2 修改方框颜色和形状 8.3子视图  8.4 结构视图 8.5 继承关系  下载网址:

    2024年02月14日
    浏览(73)
  • C++ 编程入门指南:深入了解 C++ 语言及其应用领域

    C++ 是一种跨平台的编程语言,可用于创建高性能应用程序。 C++ 是由 Bjarne Stroustrup 开发的,作为 C 语言的扩展。 C++ 为程序员提供了对系统资源和内存的高级控制。 该语言在 2011 年、2014 年、2017 年和 2020 年进行了 4 次重大更新,分别为 C++11、C++14、C++17 和 C++20。 C++ 是世界上

    2024年03月21日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包