RabbitMQ细说之开篇

前言

关于消息中间件的应用场景,小伙伴们应该都耳熟能详了吧,比如经常提到的削峰填谷、分布式事务、异步业务处理、大数据分析等等,分布式消息队列成为其中比较关键的桥梁,也就意味着小伙伴们得掌握相关技能;当下相对比较热门的消息中间件有RabbitMQ、Kafaka、RocketMQ、ActiveMQ等,在实际应用场景中,发现很多小伙伴和我一样都是跟着相关框架(CAP、Masstransit等)文档进行使用,实现功能,并没有关注消息队列相关知识点,总感觉缺少点精髓,所以想着就以RabbitMQ为着手点,一起学习学习相关细节。

正文

1. 简介

1.1 RabbitMQ 概要

RabbitMQ是基于Erlang语言开发的开源消息中间件,比较轻量级,广泛应用于分布式系统中存储消息、转发消息,具有高可用,高可扩性,易用性等特征。

RabbitMQ支持多种消息传递协议,默认采用的是AMQP协议,通过插件扩展的方式可以支持STOMP、MQTT、RabbitMQ Stream协议。

  • AMQP协议简单理解

    AMQP:(全称:Advanced Message Queuing Protocol-是高级消息队列协议) ,是一个提供统一消息服务的应用层标准高级消息队列协议,是一种二进制协议;基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品、不同的开发语言等条件的限制。

  • 核心组成部分

    RabbitMQ基于AMQP实现,主要组成部分及流程如下:

    75184569eb6bd66ea56ec30c33f73018.png

    上图简介:

    生产者负责将消息投递到服务器中,消费者负责订阅接收消息,然后进行对应的业务处理。经过的核心组成部分如下:

    生产者(Producer) :负责产生消息,并将消息发送到服务器上;

    消费者(Consumer) :负责消息的消费,即订阅消息,然后处理相关的业务逻辑;

    Message :消息:服务与应用程序之间传送的数据,由一些属性和消息体组成,通过属性可以设置消息的优先级,延迟等高级特性

    服务器(Server) :又称Broker ,接受客户端的连接。保证消息能够按照指定的方式进行传输;连接(Connection) :应用程序与Broker的网络连接(TCP-IP/ 三次握手和四次挥手);Channel:虚拟连接,它是基于Connection连接建立的,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立多个Channel,每个Channel代表一个会话任务;

    Virtual Host 虚拟地址,用于进行逻辑隔离,一个虚拟主机可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名字的Exchange;交换机(Exchange) :接受消息,根据路由键投递消息到绑定的队列,本身不具备消息存储的能力;Bindings:Exchange和Queue之间的虚拟关系,Binding中可以有多个routing key;Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息;队列(Queue) :也称为消息队列(Message Queue),主要功能是保存消息并将其转发给消费者;

