RabbitMQ简介

AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

RabbitMQ 是一个由Erlang语言开发的AMQP的开源实现。(PS:前几天有篇文章介绍了阿里P10的淘宝褚霸,就是erlang大神)。支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点如下:

1、可靠性

RabbitMQ 使用一些机制来保证可靠性,如持久化,传输确认、发布确认。

2、灵活的路由

在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,RabbitMQ 提供了内置的Exchange来实现。针对更复杂的路由功能。可以将多个Exchange 绑定在一起,也通过插件机制实现自己的 Exchange。

3、消息集群

多个RabbitMQ 服务器可以组成一个集群,形成一个逻辑Broker.

4、高可用

队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列任然可用。

5、多种协议

RabbitMQ支持多种消息队列协议。比如STOMP、MQTT等等

6、多语言客户端

RabbitMQ支持多种语言,比如java/Ruby等

7、管理界面

RabbitMQ提供了一个易用的用户界面。使得用户可有监控和管理Broker的许多方面

8、跟踪机制

如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出

9、插件机制

RabbitMQ提供了许多插件,从多方面进行扩展,也可以编写自己的插件

RabitMQ 概念模型

1、Message

消息,消息是不具名的,它由消息头和消息体组成,消息体是不透明的。而消息头则由一系列的可选属性组成。包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等

2、Publisher

消息的生产者,也是一个向交换器发布消息的客户端应用程序

3、Exchange

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

4、Binding

绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则。所以可以将交换器理解成一个由绑定构成的路由表。

5、Queue

消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面。等待消息消费者连接到这个队列将其取走。

6、Connection

网络连接

7、Channel

信道,多路复用连接中的一条独立的双向数据流通道。

8、Consumer

消息的消费者,表示一个从消息队列中取得消息的客户端应用程序

9、Virtual Host

虚拟主机、表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost 本质上就是一个mini版的RabbitMQ服务器。拥有自己的队列、交换器、绑定、和权限机制。vhost是AMQP概念的基础。必须在连接时指定,RabbitMQ默认的Vhost是/.

10、Broker

表示消息队列服务器实体。

Exchange 类型

Exchange 有四种类型:Direct、Topic、Headers 和 Fanout 。

  • Direct:该类型的行为是“先匹配,再投送”,即在绑定时设定一个 routing_key,消息的routing_key 匹配时,才会被交换器投送到绑定的队列中去。
  • Topic:按规则转发消息(最灵活)。
  • Headers:设置 header attribute 参数类型的交换机。
  • Fanout:转发消息到所有绑定队列。

headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,这里不再详细介绍

Driect

Direct Exchange 是 RabbitMQ 默认的交换机模式,也是最简单的模式,根据 key 全文匹配去寻找队列。

消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名完全匹配.它是完全匹配、单播的模式。

Topic

Topic Exchange 转发消息主要是根据通配符。在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。

在这种交换机模式下:

  • 路由键必须是一串字符,用句号(.)隔开,如 agreements.us,或者 agreements.eu.stockholm 等。

topic 和 direct 类似,只是匹配上支持了“模式”,在“点分”的 routing_key 形式中,可以使用两个通配符:

  • *表示一个词。
  • #表示零个或多个词。

Fanout

Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略。

代码实战

此部分代码基于springboot进行,全部代码放到github上

Spring Boot 集成 RabbitMQ 非常简单,仅需非常少的配置就可使用,Spring Boot 提供了 spring-boot-starter-amqp 组件对MQ消息支持。

简单使用

(1)配置 pom 包,主要是添加 spring-boot-starter-amqp 的支持。

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

(2)配置文件,配置 rabbitmq 的安装地址、端口及账户信息。

spring.application.name=spirng-boot-rabbitmq

spring.rabbitmq.host= localhost
spring.rabbitmq.port= 5672
spring.rabbitmq.username=allen
spring.rabbitmq.password=123456 server.port=8080

(3)定义队列

@Configuration
public class RabbitConfig { @Bean
public Queue Queue() {
return new Queue("hello");
}
}

(4)发送者

AmqpTemplate 是 Spring Boot 提供的默认实现。

@RestController
public class HelloSender { @Autowired
private AmqpTemplate amqpTemplate; @GetMapping(value = "/sendString")
public String sendString() {
//发送消息 String routingKey, Object object
amqpTemplate.convertAndSend("hello", "hello rabbitMQ");
return "消息已发送";
} @GetMapping(value = "/sendObject")
public String sendObject() {
//发送消息 String routingKey, Object object
UserEntity userEntity = new UserEntity();
userEntity.setName("allen");
userEntity.setAddress("山东济南");
amqpTemplate.convertAndSend("hello", userEntity);
return "消息已发送";
}

(5)接收者

注意使用注解@RabbitListener,使用 queues 指明队列名称,@RabbitHandler为具体接收的方法。

@Component
@RabbitListener(queues = "hello")
@Slf4j
public class HelloReceiver { @RabbitHandler
public void process(String hello) {
log.info("消息接受为:{}",hello);
} @RabbitHandler
public void process(UserEntity userEntity) {
log.info("消息接受为:{}",userEntity);
}
}

(5)访问结果

com.zhb.direct.HelloReceiver             : 消息接受为:hello rabbitMQ
com.zhb.direct.HelloReceiver : 消息接受为:UserEntity(name=allen, address=山东济南)

Topic Exchange

(1)定义队列、交换机并绑定

/**
* @author: curry
* @Date: 2018/9/5
*/
@Configuration
public class TopicRabbitConfig { final static String message = "topic.message";
final static String messages = "topic.messages"; //定义队列
@Bean
public Queue queueMessage() {
return new Queue(TopicRabbitConfig.message);
} @Bean
public Queue queueMessages() {
return new Queue(TopicRabbitConfig.messages);
} //exchange
@Bean
TopicExchange exchange() {
return new TopicExchange("exchange");
} //将队列和交换机进行绑定
@Bean
Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
} @Bean
Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
}
}

