【学相伴飞哥】RabbitMQ 2021-03-14 笔记1:中间件,单体分布式架构,协议,AMQP,MQTT,分发策略,高可用机制,RabbitMQ 安装和docker安装配置,角色,工作模式,入门

什么是中间件

  • 原文:

https://www.kuangstudy.com/zl/rabbitmq#1366029180994654209

我国企业从20世纪80年代开始就逐渐进行信息化建设,由于方法和体系的不成熟,以及企业业务和市场需求的不断变化,一个企业可能同时运行着多个不同的业务系统,这些系统可能基于不同的操作系统、不同的数据库、异构的网络环境。现在的问题是,如何把这些信息系统结合成一个有机地协同工作的整体,真正实现企业跨平台、分布式应用。中间件便是解决之道,它用自己的复杂换取了企业应用的简单。

1,中间件(Middleware )是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件=平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。

  • Mysql 遵循 TCP协议

    • 通讯
    • 高可用
    • 持久性
  • MQ

  • Redis

  • Nginx

举例:
1,RMI (Remote Method Invocations,远程调用)

4、在项目中什么时候使用中间件技术
在项目的架构和重构中,使用任何技术和架构的改变我们都需要谨慎斟酌和思考,因为任何技术的融入和变化都可能人员,技术,和成本的增加,中间件的技术一般现在一些互联网公司或者项目中使用比较多,如果你仅仅还只是一个初创公司建议还是使用单体架构,最多加个缓存中间件即可,不要盲目追求新或者所谓的高性能,而追求的背后一定是业务的驱动和项目的驱动,因为一旦追求就意味着你的学习成本,公司的人员结构以及服务器成本,维护和运维的成本都会增加,所以需要谨慎选择和考虑。
但是作为一个开放人员,一定要有学习中间件技术的能力和思维,否则很容易当项目发展到一个阶段在去掌握估计或者在面试中提及,就会给自己带来不小的困扰,在当今这个时代这些技术也并不是什么新鲜的东西,如果去掌握和挖掘最关键的还是自己花时间和花精力去探讨和研究。

有哪些

1.分布式消息中间件

  • ActiveMQ 遵循JMS规范,AMQP,Java开发,比较老。

    • Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,
  • RabbitMQ 分发持久化比较完善,流行。和Spring 同一家。

  • Kafka 高性能,tcp/ip 二进制,接近底层 性能最高。不支持事务。

    • 支持持久化 和 分发机制。
    • Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写
  • RocketMQ 阿里 滴滴 国产消息队列

    • 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会
  • 场景

    • 消息中间件监控数据
    • 异步数据传输场泉
    • 削峰填谷
    • 任务调度场景
    • 海量数据同步场景
    • 分布式事务场景
    • 日记管理场景
    • 大数据分析场景

遵循的:

  • AMQP:tcp/ip上增加了规范
  • MQTT
  • 持久化设计
  • Kafka协议
  • 消息分发设计
  • 高可用设计
  • 可靠性设计
  • 容错设计
  1. 负载均衡中间件
  • Nginx
  • LVS负载均衡软件 :对Nginx集群
  • KeepAlive 保持心跳
  • CDN :加速

3.缓存中间件

  • MemCache:内存级缓存
  • Redis

4.数据库中间件

  • Mycat
  • ShardingJdbc

案例分析

  • 异步数据保存
  • 订单数教据的背息分
  • 分布式事务
  • 消息的容错
  • 分布式锁
  • 分布式会话
  • 分库分表

学习目标
·什么是消息中间件

·什么是协议

·什么是持久化

消息分发

消息的高可用

·消息的集群

消息的容错

消息的冗余

架构

单体架构

在企业开发的中,大部分的初期架构都采用的是单体架构的模式进行架构,而这种架构的典型的特点:就是把所有的业务和模块,源代码,静态资源文件等都放在一个一工程中,如果其中的一个模块升级或者迭代发生一个很小变动都会重新编译和重新部署项目。这种的架构存在的问题就是:
1∶耦合度太高
2:运维的成本过高3∶不易维护
4:服务器的成本高
5:以及升级架构的复杂度也会增大这样就有后续的分布式架构系统。如下

分布式系统

