RabbitMQ 是实现高级消息队列协议(AMQP:Advanced Message Queue Protocol)的开源代理软件,也称为面向消息的中间件。支持多种操作系统、多种编程语言。RabbitMQ 服务器使用 Erlang 语言编写,其集群和故障转移是构建在开放电信平台框架上的。

AMQP 是一个面向消息中间件的开放式应用层协议。定义消息方向、消息队列、消息路由、可靠性、安全性等特性。要求消息的提供者和客户端接收者的行为要实现对不同供应商可以用相同的方式(FTP/HTTP/SMTP等)进行互相操作。以往的JMS,主要是建立在 API级别,建立标准化的程序间的互操作性。而 AMQP 是一个线路级协议。描述的是通过网络发送的数据传输格式,任何符合该数据格式的消息发送和接收工具都能互相兼容和进行操作,这样就可以实现跨技术平台的架构方案。

一、基本概念


【1】Broker:消息队列服务器的实体,负责接收生产者的消息,然后将消息发送到消息接受者或者其他 Broker。
【2】Exchange:消息交换机,消息第一个到达的地方,消息通过它指定的路由规则,分发到不同的消息队列中去。
【3】Queue:消息队列,消息通过发送和路由之后最终到达的地方,到达 Queue 的消息即进入逻辑上等待消费的状态。每个消息都会被发送到一个或多个队列。
【4】Binding:绑定,它的作用是把 Exchange 和 Queue 按照路由规则绑定起来(虚拟连接)。
【5】Routing Key:路由关键字,Exchange 根据这个关键字进行消息投递。
【6】Virtual host:虚拟主机,它是对 Broker 的虚拟划分,将消费者、生产者和他们依赖的 AMQP 相关结构进行隔离,一般都是为了安全考虑。比如,我们可以在一个Broker中设置多个虚拟主机,对不同用户进行权限管理。
【7】Connection:连接,代表生产者、消费者、Broker 之间进行通信的物理网络。
【8】Channel:消息通道,用户连接生产者与消费者的逻辑结构。在客户端的每个连接里,可建立多个 Channel,每个 Channel,每个 Channel 代表一个会话任务,通过 Channel 可以隔离同一连接中的不同交互内容。
【9】Producer:消息生产者,制造消息并发送消息的程序。
【10】Consumer:消息消费者,接收消息并处理消息的程序。

二、消息传递到队列的过程


【1】客户端连接到消息队列服务器,打开一个 Channel。
【2】客户端声明一个 Exchange,并设置相关属性。
【3】客户端声明一个 Queue,并设置相关属性。
【4】客户端使用 Routing Key,在Exchange 和 Queue 之间建立好绑定关系。
【5】客户端投递消息到 Exchange。
【6】Exchange 接收到消息后,根据消息的 Key 和已经设置的 Binding,进行消息路由,将消息传递到一个或多个 Queue 里。

三、Exchange 三种类型


【1】Direct 交换机:完全根据 Key 进行投递。比如,绑定时设置了 Routing Key 为 abc,那么客户端提交的消息,只有设置了 Key 为 abc 的才会被投递到队列。
【2】Topic 交换机:对 Key 进行模式匹配后进行投递,可以使用符号#匹配一个或多个词,符号*匹配正好一个词。比如,abc.#匹配abc.efg.dwg,abc.*只匹配类似 abc.efg。
【3】Fanout 交换机:不需要任何 Key,它采用广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

四、RabbitMQ 持久化策略


为了数据安全考虑,大多数情况下都会选择持久化,也就是将数据写到磁盘上。消息持久化包括以下3个部分:
【1】Exchange 持久化,在声明时指定 durable => 1;
【2】Queue 持久化,在声明时指定 durable => 1;
【3】消息持久化,在投递时指定 delivery_mode => 2(1是非持久化)
如果 Exchange 和 Queue 都是持久化的,那么他们之间的 Binding 也是持久化的,如果 Exchange 和 Queue 两者之间有一个是持久化的,一个是非持久化的。就不允许建立绑定。

五、RabbitMQ 管理