(2)发送者

/**
* @author: curry
* @Date: 2018/9/5
*/
@RestController
public class Sender {
@Resource
private AmqpTemplate rabbitTemplate; @GetMapping(value = "send1")
public void send1(){
String context = "hi, i am message1";
rabbitTemplate.convertAndSend("exchange","topic.message",context);
} @GetMapping(value = "send2")
public void send2(){
String context = "hi, i am message2";
rabbitTemplate.convertAndSend("exchange","topic.messages",context);
}

(3) 接受者

/**
* @author: curry
* @Date: 2018/9/5
*/
@Slf4j
@Component
@RabbitListener(queues = "topic.message")
public class Receiver1 { @RabbitHandler
public void process(String message) {
log.info("topic Receive1:{}", message);
}
} /**
* @author: curry
* @Date: 2018/9/5
*/
@Slf4j
@Component
@RabbitListener(queues = "topic.messages")
public class Receiver2 { @RabbitHandler
public void process(String message) {
log.info("topic Receive2:{}", message);
}
}

其余代码不再演示,完整代码见github

完整代码:github

好了,玩的开心!

参考资料

[1]-https://www.jianshu.com/p/79ca08116d57

消息队列1:RabbitMQ解析并基于Springboot实战的更多相关文章

  1. rabbitMQ消息队列 – Message方法解析

    消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...

  2. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  3. Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ

    文章目录 1. 什么是 RabitMQ 2. Spring Boot 整合 RabbitMQ 3. 实战演练4. 源代码 3.1. 一个简单的实战开始 3.1.1. Configuration 3.1 ...

  4. 消息队列系统 -- RabbitMQ

    消息队列系统 -- RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Que ...

  5. 消息队列之 RabbitMQ

    https://www.jianshu.com/p/79ca08116d57 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块 ...

  6. 转 消息队列之 RabbitMQ

    转 https://www.jianshu.com/p/79ca08116d57 消息队列之 RabbitMQ 预流 2017.05.06 16:03* 字数 4884 阅读 80990评论 18喜欢 ...

  7. 快速入门分布式消息队列之 RabbitMQ(1)

    目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...

  8. 消息队列之rabbitmq学习使用

    消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...

  9. 消息队列之 RabbitMQ【验证通过】

    消息队列之 RabbitMQ 预流 关注  22.9 2017.05.06 16:03* 字数 4884 阅读 284691评论 41喜欢 618赞赏 2 关于消息队列,从前年开始断断续续看了些资料, ...

随机推荐

  1. ubuntu16.04下的htk安装编译

    HTK(HMM Tools Kit)是一个剑桥大学开发的专门用于建立和处理HMM的实验工具包[1],主要应用于语音识别领域,也可以应用于语音合成.字符识别和DNA排序等领域.HTK经过剑桥大学.Ent ...

  2. Leetcode——121. 买卖股票的最佳时机

    题目描述:买卖股票的最佳时机 题目要求求解能获得最大利润的方式? 可以定一个二维数组 d [ len ] [ 2 ] ,其中d[ i ][ 0 ] 表示前i天可以获得的最大利润:d[ i ][ 1 ] ...

  3. C. Permutation Cycle

    For a permutation P[1... N] of integers from 1 to N, function f is defined as follows: Let g(i) be t ...

  4. -bash: start-all.sh: 未找到命令

    解决方案:以root权限进入,找到hadoop安装的目录,进入sbin目录下 输入命令#start-all.sh 出现错误:-bash: start-all.sh: 未找到命令 百度了一下:原来需要输 ...

  5. 【小程序】&nbsp; 的识别

    给标签添加   decode="{{true}}" space="{{true}}"  属性 eg: <text decode="{{true} ...

  6. 利用OVS+FLOODLIGHT,为数据表添加VLAN_ID和MPLS

    话不多说,直接上拓扑: 我这里是用主机h1 (10.0.0.1)ping 主机h2(10.0.0.2) 1.添加VLAN标签 v1: sudo ovs-ofctl add-flow m1-s1 in_ ...

  7. cocos2d-x学习记录1——图片显示

    这篇算是cocos2d-x入门篇,显示一张图片即可. 观察工程中HelloWorld的结构,包含AppDelegate和HelloWorldScene两个类文件,AppDelegate中包含基本的处理 ...

  8. C# 基于泛型的自定义线性节点链表集合示例

    本例子实现了如何自定义线性节点集合,具体代码如下: using System; using System.Collections; using System.Collections.Generic; ...

  9. jenkins +gitlab +docker 自动化部署tomcat 项目

    实验环境 实验设备 三台服务器 centos 7.X 以上 内存 2-3G左右 192.168.1.195 (jenkins最新+ git 2.8+maven 3.5 +tomcat 8+java1. ...

  10. docker之容器数据持久化

    1.挂载本地目录为容器的数据存放目录 [root@node03 ~]# docker run -itd --name web01 -v /container_data/web:/data ubuntu ...