何谓分布式系统呢:
通俗一点:就是一个请求由服务器端的多个服务(服务或者系统)协同处理完成
和单体架构不同的是,单体架构是一个请求发起jvm调度线程(确切的是tomcat线程池)分配线程Thread来处理请求直到释放,而分布式是系统是:一个请求是由多个系统共同来协同完成,jvm和环境都可能是独立。如果生活中的比喻的话,单体架构就想建设一个小房子很快就能够搞定,如果你要建设一个鸟巢或者大型的建筑,你就必须是各个环节的协同和分布,这样目的也是项目发展都后期的时候要去部署和思考的问题。我们也不能看出来:分布式架构系统存在的特点和问题如下:

存在问题
1:学习成本高,技术栈过多2:运维成本和服务器成本增高3:人员的成本也会增高
4:项目的负载度也会上升
5:面临的错误和容错性也会成倍增加
6:占用的服务器端口和通讯的选择的成本高
7∶安全性的考虑和因素逼迫可能选择RMI/MQ相关的服务器端通讯。

好处
1∶服务系统的独立,占用的服务器资源减少和占用的硬件成本减少,确切的说是:可以合理的分配服务资源,不造成服务器资源的浪费2:系统的独立维护和部署,耦合度降低,可插拔性。
3:系统的架构和技术栈的选择可以变的灵活(而不是单纯的选择java)

4:弹性的部署,不会造成平台因部署造成的瘫痪和停服的状态。

消息中间件

消息中间件的是
1:利用可靠的消息传递机制进行系统和系统直接的通讯
2:通过提供消息传递和消息的排队机制,它可认在分布式系统环境下扩展进程间的通讯。

应用场景

02、消息中间件应用的场景
1:跨系统数据传递
2:高并发的流量削峰
3:数据的分发和异步处理
4:大数据分析与传递
5:分布式事务
比如你有一个数据要进行迁移或者请求并发过多的时候,比如你有10W的并发请求下订单,我们可以在这些订单入库之前,我们可以把订单请求堆积到消息队列中,让它稳健可靠的入库和执行。

本质 设计 和 核心

04、消息中间件的本质及设计
它是一种接受数据,接受请求、存储数据、发送数据等功能的技术服务。

MQ消息队列:负责数据的传接受,存储和传递,所以性能要过于普通服务和技术。

  • 在 TCP/IP 基础之上,重新构建的协议:
    • AMQP

05、消息中间件的核心组成部分
1:消息的协议
2:消息的持久化机制
3:消息的分发策略
4:消息的高可用,高可靠
5:消息的容错机制

消息队列协议

01、什么是协议

我们知道消息中间件负责数据的传递,存储,和分发消费三个部分,数据的存储和分发的过程中肯定要遵循某种约定成俗的规范,你是采用底层的TCP/IP,UDP协议还是其他的自己取构建等,而这些约定成俗的规范就称之为:协议。

02、网络协议的三要素

1.语法。语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
2.语义。语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
3.时序。时序是对事件发生顺序的详细说明。

1:语法:http规定了请求报文和响应报文的格式。
2:语义:客户端主动发起请求称之为请求。(这是一种定义,同时你发起的是post/get请求)
3:时序:一个请求对应一个响应。(一定先有请求在有响应,这个是时序)

面试题:为什么消息中间件不直接使用http协议呢?
1: 因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速。
2:大部分情况下http大部分都是短链接,在实际的交互过程中,一个请求到响应很有可能会中断,中断以后就不会就行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息就行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行。

而消息中间件采用的并不是http协议,而常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka,OpenMessage协议。

03:AMQP协议

AMQP:(全称:Advanced Message Queuing Protocol) 是高级消息队列协议。由摩根大通集团联合其他公司共同设计。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

  • 和 Spring 同一个公司。Erlang 底层是 C

特性:
1:分布式事务支持。
2:消息的持久化支持。
3:高性能和高可靠的消息处理优势。

AMQP协议的支持者:

  • rabbitMq 和 ActiveMQ
    • RabbitMq 默认端口 5672
      • 打开MQTT 大概为:1883端口。

04:MQTT协议

MQTT协议:(Message Queueing Telemetry Transport)消息队列是IBM开放的一个即时通讯协议,物联网系统架构中的重要组成部分。
特点:
1:轻量
2:结构简单
3:传输快,不支持事务
4:没有持久化设计。
应用场景:
1:适用于计算能力有限
2:低带宽
3:网络不稳定的场景。
支持者:

  • rabbitMq 和 ActiveMQ 一样

