RabbitMQ官网Messaging that just works — RabbitMQ
一、RabbitMQ 是什么
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。
二、RabbitMQ模型型
rabbitMQ的优点
1、降低系统耦合度。
2、高并发
4、支持消息持久化。
5、可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统
工作过程
1、发布者发布消息,经由交换机。交换机根据路由规则将收到的消息分发给与该交换机绑定的队列。最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。
2、发布者、交换机、队列、消费者都可以有多个。同时因为 AMQP 是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以分别存在于不同的设备上。
3、发布者发布消息时可以给消息指定各种消息属性(Message Meta-data)。有些属性有可能会被消息代理(Brokers)使用,然而其他的属性则是完全不透明的,它们只能被接收消息的应用所使用。
4、从安全角度考虑,网络是不可靠的,又或是消费者在处理消息的过程中意外挂掉,这样没有处理成功的消息就会丢失。基于此原因,AMQP 模块包含了一个消息确认(Message Acknowledgements)机制:当一个消息从队列中投递给消费者后,不会立即从队列中删除,直到它收到来自消费者的确认回执(Acknowledgement)后,才完全从队列中删除。
5、在某些情况下,例如当一个消息无法被成功路由时(无法从交换机分发到队列),消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。此时,消息发布者可以选择某些参数来处理这些特殊情况。
rabbit理论基础可以参考这篇博客 RabbitMQ的工作模式及原理
三、RabbitMQ安装步骤
我是基于linux下用docker安装的
搜索rabbit镜像: docker search rabbit
下载rabbit镜像 : docker pull rabbitmq
将镜像安装在容器中: docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
启动容器 :docker start rabbit
出现以下面图片则表示启动成功
进入容器交互页面:docker exec -it rabbit /bin/bash
在容器里面下载插件:rabbitmq-plugins enable rabbitmq_management
访问地址:http://192.168.233.150:15672/
默认guest 用户,密码也是 guest
出现如下界面则表示安装成功
1 <dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring‐boot‐starter‐amqp</artifactId>
4 </dependency>
rabbitmq:
host: 192.168.110.100
username: hxzy
password: hxzy
virtual-host: hxzy
package hxzy.com.cn.controller;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("msg")
public class MessageController {
@Autowired
private AmqpTemplate amqpTemplate;
@GetMapping("/sendMsg")
public void sendMsg(){
String msg="goods price is updated!";//
amqpTemplate.convertAndSend("gzhx.exchange","items.update",msg);
}
}
rabbitmq:
host: 192.168.110.100
username: hxzy
password: hxzy
virtual-host: hxzy
package hxzy.com.cn.listener;
import hxzy.com.cn.service.GoodsIndex;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MessageListener {
@Autowired
private GoodsIndex goodsIndex;
//Queue:队列
//durable:是否持久
//@Exchange:交换机
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "gzhx", durable = "true"),
exchange = @Exchange(value = "gzhx.exchange", ignoreDeclarationExceptions = "true",
type = ExchangeTypes.TOPIC
),key = {"items.update"}))
public void accept(String msg){
System.out.println(msg);
}
}
出现如下则发送成功