我们可以直接通过访问配置文件进行管理,也可以通过访问 Web 进行管理,我们主要介绍通过 Web 进行管理。
【1】配置完环境之后,在 cmd 窗口执行 rabbitmq-plugins enable rabbitmq_management 命令,开启 Web 管理插件。
  【2】在浏览器中访问 http://localhost:15672/并使用默认用户 guest 登录,密码也为 guest。可以看到如下管理页面:
从图中能够看到之前提到的一些基本概念,比如 Connections、Channel、Exchanges、Queues 等。可以在 Admin 中添加用户和修改用户权限等操作:
Tags 标签是 RabbitMQ 中的角色分类,共有下面几种:
  ●  none:不能访问 management plugin;
  ●  management:用户可以通过 AMQP 做的任何事外加入下内容:
      ■  列出自己可以通过 AMQP 登入的 virtual hosts;
      ■  查看自己 virtual hosts 中 queues、exchanges 和 bindings;
      ■  查看和关闭自己的 channels 和 connections;
      ■  查看有关自己的 virtual hosts 的全局统计信息,包含其它用户在这些 virtual hosts 中的活动。
  ●  policymarker:management 可以做的任何事情外加如下内容:
      ■  查看、创建、删除自己的 virtual hosts 所属的 policies 和 parameters;
  ●  monitoring:management 可以做的任何事外加如下内容:
      ■  列出所有 virtual hosts,包括它们不能登录的 virtual hosts;
      ■  查看其它用户 connections 和 channels;
      ■  查看节点级别的数据,如 clustering 和 memory 的使用情况。
      ■  查看真正的关于所有 virtual hosts 的全局统计信息;
  ●  administrator:policymarker 和 monitoring 可以做的任何事外加如下内容:
      ■  创建和删除 virtual hosts;
      ■  查看、创建和删除 users;
      ■  查看、创建和删除 permissions;
      ■  关闭其它用户的 connections;

六、快速入门


通过Spring Boot 应用整合 RabbitMQ,实现一个简单的发送、接收消息的例子。在Spring Boot 中添加 AMQP 的 Starter 即可。
【1】创建一个 SpringBoot 工程,命名为 rabbitmq-hello;
【2】在 pom.xml 中引入如下依赖内容:

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

【3】在 application.yml 中配置关于 RabbitMQ 的连接和用户信息:

spring:
application:
name: rabbitmq-hello
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest

【4】创建消息生产者 Sender,通过注入 AmqpTemplate 接口的实例来实现消息的发送,AmqpTemplate 接口定义了一套针对 AMQP 协议的基本操作。在 SpringBoot 中会根据配置注入其具体实现。在该生产者汇总,我们会产生一个字符串,并向队列名为 hello 中发送消息。

@Component
public class Sender {
@Autowired
private AmqpTemplate rabbitTemp; public void send(){
String context = "hello "+new Date();
System.out.println("Sender : " + context);
this.rabbitTemp.convertAndSend("hello",context);
}
}

【5】创建消费者 Receiver,通过 @RabbitListener 注解定义该类对 hello 队列的监听,并用 @RabbitHandler 注解来指定对消息的处理方法。

@Component
@RabbitListener(queues = "hello")
public class Receiver {
@RabbitHandler
public void process(String hello){
System.out.println("Receviver:"+hello);
}
}

【6】创建 RabbitMQ 的配置类 RabbitConfig,用来配置队列,交换器、路由等高级特性。

@Configuration
public class helloQueue {

----关注公众号,获取更多内容----

RabbitMQ 消息中间件总结的更多相关文章

  1. spring boot / cloud (九) 使用rabbitmq消息中间件

    spring boot / cloud (九) 使用rabbitmq消息中间件 前言 rabbitmq介绍: RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.它可以用于大型软件系统 ...

  2. RabbitMQ 消息中间件

    RabbitMQ 是使用 Erlang 语言开发的消息中间件, 其遵循了高级消息队列协议(Advanced Message Queuing Protocol, AMQP). 与 Kafka 等消息队列 ...

  3. CentOS6.8搭建rabbitmq消息中间件

    参考资料:http://blog.csdn.net/yunfeng482/article/details/72853983 一.rabbitmq简介 MQ全称为Message Queue, 消息队列( ...