05、OpenMessage协议

是近几年由阿里、雅虎和滴滴出行、Stremalio等公司共同参与创立的分布式消息中间件、流处理等领域的应用开发标准。
特点:
1:结构简单
2:解析速度快
3:支持事务和持久化设计。

06、Kafka协议

Kafka协议是基于TCP/IP的二进制协议。消息内部是通过长度来分割,由一些基本数据类型组成。
特点是:
1:结构简单
2:解析速度快(最快,接近底层)
3:无事务支持
4:有持久化设计

07、小结

协议:是在tcp/ip协议基础之上构建的一种约定成俗的规范和机制、它的主要目的可以让客户端(应用程序 java,go)进行沟通和通讯。并且这种协议下规范必须具有持久性,高可用,高可靠的性能。

消息的分发策略

01、消息的分发策略

MQ消息队列有如下几个角色
1:生产者
2:存储消息
3:消费者
那么生产者生成消息以后,MQ进行存储,消费者是如何获取消息的呢?一般获取数据的方式无外乎推(push)或者拉(pull)两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推机制策略。

04、消息分发策略的机制和对比

ActiveMQRabbitMQKafkaRocketMQ
发布订阅(每个订阅都会收到)支持支持支持支持
轮询分发支持支持支持/
公平分发/支持支持/
重发支持支持/支持
消息拉取/支持支持支持
  • 发布订阅,100个消息,每个订阅者都会收到100个。
  • 轮询分发,3个订阅者,不论服务器性能。每个人收到33条。
    • 轮询分发,可以自动应答。
  • 公平分发。根据服务器的性能。性能好的 分发的多。
    • 能者多劳。公平分发,要手动应答。
    • 轮询和公平,只要任一 一个消费者消费。这个消息就结束了,不会发给他人了。
  • 消息拉取不常用。被动的拉取机制。使用 RPC

消息队列高可用和高可靠

01、什么是高可用机制

所谓高可用:是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力。
当业务量增加时,请求也过大,一台消息中间件服务器的会触及硬件(CPU,内存,磁盘)的极限,一台消息服务器你已经无法满足业务的需求,所以消息中间件必须支持集群部署。来达到高可用的目的。

02、集群模式1 - Master-slave主从共享数据的部署方式

解说:生产者讲消费发送到Master节点,所有的都连接这个消息队列共享这块数据区域,Master节点负责写入,一旦Master挂掉,slave节点继续服务。从而形成高可用,

  • Master 挂了,没法写入了。

03、集群模式2 - Master- slave主从同步部署方式

解释:这种模式写入消息同样在Master主节点上,但是主节点会同步数据到slave节点形成副本,和zookeeper或者redis主从机制很类同。这样可以达到负载均衡的效果,如果消费者有多个这样就可以去不同的节点就行消费,以为消息的拷贝和同步会暂用很大的带宽和网络资源。在后续的rabbtmq中会有使用。

img

04、集群模式3 - 多主集群同步部署模式

解释:和上面的区别不是特别的大,但是它的写入可以往任意节点去写入。

img

05、集群模式4 - 多主集群转发部署模式

  • 提取除了元数据,当前节点没有,去询问其他节点。

解释:如果你插入的数据是broker-1中,元数据信息会存储数据的相关描述和记录存放的位置(队列)。
它会对描述信息也就是元数据信息就行同步,如果消费者在broker-2中进行消费,发现自己几点没有对应的消息,可以从对应的元数据信息中去查询,然后返回对应的消息信息,场景:比如买火车票或者黄牛买演唱会门票,比如第一个黄牛有顾客说要买的演唱会门票,但是没有但是他会去联系其他的黄牛询问,如果有就返回。

img

06、集群模式5 Master-slave与Breoker-cluster组合的方案

  • 主从模式+负载均衡 集群

解释:实现多主多从的热备机制来完成消息的高可用以及数据的热备机制,在生产规模达到一定的阶段的时候,这种使用的频率比较高。

这么集群模式,具体在后续的课程中会进行一个分析和讲解。他们的最终目的都是为保证:消息服务器不会挂掉,出现了故障依然可以抱着消息服务继续使用。

总结为:

反正终归三句话:
1:要么消息共享,
2:要么消息同步
3:要么元数据共享

