rabbitmq细说之开篇(代码片段)

dotNET跨平台 dotNET跨平台     2022-12-07     692

关键词:

前言

关于消息中间件的应用场景,小伙伴们应该都耳熟能详了吧,比如经常提到的削峰填谷、分布式事务、异步业务处理、大数据分析等等,分布式消息队列成为其中比较关键的桥梁,也就意味着小伙伴们得掌握相关技能;当下相对比较热门的消息中间件有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综艺圈”,和我一起学习吧。

docker下rabbitmq四部曲之三:细说java开发

欢迎访问我的GitHub本文是《Docker下RabbitMQ四部曲》系列的第三篇,实战两个基于SpringBoot的工程,分别用来生产和消费RabbitMQ消息;前文链接前两章的内容是体验RabbitMQ服务,以及制作RabbitMQ镜像:《Docker下RabbitMQ四部曲之一:极速... 查看详情

ddd简明入门之道-开篇(代码片段)

DDD简明入门之道-开篇犹豫了很久才写下此文,一怕自己对DDD的理解和实践方式有偏差,二怕误人子弟被贻笑大方,所以纰漏之处还望各位谅解。不啰嗦,马上进入正题,如果你觉得此文不错就点个赞吧。概述“Domain-DrivenDesign领... 查看详情

springmvc之requestmappinghandlermapping开篇(代码片段)

这一段时间工作比较忙,自己也变得懒惰了一些,回头看看博客已经有半年多没有更新了。还是要让自己保持一颗不断学习的心的,就以SpringMVC的RequestMappingHandlerMapping的分析作为新的开始吧,本文所用的SpringMVC版... 查看详情

modbus家族之开篇(代码片段)

写在前面:本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。目录历史溯源发展史... 查看详情

zynq之嵌入式学习----开篇实验helloworld(代码片段)

1ZYNQ嵌入式系统的开篇实验HelloWorld阅读本文需先学习:FPGA学习----Vivado软件使用1.1ZYNQ嵌入式系统开发流程创建Vivado工程使用IPIntegrator创建ProcessorSystem生成顶层HDL生成比特流,导出到SDK在SDK中创建应用工程板级验证开篇实验任务... 查看详情

canvas开篇之drawbitmap方法讲解(代码片段)

我正在参加CSDN2015博客之星评选感恩分享活动,如果觉得文章还不错,请投个票鼓励下吧:http://vote.blog.csdn.net/blogstar2015/candidate?username=tianjian4592尊重原创,欢迎转载,转载请注明:FROM GA_studio  http:// 查看详情

zynq之hls学习----开篇实验(代码片段)

1VivadoHLS简介Xilinx推出的VivadoHLS工具可以直接使用C、C++或SystemC来对Xilinx系列的FPGA进行编程FPGA设计中从底层向上一共存在着四种抽象层级,依次为:结构性的、RTL、行为性的和高层VivadoHLS的功能简单地来说就是把C、... 查看详情

springboot+rabbitmq之消费端配置(代码片段)

Chapter1直接上代码:@Slf4j@ComponentpublicclassUserSettlementConsumer@RabbitHandler@RabbitListener(queues="$spring.rabbitmq.mq-name")publicvoidtestListener(Stringmsg)log.info("消息出队:"+msg); 可以看出来, 查看详情

rabbitmq基础教程之基本使用篇(代码片段)

RabbitMQ基础教程之基本使用篇最近因为工作原因使用到RabbitMQ,之前也接触过其他的mq消息中间件,从实际使用感觉来看,却不太一样,正好趁着周末,可以好好看一下RabbitMQ的相关知识点;希望可以通过一些学习,可以搞清楚以... 查看详情

云原生之docker实战使用docker部署rabbitmq集群(代码片段)

【云原生之Docker实战】使用Docker部署Rabbitmq集群一、Rabbitmq介绍1.Rabbitmq简介2.Rabbitmq特点3.Rabbitmq的工作机制二、检查本地dokcer状态1.检查docker版本2.查看docker状态3.查看docker信息三、创建容器前准备工作1.创建数据卷2.创建网络3.查... 查看详情

细说多线程之thread与runnable(代码片段)

1:创建线程的两种方式:继承Thread类 publicclassMyThreadextendsThread@Override publicvoidrun() MyThreadmt1=newMyThread();mt1.start(); 实现Runnable接口publicclassMyThreadimplementsRunnable @Override publicvoidrun() MyThreadmt=newMyThread();Threadth1=newThread(mt);th1.start()... 查看详情

rabbitmq学习:rabbitmq之扇形交换机主题交换机(代码片段)

 前言上篇我们学习了rabbitmq的作用以及直连交换机的代码实现,这篇我们继续看如何用代码实现扇形交换机和主题交换机一、扇形交换机  1.生产者  /***生产者*/publicclassLogProducer//交换机名称publicfinalstaticStringEXCHANGE_NAME="... 查看详情

rabbitmq之topic交换器模式下开发(代码片段)

Topic交换器,即主题模式,进行规则匹配。一、Provider配置文件1spring.application.name=provider2spring.rabbitmq.host=192.168.50.303spring.rabbitmq.port=56724spring.rabbitmq.username=rabbit5spring.rabbitmq.password=rabbit6#设置交换 查看详情

docker小白到实战之开篇概述(代码片段)

前言“不对啊,在我这运行很正常啊”,这句话小伙伴们在前几年应该听得很多;每次一到安装、部署时总有一堆问题,毕竟操作系统版本、软件环境、硬件资源、网络等因素在作怪,此时难免会导致开发小... 查看详情

rabbitmq之死信队列(代码片段)

...者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-analysis-of-dlx/DLX,Dead-Letter-Exchange。利... 查看详情

-rabbitmq之spring客户端源码(代码片段)

目录第十章-RabbitMQ之Spring客户端源码        1.前言2.客户端消费代码2.1消费的实现方式2.2消费中注解解释2.3 推测Spring实现过程3.MQ消费源码分析3.1 集成SpringBoot启动过程3.2Broker投递消息给客户端过程3.3客户端消费过程4.总结... 查看详情

转消息队列之rabbitmq(代码片段)

转https://www.jianshu.com/p/79ca08116d57 消息队列之RabbitMQ预流2017.05.0616:03*字数4884阅读80990评论18喜欢236赞赏1关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型... 查看详情

rabbitmq之惰性队列(lazyqueue)(代码片段)

...者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-analysis-of-lazy-queue/RabbitMQ从3.6.0版本... 查看详情