具体详细小伙伴可以看看官网(https://www.rabbitmq.com/),接下来我们就开始安装,然后先上手玩玩。

2. 安装及界面简介

2.1 安装

按照传统方式安装,需要进行Erlang语言环境安装、配置用户,为了方便,这里还是用我最喜欢(偷懒)的Docker方式安装,关于Docker相关系列的教程,点击《Docker系列》看详细内容。

这里演示还是使用阿里云服务器,完成Docker环境安装之后,直接执行如下命令即可完成RabbitMq的安装:

docker run -di --name RabbitDemo -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

命令简介:

-d:指定后台启动容器;--name:指定容器名称为RabbtiDemo;-e: 指定环境变量,设置RabbitMQ的用户名和密码;-p: 主机端口和容器端口的映射

端口简介

  • 5672:RabbitMQ的通讯端口;

  • 15672:RabbitMQ HTTP API的端口,启动Management插件,可查看和管理RabbitMQ相关信息。

  • 25672:RabbitMQ节点间的CLI通讯端口;

  • 1883、8883:MQTT插件启动时的端口。

  • 61613、61614:STOMP客户端插件启用时的端口。

  • 15674、15675:基于Websocket的STOMP端口和MOTT端口

我们主要是来说说RabbitMQ默认的协议AMQP,所以这里只关注5672、15672、25672即可。如果小伙伴也是用云服务器,则需要对应的端口添加到安全组和防火墙中

通过docker ps 命令查看容器运行正常之后,就可以通过浏览器访问RabbitMQ的管理页面,如下:

e667d01d68a16e8538e327f4fd766913.png

输入安装时设置的用户名和密码就可以登录到管理主界面了。

2.2 界面初识
  • 首页概览

    首页会展示一些整体信息,包括消息、节点等相关信息。

    c798b50a1667b0c452b63bf9b0142f3b.png
  • 连接(Connections)情况

    对于Connections和Channels而言,默认安装完是没有的,这里为了展示全一点的信息,搞了个客户端连上,在后续的代码实战中我们会好好仔细说说。

    ab7c351f121307078e9f362345ec19c8.png

    点击队列名称可以进入连接详情,如果对应的用户有权限,可以强制关掉对应的连接。

    15b85ac60aa67d7a2ca06a36182de61d.png
  • Channels情况

    Channel是基于Connection的,一个Connection中可以创建多个Channel,提高传输效率。

    12b1dcf604e0c3eb3b8ba3f25c583eda.png
  • 交换机(Exchangs)管理

    交换机主要用来进行转发消息,可以只设置模式,将消息投递到队列中。

    f4caa597f5979ac531ec26554a3d6620.png

    里面的具体参数信息,后续会在实际演示情况的时候一一说到。

  • 队列(Queues)管理

    队列就是为存储消息并将其转发给消费者。

    585566f53d6b4aa99de16c77574185fc.png

    点击队列进入详情页面,可以绑定交换机等操作,如下:

    f30893babab3d1817ad38b6afab6151d.png
  • 用户/权限/虚拟主机(Virtual Host)等管理

    用户管理

    针对不同的使用场景添加不同的用户,并设置对应的权限。

    db0809b68eb6cb6db362321a542aebe4.png

    Virtual Hosts管理

    Virtual Hosts的主要目的就是隔离、分类,可以理解为电脑文件夹,不同的文件进行归类存放到对应的文件夹中,还可以对其进行设置相关的权限,这样就可以让不同的用户访问到不同的队列、交换机,互不影响。

    dcaa8adf61daa3c94d5dfc0833763fb5.png

    创建好的虚拟主机点击名字进详情,还能配置对应的权限。

    FeatureFlags、Policies、Limits、Cluster是一些信息显示和额外配置,这里先不截图,后续用到的时候再细说。

2.3 角色分类细说

关于用户角色,RabbitMQ已经内置了几个,在创建用户时可以进行选择,如下图:

0da7653a744b224aa94a714bc45d222f.png

为了演示方便,针对每种角色创建对应的用户,如下:

0378b58c994702aabfebc409f8578e01.png

每个角色对应的权限说明如下:

  • Admin(Administrator)

    最高管理权限,可以查看所有信息并进行相关资源的管理,如:创建和删除Virtual Host、创建和删除用户、创建permmission、关闭所有用户的连接。

    上面的截图就是管理员的操作界面,这里就不重复截图了。

  • Monitoring

    可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等),可以管理对应的交换机和队列。

    在管理页面只能查看策略,其他不能查看和管理:

    93d904613543f0d13fa6a477883a66ea.png

    其实Limits也不能配置,提示不是管理员权限:

    1ebe9b9f0cff1b442ceb272de1df0e89.png
  • Policymaker

    可登陆管理控制台,但无法查看节点的相关信息,主要是进行策略的管理,同时也可以管理自己的交换机、队列;

    94937e4ca8bc991ee0951c60d4e5ad20.png
  • Management

    可登陆管理控制台,无法看到节点相关的信息,能管理自己相关的交换机、队列等,无法对策略进行管理,其实可以理解为针对个人管理的权限。

    7fe76af5b1df56e2a824efe24ac1ee15.png
  • Impersonator

    模拟角色,无法登陆管理控制台

    3aa32a188a34de5fcb7df3c5ffe9fb6b.png
  • None

    不设置角色,无法登陆管理控制台,通常就是普通的生产者和消费者;

    6b7a16f7d83072f44a7bc29fccee7cfc.png