07、什么是高可靠机制

所谓高可用是指:是指系统可以无故障低持续运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正常运行,出错的几率极低,就称之为:高可靠。
在高并发的业务场景中,如果不能保证系统的高可靠,那造成的隐患和损失是非常严重的。
如何保证中间件消息的可靠性呢?可以从两个方面考虑:
1:消息的传输:通过协议来保证系统间数据解析的正确性。
2:消息的存储可靠:通过持久化来保证消息的可靠性。

RabbitMQ入门及安装

01、概述

官网:https://www.rabbitmq.com/
什么是RabbitMQ,官方给出来这样的解释:

翻译以后:
RabbitMQ是部署最广泛的开源消息代理。
RabbitMQ拥有成千上万的用户,是最受欢迎的开源消息代理之一。从T-Mobile 到Runtastic,RabbitMQ在全球范围内的小型初创企业和大型企业中都得到使用。
RabbitMQ轻巧,易于在内部和云中部署。它支持多种消息传递协议。RabbitMQ可以部署在分布式和联合配置中,以满足大规模,高可用性的要求。
RabbitMQ可在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发人员工具。

简单概述:
RabbitMQ是一个开源的遵循AMQP协议实现的基于Erlang语言编写,支持多种客户端(语言)。用于在分布式系统中存储消息,转发消息,具有高可用,高可扩性,易用性等特征。

02、安装RabbitMQ

1:下载地址:https://www.rabbitmq.com/download.html
2:环境准备:CentOS7.x+ / Erlang
RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,第一步就是安装Erlang。

  1. 05 Jan 2023RabbitMQ 3.11.6 2023年一月5日更新了:3.11.6。
  2. 14 Dec 2022 RabbitMQ 3.11.5 2022年12月14日更新了:3.11.5。

2021年3月2日,更新的是 3.8.14

  • 3.8.15 3.8.14 需要:Erlang/OTP 最低22.3 和 23.X

  • 3.11.0 — 3.11.6 需要:Erlang/OTP 最低:25.0,最高25.2

  • erlang-solutions-2.0-1.noarch.rpm

  • rabbitmq-server-3.8.13-1.el8.noarch.rpm

    • 最终我的docker安装的是:RabbitMQ 3.9.11 Erlang 24.2

erlang和RabbitMQ版本的按照比较: https://www.rabbitmq.com/which-erlang.html

03、 Erlang安装

查看系统版本号

[root@iZZ ~]# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 8.3.2011
Release:        8.3.2011
Codename:       n/a
3-1:安装下载

参考地址:https://www.erlang-solutions.com/downloads/

wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpmrpm -Uvh erlang-solutions-2.0-1.noarch.rpm
3-2:安装成功
yum install -y erlang
3-3:安装成功
erl -v

04、安装socat

yum install -y socat

05、安装rabbitmq

下载地址:https://www.rabbitmq.com/download.html

5-1:下载rabbitmq
> wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.13/rabbitmq-server-3.8.13-1.el8.noarch.rpm
> rpm -Uvh rabbitmq-server-3.8.13-1.el8.noarch.rpm
5-2:启动rabbitmq服务
# 启动服务
> systemctl start rabbitmq-server
# 查看服务状态
> systemctl status rabbitmq-server
# 停止服务
> systemctl stop rabbitmq-server

# 开机启动服务
> systemctl enable rabbitmq-server

06、RabbitMQ的配置

RabbitMQ默认情况下有一个配置文件,定义了RabbitMQ的相关配置信息,默认情况下能够满足日常的开发需求。如果需要修改需要,需要自己创建一个配置文件进行覆盖。
参考官网:
1:https://www.rabbitmq.com/documentation.html
2:https://www.rabbitmq.com/configure.html
3:https://www.rabbitmq.com/configure.html#config-items
4:https://github.com/rabbitmq/rabbitmq-server/blob/add-debug-messages-to-quorum_queue_SUITE/docs/rabbitmq.conf.example

06-1、相关端口

5672:RabbitMQ的通讯端口
25672:RabbitMQ的节点间的CLI通讯端口是
15672:RabbitMQ HTTP_API的端口,管理员用户才能访问,用于管理RabbitMQ,需要启动Management插件。

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

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

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