  4. python中使用rabbitmq消息中间件

    上周一直在研究zeromq,并且也实现了了zeromq在python和ruby之间的通信,但是如果是一个大型的企业级应用,对消息中间件的要求比较高,比如消息的持久化机制以及系统崩溃恢复等等需求,这个时 ...

  5. RabbitMQ消息中间件的用法

    1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消 ...

  6. Linux(Centos平台)RabbitMQ消息中间件服务器搭建

    本篇结合接口测试平台部署来讲,不了解的请先查看我的另一篇文档,HttpRunnerManager接口测试平台部署在服务器上(Centos + python3.6 + Mysql5.7 + uwsgi ...

  7. RabbitMQ消息中间件极速入门与实战

    1:初识RabbitMQ RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AM ...

  8. rabbitmq消息中间件读后感

    1:RabbitMQ是一个开源的消息代理和队列服务器,可以通过基本协议在完全不同的应用之间共享数据,使用Erlang语言开发的,是基于AMQP(高级消息队列协议)协议,Erlang主要用于交换机的开发 ...

  9. Laravel框架安装RabbitMQ消息中间件步骤

    Laravel5.6 整合 RabbitMQ 消息队列 简介: Laravel 队列为不同的后台队列服务提供了统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关 ...

  10. springcloud 连接docker中运行的RabbitMQ消息中间件。

    参考:https://blog.51cto.com/zero01/2173288 主要是记录几个坑: 第一个坑:开始订单服务中配置文件是: #配置rabbitmq 2019.5.17 added by ...

随机推荐

  1. SQL-分组聚合-子查询

    -- having前面必须有group byselect e.deptno ,sum(e.sal) as sum_sal ,min(e.sal) as min_sal ,max(e.sal) as m ...

  2. 【python】绘图坐标轴标题中包含上标或下标

    plt.ylabel("流量($\mathregular{m^3}$/s)")          #绘图坐标轴添加上标$\mathregular{m^3}$,若是下标m_3 不加m ...

  3. Django基础篇 03- Models的属性与字段

    1.models字段类型 AutoField():一个IntegerField,根据可用ID自动递增.如果没指定主键,就创建它自动设置为主键. IntegerField():一个整数: FloatFi ...

  4. react+antd upload实现图片宽高、视频宽高尺寸校验

    图片宽高校验方法: // 上传图片尺寸限制 const checkIconWH = (file: any) => { return new Promise<void>(functio ...

  5. javaweb链接到数据库(mysql)操作

    准备:配置好数据库,下好mysql connect 第一步:将my connec文件和commons-dbutil(,jar)复制到webapp文件下WEB-INF的lib文件中,然后右键构建路径. ...

  6. 昨天写了个ATM系统,学了点思想

    昨天上黑马的基础课终结,有个小测验是做个ATM系统 拿到之后我就明白该怎么做了 但是在后面遇到了瓶颈 就是 不知道怎么进入下级菜单 后面稍微看了一下他的做法,学会了 就继续做了,后面就做出来了 他这个 ...

  7. PLC入门笔记10

    梯形图电路之顺序控制 顺序控制功能图 顺序控制功能图的梯形图表达 编程原则 实例分析 SMo0.1西门子首次扫描时为ON,常用作初始化脉冲 这是台达的 这是优控的..

  8. 解决SpringBoot前后端集成项目导出jar包运行访问页面资源报错“Whitelabel Error Page”问题

    一.SpringBoot前后端集成项目导出jar包后运行访问页面资源报错"Whitelabel Error Page"问题 二.解决方案 1.将Controller层移入com.x ...

  9. hexo相对路径图片显示

    说明 hexo的图片默认不支持相对路径.需要配置 post_asset_folder 选项,设置从false改成true之后支持.但是要求图片目录必须和文件名相同. 由于我在typore下的markd ...

  10. Linux(2)

    虚拟机关键配置名词解释 远程链接工具 linux准则 远程链接工具快捷键 系统相关命令 文件相关命令 linux目录结构 虚拟机关键配置名词解释 # 虚拟网络编辑器说明 桥接模式  # 可以访问互联网 ...