最后汇总为一张图,权限从低到高,如下:

675644c05bfbfe59cc14551a6a759989.png

3. 命令行工具

如果没有安装管理界面插件,或者说不喜欢用界面操作,也是可以用命令行工具完成界面的上相关操作的。RabbitMQ提供了如下命令行工具:

  • rabbitmqctl:用于服务管理和一般操作员任务;

  • rabbitmq-diagnostics:用于诊断和健康检查;

  • rabbitmq-plugins:用于插件管理;

  • rabbitmq-queues:用于队列上的维护任务,特别是仲裁队列;

  • rabbitmq-upgrade:用于与升级相关的维护任务;

这里是将RabbitMQ以容器的方式启动,所以进入容器可执行命令,以rabbitmqctl为例演示:

增加用户,执行如下命令:

dac23c2c2ee5d77d553fa87c93fc2a0a.png
rabbitmqctl add_user codezyq zyq123456

新增成功,但还没设置权限,通过界面也可以看到没有设置对应的权限:

59f2adb7a86de7f4ccdf971edaec18d3.png

设置权限,如下:

rabbitmqctl set_user_tags codezyq administrator

执行命令很简单,上面只是演示,命令行工具功能可以实现管理界面的相关功能,小伙伴根据需要执行相关命令即可。

命令的功能解释进入官网有详解:https://www.rabbitmq.com/rabbitmqctl.8.html

总结

关于RabbitMQ安装和理论先说这么多,减少一些概念、名词的纠结。控制篇幅,小伙伴们上WC的时间就能看完~~~;

下一篇聊聊交换机的各种模式,一起通过界面和代码的方式进行实践。关注“Code综艺圈”,和我一起学习吧。

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

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

相关文章

【Java】五种常见排序之-----------冒泡排序