一定要注意:RabbitMQ 在安装完毕以后,会绑定一些端口,如果你购买的是阿里云或者腾讯云相关的服务器一定要在安全组中把对应的端口添加到防火墙。

安装教程2

教程:

https://blog.csdn.net/qq_44146008/article/details/126547064

erlang和RabbitMQ版本的按照比较: https://www.rabbitmq.com/which-erlang.html

我的下载el和mq

-- 下载的网站:https://packagecloud.io/rabbitmq/erlang
-- 这里安装了 24.3 的erlang。
el网站,第一个推荐的是  erlang-24.3.4.7-1.el8.x86_64.rpm	EL/8

wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/8/erlang-24.3.4.7-1.el8.x86_64.rpm/download.rpm?distro_version_id=205

-- 所以选择了 安装 mq-server为:3.10.13
mq下载的网址:https://packagecloud.io/rabbitmq/rabbitmq-server
-- 找到对应的下载:
rabbitmq-server-3.10.13-1.el8.noarch.rpm	EL/8

wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/8/rabbitmq-server-3.10.13-1.el8.noarch.rpm/download.rpm?distro_version_id=205

下载后安装

-- 安装 el
yum localinstall erlang-24.3.xxx.rpm

rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc

yum localinstall rabbitmq-server-3.10.7-1.el8.noarch.rpm
-- 老师使用的 rpm安装
-- rpm -Uvh rabbitmq-server-3.8.13-1.el8.noarch.rpm
-- 然后再安装
yum install rabbitmq-server -y

启动和配置

systemctl start rabbitmq-server
systemctl status rabbitmq-server -- 查看状态命令
systemctl restart rabbitmq-server

systemctl enable rabbitmq-server -- 开机自启

-- 安装web端的客户端插件,安装后重启服务
rabbitmq-plugins enable rabbitmq_management
-- 注意需要开放服务器15672端口
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
-- 远程访问一下 http://服务器ip:15672/

RabbitMQWeb管理界面及授权操作

rabbitmq-plugins enable rabbitmq_management

systemctl restart rabbitmq-server

说明:rabbitmq有一个默认账号和密码是:guest 默认情况只能在localhost本机下访问,所以需要添加一个远程登录的用户。

一定要记住,在对应服务器(阿里云,腾讯云等)的安全组中开放15672的端口。

http://ip:15672/ 如下:

02、授权账号和密码

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator

用户级别:

  • 1、administrator 可以登录控制台、查看所有信息、可以对rabbitmq进行管理
  • 2、monitoring 监控者 登录控制台,查看所有信息。管理自己,查看所有。
  • 3、policymaker 策略制定者 登录控制台,指定策略。管理自己。
  • 4、managment 普通管理员 登录控制台。查看自己。
monitor
n.
显示器,监控器;监视仪,监护仪;监督员,监察员;(学校里的)班长,级长;(电台的)监听员;扬声器;巨蜥;浅水重炮舰
v.
监视;监听(外国广播或电话);监控(无线电或电视传输信号)

monitoring
英
/ˈmɒnɪtərɪŋ/
n.
监视,[自]监控;检验,检查

policymaker
英
/ˈpɒləsimeɪkə(r)
n.
政策制定者;决策人

policy
n.
政策,方针;(处事) 原则,策略;保险单

maker
n.
制造者;造物主;出期票人;创客

manage
v.
管理,处理;操纵,控制;设法做到,勉力完成;腾出时间参加;凑合着活下去,支撑;调教(人或动物);竟搞得,竟做出

2-3:为用户添加资源权限

rabbitmqctl.bat set_permissions -p / admin ".*" ".*" ".*"
rabbitmqctl add_user 账号 密码

-- 设置用户分配操作权限
rabbitmqctl set_user_tags 账号 administrator

rabbitmqctl change_password Username Newpassword 修改密码

rabbitmqctl delete_user Username 删除用户
rabbitmqctl list_users 查看用户清单

-- 为用户设置administrator角色
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

RabbitMQ之Docker安装

01、Docker安装RabbitMQ

1-1、虚拟化容器技术—Docker的安装

(1)yum 包更新到最新
> yum update

