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实现,主要组成部分及流程如下:
上图简介:
生产者负责将消息投递到服务器中,消费者负责订阅接收消息,然后进行对应的业务处理。经过的核心组成部分如下:
生产者(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的管理页面,如下:
输入安装时设置的用户名和密码就可以登录到管理主界面了。
2.2 界面初识
首页概览
首页会展示一些整体信息,包括消息、节点等相关信息。
连接(Connections)情况
对于Connections和Channels而言,默认安装完是没有的,这里为了展示全一点的信息,搞了个客户端连上,在后续的代码实战中我们会好好仔细说说。
点击队列名称可以进入连接详情,如果对应的用户有权限,可以强制关掉对应的连接。
Channels情况
Channel是基于Connection的,一个Connection中可以创建多个Channel,提高传输效率。
交换机(Exchangs)管理
交换机主要用来进行转发消息,可以只设置模式,将消息投递到队列中。
里面的具体参数信息,后续会在实际演示情况的时候一一说到。
队列(Queues)管理
队列就是为存储消息并将其转发给消费者。
点击队列进入详情页面,可以绑定交换机等操作,如下:
用户/权限/虚拟主机(Virtual Host)等管理
用户管理
针对不同的使用场景添加不同的用户,并设置对应的权限。
Virtual Hosts管理
Virtual Hosts的主要目的就是隔离、分类,可以理解为电脑文件夹,不同的文件进行归类存放到对应的文件夹中,还可以对其进行设置相关的权限,这样就可以让不同的用户访问到不同的队列、交换机,互不影响。
创建好的虚拟主机点击名字进详情,还能配置对应的权限。
FeatureFlags、Policies、Limits、Cluster是一些信息显示和额外配置,这里先不截图,后续用到的时候再细说。
2.3 角色分类细说
关于用户角色,RabbitMQ已经内置了几个,在创建用户时可以进行选择,如下图:
为了演示方便,针对每种角色创建对应的用户,如下:
每个角色对应的权限说明如下:
Admin(Administrator)
最高管理权限,可以查看所有信息并进行相关资源的管理,如:创建和删除Virtual Host、创建和删除用户、创建permmission、关闭所有用户的连接。
上面的截图就是管理员的操作界面,这里就不重复截图了。
Monitoring
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等),可以管理对应的交换机和队列。
在管理页面只能查看策略,其他不能查看和管理:
其实Limits也不能配置,提示不是管理员权限:
Policymaker
可登陆管理控制台,但无法查看节点的相关信息,主要是进行策略的管理,同时也可以管理自己的交换机、队列;
Management
可登陆管理控制台,无法看到节点相关的信息,能管理自己相关的交换机、队列等,无法对策略进行管理,其实可以理解为针对个人管理的权限。
Impersonator
模拟角色,无法登陆管理控制台
None
不设置角色,无法登陆管理控制台,通常就是普通的生产者和消费者;
最后汇总为一张图,权限从低到高,如下:
3. 命令行工具
如果没有安装管理界面插件,或者说不喜欢用界面操作,也是可以用命令行工具完成界面的上相关操作的。RabbitMQ提供了如下命令行工具:
- rabbitmqctl:用于服务管理和一般操作员任务;
- rabbitmq-diagnostics:用于诊断和健康检查;
- rabbitmq-plugins:用于插件管理;
- rabbitmq-queues:用于队列上的维护任务,特别是仲裁队列;
- rabbitmq-upgrade:用于与升级相关的维护任务;
这里是将RabbitMQ以容器的方式启动,所以进入容器可执行命令,以rabbitmqctl为例演示:
增加用户,执行如下命令:
rabbitmqctl add_user codezyq zyq123456
新增成功,但还没设置权限,通过界面也可以看到没有设置对应的权限:
设置权限,如下:
rabbitmqctl set_user_tags codezyq administrator
执行命令很简单,上面只是演示,命令行工具功能可以实现管理界面的相关功能,小伙伴根据需要执行相关命令即可。
命令的功能解释进入官网有详解:https://www.rabbitmq.com/rabbitmqctl.8.html
总结
关于RabbitMQ安装和理论先说这么多,减少一些概念、名词的纠结。控制篇幅,小伙伴们上WC的时间就能看完~~~;
下一篇聊聊交换机的各种模式,一起通过界面和代码的方式进行实践。关注“Code综艺圈”,和我一起学习吧。
RabbitMQ细说之开篇的更多相关文章
- 【消息中间件之RabbitMQ学习】-开篇-001
写在前面的话 项目中因为要用到消息中间件,当初极力推荐RabbitMq.但因为种种原因,最终选型为java+mongodb自实现一套分布式的消.没有用RabbitMq工作过,实属遗憾.因为个人来说实在 ...
- RabbitMQ~开篇与环境部署
想写这篇文章很久了,今天终于有时间总结一下,一个大型的系统里,消息中间件是必不可少的,它将并发环境处理的数据异步进行处理,有效的提高了系统的并发能力,有很多系统的瓶颈点都在于此,而消息中间件在这个时候 ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- iOS应用架构谈 开篇
iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 动态部署方案 iOS应用架构谈 本地持久化方案 缘由 之前安居客iOS app的第二版架构大部分内容是 ...
- 转:RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- rabbitmq+haproxy+keepalived实现高可用集群搭建
项目需要搭建rabbitmq的高可用集群,最近在学习搭建过程,在这里记录下可以跟大家一起互相交流(这里只是记录了学习之后自己的搭建过程,许多原理的东西没有细说). 搭建环境 CentOS7 64位 R ...
- iOS应用架构谈 开篇 (转)
iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 动态部署方案 iOS应用架构谈 本地持久化方案 缘由 之前安居客iOS ap ...
- RabbitMQ安装与初始配置
[TOC] 本文只讨论linux下的Rabbitmq安装. Erlang安装 rabbitmq依赖于Erlang,需先安装,推荐安装rabbitmq/erlang-rpm: #clone源码 git ...
- 学习在.NET Core中使用RabbitMQ进行消息传递之持久化(二)
前言 上一节我们简单介绍了RabbitMQ和在安装后启动所出现的问题,本节我们开始正式进入RabbitMQ的学习,对于基本概念请从官网或者其他前辈博客上查阅,我这里不介绍基础性东西,只会简单提一下,请 ...
随机推荐
- Flask01 第一个flask项目
参考地址:https://github.com/miguelgrinberg/microblog/tree/v0.1 flask环境[苹果M1] 添加虚拟环境 python3 -m venv venv ...
- unity---角色控制器控制角色移动
获取对象 public CharacterController cc; cc=gameObject.GetComponent<CharacterController>(); if(Inpu ...
- 自动化测试报告(allure/html)
pytest有两种生成测试报告的方法(html和allure),今天就给大家一一介绍下 html 一.pytest-html基本语法 1.安装:pip install pytest-html 2.查看 ...
- 每天一个 HTTP 状态码 100
100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:指示客户端应该继续当前请求:如果请求已经完成,客户端可以忽略该响应. 常用于服务器已经接受了请求头,客户端应该继续 ...
- MongoDB 安全认证
每日一句 Sometimes your whole life boils down to one insane move. 人一生中出人头地的机会不多,一旦有了一定要抓住! 概述 默认情况下,Mong ...
- Similarity calculation
推荐算法入门(相似度计算方法大全) 一.协同过滤算法简介 在推荐系统的众多方法之中,基于用户的协同过滤是诞最早的,原理也比较简单.基于协同过滤的推荐算法被广泛的运用在推荐系统中,比如影视推荐.猜你喜欢 ...
- net core天马行空系列-可用于依赖注入的,数据库表和c#实体类互相转换的接口实现
1.前言 hi,大家好,我是三合.作为一名程序猿,日常开发中,我们在接到需求以后,一般都会先构思一个模型,然后根据模型写实体类,写完实体类后在数据库里建表,接着进行增删改查, 也有第二种情况,就是有些 ...
- Kubernetes将弃用Docker!与 containerd容器引擎
时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...
- 上线项目之局域网上线软件使用-----phpStudy
上面的图片是phpStudy的软件截图.那么你在哪里会下到呢?链接: https://pan.baidu.com/s/1lvX9jY_K6gGkMOqo76p4nA 提取码: h1it 复制这段内容后 ...
- 全新升级的AOP框架Dora.Interception[4]: 基于Lambda表达式的拦截器注册方式
如果拦截器应用的目标类型是由自己定义的,Dora.Interception(github地址,觉得不错不妨给一颗星)可以在其类型或成员上标注InterceptorAttribute特性来应用对应的拦截 ...