冒泡排序: 原理: 将关键字较小的值不断地上浮,将关键字值较大的不断下沉;时间复杂度:O(n^2)空间复杂度:最优(即已经排好序)为0,平均空间复杂度为O(1);核心代码:for(int i…

混战的低代码江湖,如何区分「李逵」和「李鬼」?

作者:APICloud 创始人刘鑫 这两年,无论是资本层面,还是企业IT部门的关注,“低代码”都是绝对的热点。互联网圈也似在一夜之间冒出了各种各样的低代码公司。 到底什么是低代码?低代码是新技术么?低代码开发能…

关于捕获键盘信息的processDialogkey方法2--具体应用

自定义控件里的keydown方法无法捕获所有的按键消息的处理方法1(自定义控件里的keydown方法无法获取的键值如上下左右键等) 处理办法具体如下: 1、首先在自定义控件UserControl1中重写ProcessDialogKey方法 自定义控件UserControl1中重写Proce…

指针

指针 题目一: 计算两数的和与差 本题要求实现一个计算输入的两数的和与差的简单函数。 函数接口定义: void sum_diff( float op1, float op2, float psum, float pdiff ); 其中op1和op2是输入的两个实数,psum和pdiff是计算得出的和与差。 裁判…

【MapGIS精品教程】006:MapGIS根据经纬度计算各比例尺图幅编号

己知某点的经纬度或图幅西南图廓点的经纬度,计算该点所在图幅号。 例题一:某点的经度为11433′45″,纬度为3922′30″,计算所在1:250000图幅的编号。 文章目录 1. 公式计算编号的方法2. 软件计算编号的方法1. 公式计算编号的方法 求解过程: 第一步,利用下列公式计算其所…

分析完百年飞机空难数据,我发现了这几条“保命”小秘诀

来 源|Giao数据 数 据 | YaJie 文 章 | 张子豪,YaJie 本文爬取了飞机失事网1908-2020年空难相关数据,包括空难发生次数、机组和乘客的死亡人数与死亡率、不同季节的空难发生次数、空难相关文本的关键词、空难高发地、空难高发航空公司、空难高发机型以…

用 QuestPDF操作生成PDF更快更高效!

QuestPDFQuestPDF是一个开源的工具库,可以在.NET或者.Net Core中生成pdf文档它提供了一个布局引擎,设计时考虑到了完整的分页支持以及灵活性要求!比市面上常见的Aspose和iTextSharp好用太多了!GitHub地址安装Install-Package Ques…

ASP.NET vs MVC vs WebForms

许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上ASP.NET是创建WEB应用的框架而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系,所以可以称之为ASP.NET MVC。 我们可将原来的ASP.NET称为…

在Blazor 中自定义权限验证

Blazor是什么Blazor 是微软在 .NET 里推出的一个 WEB 客户端 UI 交互的框架,使用 Blazor 你可以代替 JavaScript 来实现自己的页面交互逻辑,可以很大程度上进行 C# 代码的复用,Blazor 对于 .NET 开发人员来说是一个不错的选择。需求背景其实我…

【ArcGIS微课1000例】0035:地图面状符号设计教程

地图符号是表示地图内容的基本手段,它由形状不同、大小不一、色彩有别的图形和文字组成。 地图符号是地图的语言,是一种图形语言。它与文字语言相比较,最大的特点是形象直观,一目了然。 本文讲解ArcGIS中面状符号设计方法。 文章目录 一、新建符号样式二、面状符号设计1. 斜…

MySQL夺命15问,你能坚持到第几问?

前言 MySQL在面试中经常被问到,本文总结了面试中的经典问题。 1. 数据库三大范式是什么? 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部…

ios元素定位

原文地址http://www.cnblogs.com/meitian/p/7373460.html 第一种:通过Appium1.6的Inspector来查看 具体安装方式前面的随笔已经介绍了:http://www.cnblogs.com/meitian/p/7360017.html可以通过定位找到元素xpath或name个人不推荐用这个方法,实…

使用 LSM-Tree 思想基于.NET 6.0 C# 写个 KV 数据库(案例版)

文章有点长,耐心看完应该可以懂实际原理到底是啥子。这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期。当然,这个其实也算是NoSQL的雏形&#xff0c…

35.使用拦截器实现权限验证

转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 为了说明此问题,我们建立struts2auth项目,流程图如下: 简短说明:当我们访问main.jsp页面,并试图通过此页面中的链接地址:not…

如何保证缓存和数据库的一致性?

1. 问题分析 2. Cache-Aside 2.1 读缓存 2.2 写缓存 2.3 延迟双删 2.4 如何确保原子性 3. Read-Through/Write-Through 3.1 Read-Through 3.2 Write-Through 4. Write Behind 很多小伙伴在面试的时候,应该都遇到过类似的问题,如何确保缓存和数据库…

Pressed状态和clickable,duplicateParentState的关系

做Android开发的人都用过Selector,可以方便的实现View在不同状态下的背景。不过,相信大部分开发者遇到过和我一样的问题,本文会从源码角度,解释这些问题。 首先,这里简单描述一下,我遇到的问题: 界面上有个…

【招聘(南京)】 慧咨环球南京研发中心 .NET和Blazor 前端

主要的亮点快速增长的、产品导向型的全球性科技公司设计和开发市场领先的软件解决方案WLB — 工作生活相平衡澳洲排名前五的软件公司混合办公 — 3天在家办公,2天在办公室办公在C#和.NET开发,企业级系统研发,软件工程方面有长期的优秀实践和技…

用Python+Django在Eclipse环境下开发web网站【转】

一、创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置。也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集,包含了数据库配置、Django详细选项设置和应用 特性配置,具体操作步骤如下所示。 1.新建Djan…

[转]数据结构KMP算法配图详解(超详细)

KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本…

BGP-MED-2

BGP-MED-2如图:当AS100去往AS300的60、10的网络时,60走R3,10走R1!使用MED属性影响选路! R2的配置 bgp 200peer 1.1.1.1 as-number 100 peer 1.1.1.1 ebgp-max-hop 255 peer 1.1.1.1 connect-interface LoopBack0peer 4.4.4.4 as-n…