(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
> yum install -y yum-utils device-mapper-persistent-data lvm2

(3)设置yum源为阿里云
> yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(4)安装docker
> yum install docker-ce -y

(5)安装后查看docker版本
> docker -v

 (6) 安装加速镜像
 sudo mkdir -p /etc/docker
 sudo tee /etc/docker/daemon.json <<-'EOF'
 {
  "registry-mirrors": ["https://0wrdwnn6.mirror.aliyuncs.com"]
 }
 EOF
 
 -- 重新载入,并重启
 sudo systemctl daemon-reload
 sudo systemctl restart docker

1-2、docker的相关命令

# 启动docker:
systemctl start docker
# 停止docker:
systemctl stop docker
# 重启docker:
systemctl restart docker
# 查看docker状态:
systemctl status docker


# 开机启动:  
systemctl enable docker
systemctl unenable docker


# 查看docker概要信息
docker info
# 查看docker帮助文档
docker --help

1-3、安装rabbitmq

参考网站:
1:https://www.rabbitmq.com/download.html
2:https://registry.hub.docker.com/_/rabbitmq/

1-4、获取rabbit镜像:

docker pull rabbitmq:management

1-5、创建并运行容器

docker run -di --name=myrabbit -p 15672:15672 rabbitmq:management

—hostname:指定容器主机名称
—name:指定容器名称
-p:将mq端口号映射到本地或者运行时设置用户和密码
docker run -di --name myrabbit -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
docker run -di 
--name myrabbit 
-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
docker logs -f myrabbit

1-6、容器运行正常

使用 http://你的IP地址:15672 访问rabbit控制台

02、额外Linux相关排查命令

> more xxx.log  查看日记信息
> netstat -naop | grep 5672 查看端口是否被占用
> ps -ef | grep 5672  查看进程
> systemctl stop 服务

docker start +容器的ID启动

01、RabbitMQ的角色分类

1:none:

  • 不能访问management plugin

2:management:查看自己相关节点信息

  • 列出自己可以通过AMQP登入的虚拟机
  • 查看自己的虚拟机节点 virtual hosts的queues,exchanges和bindings信息
  • 查看和关闭自己的channels和connections
  • 查看有关自己的虚拟机节点virtual hosts的统计信息。包括其他用户在这个节点virtual hosts中的活动信息。

3:Policymaker 查看和创建和删除自己

  • 包含management所有权限
  • 查看和创建和删除自己的virtual hosts所属的policies和parameters信息。

4:Monitoring 列出所有的

  • 包含management所有权限
  • 罗列出所有的virtual hosts,包括不能登录的virtual hosts。
  • 查看其他用户的connections和channels信息
  • 查看节点级别的数据如clustering和memory使用情况
  • 查看所有的virtual hosts的全局统计信息。

5:Administrator

  • 最高权限
  • 可以创建和删除virtual hosts
  • 可以查看,创建和删除users
  • 查看创建permisssions
  • 关闭所有用户的connections

RabbitMQ入门案例 - Simple 简单模式

7种工作模式

1 “Hello World!” 简单模式

  • The simplest thing that doessomething 简单模式,一个生产者,一个消费者

2 Work queues 工作队列模式

  • 轮询分发,公平分发。

3 Publish/Subscribe 发布订阅模式

  • exchange 交换机

4 Routing 路由模式

  • 发布订阅模式上,增加了 路由key,

5 Topics 主题模式

  • 增加了 模糊的路由Key
    • *代表一个。#代表多个。

6 RPC

7Publisher Confirms

入门说明

所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,只不过rabbitmq遵循的是amqp ip port

创建连接工程

创建连接connection

通过连接获取通道Channel

通过通创建交换机,声明队列,绑定关系,路由key ,发送消息,和接收消息

准备消息内容

发送消息给队列queue

关闭连接

关闭通道

declare
英
/dɪˈkleə(r)/
v.
宣布,声明;断言,宣称;申报;放弃击球,宣布结束赛局

01、实现步骤

1:jdk1.8
2:构建一个maven工程
3:导入rabbitmq的maven依赖
4:启动rabbitmq-server服务
5:定义生产者
6:定义消费者
7:观察消息的在rabbitmq-server服务中的过程

03、导入rabbitmq的maven依赖

03-1:Java原生依赖

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.10.0</version>
</dependency>

03-2:spring依赖

<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-amqp</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
03-3、springboot依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

上面根据自己的项目环境进行选择即可。

番外:rabbitmq和spring同属一个公司开放的产品,所以他们的支持也是非常完善,这也是为什么推荐使用rabbitmq的一个原因。

04、启动rabbitmq-server服务

systemctl start rabbitmq-server或者docker start myrabbit

05、定义生产者

基本知识
注意:amqp-client 5.10.0版本,连接rabbitmq-server-3.10.13,不行。报错:不能连接 VirtualHost "/"

回退了:RabbitMQ 3.9.11 Erlang 24.2,使用docker启动的,可以连接。
  • Durable 持久化的队列,在网页上看到 是带D的
    • 非持久化就是:transient
Durable
英
/ˈdjʊərəb(ə)l
adj.
持久的,耐用的;<非正式>(人)有耐力的,坚韧不拔的
n.
耐用品

transient
英
/ˈtrænziənt/
adj.
转瞬即逝的,短暂的;暂住的,(工作)临时的
n.
暂住者,流动人口;(电流、电压、频率的)瞬变

durable 队列是否持久化。所谓持久化消息是否存盘,如果false 非持久化 true是持久化?非持久化会存盘吗?会存盘,但是会随从重启服务会丢失。

非持久化队列,特点1:重启了服务器(docker),队列会丢失。

  • 哪怕是 还有消费没有消费,整个队列都没有了。
生产者
package com.xuexiangban.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

/**
 * @author: 学相伴-飞哥
 * @description: Producer 简单队列生产者
 * @Date : 2021/3/2
 */
public class Producer {
    public static void main(String[] args) {
        // 1: 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2: 设置连接属性
        connectionFactory.setHost("192.168.44.146");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        Connection connection = null;
        Channel channel = null;
        try {
            //网页管理界面:第一个是 Overview后,依次是:连接 通道 交换机 队列

            // 3: 从连接工厂中获取连接
            connection = connectionFactory.newConnection("生产者");
            // 4: 从连接中获取通道channel
            channel = connection.createChannel();
            // 5: 申明队列queue存储消息
            /*
             *  如果队列不存在,则会创建
             *  Rabbitmq不允许创建两个相同的队列名称,否则会报错。
             *
             *  @params1: queue 队列的名称
             *  @params2: durable 队列是否持久化。所谓持久化消息是否存盘,如果false 非持久化 true是持久化?非持久化会存盘吗?会存盘,但是会随从重启服务会丢失。

             *  @params3: exclusive 是否排他,即是否私有的(独占独立),如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭
             *  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。
             *  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。
             * */
            channel.queueDeclare("queue1", false, false, false, null);
            // 6: 准备发送消息的内容
            String message = "你好,学相伴!!!";
            // 7: 发送消息给中间件rabbitmq-server
            // @params1: 交换机exchange
            // @params2: 队列名称/routing key。路由key
            // @params3: 属性配置。如MessageProperties.PERSISTENT_TEXT_PLAIN,对发送的消息 也持久化。消息状态控制。
            // @params4: 发送消息的内容
            //面试题:可以存在没有交换机的队列吗?
            //不可能,虽然没有指定交换机但是一定会存在一个默认的交换机。
            //(Default exchange binding) 叫做:AMQP default
            channel.basicPublish("", "queue1", null, message.getBytes());
            System.out.println("消息发送成功!");
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("发送消息出现异常...");
        } finally {
            // 7: 释放连接关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

1:执行发送,这个时候可以在web控制台查看到这个队列queue的信息

img

img

2:我们可以进行对队列的消息进行预览和测试如下:

img

3:进行预览和获取消息进行测试

img

06、定义消费者

  • 其他代码都一样。
            //网页管理界面:第一个是 Overview后,依次是:连接 通道 交换机 队列

            // 3: 从连接工厂中获取连接
            connection = connectionFactory.newConnection("生产者");
            // 4: 从连接中获取通道channel
            channel = connection.createChannel();

            channel.basicConsume("queue1", true, new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println("收到的消息是" + new String(delivery.getBody(), "UTF-8"));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String s) throws IOException {
                    System.out.println("接收消息失败了");
                }
            });
            System.in.read();
deliver
英
/dɪˈlɪvə(r)/
v.
投递,运送;履行,兑现;交付,移交;发表,宣布;接生,分娩;解救,拯救;投掷,击打;(法官或法庭)宣布(判决);拉(选票);发行,发布(计算机程序);处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值