目录
1、简介
2、利用docker安装RabbitMQ
3、常用代码介绍
4、SpringBoot整合RabbitMQ
5、测试代码
如果对docker操作不熟悉的请点击下面的链接学习:
CentOS7服务器搭建SpringBoot项目 详解 (基本操作)
1、简介
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
在项目中使用RabbitMQ能提升系统的异步通信、扩展解耦、削峰、缓冲的能力等,比如一个注册页面,需要发送手机验证码,那么在处理的过程中就可以将需要发送验证码这个消息传递到队列中,然后直接返回发送成功的消息给用户,而不需要等到发送验证码执行完成才返回成功增强用户体验。
2、利用docker安装RabbitMQ
采用Xshell工具连接到服务器的控制台。
利用docker安装rabbitmq:
输入 docker pull rabbitmq下载rabbitmq
输入 docker images 查看docker本地的镜像
操作如下图:
运行docker中的rabbitmq:
输入 docker images 查看本地镜像
输入 以下代码启动rabbitmq服务
docker run -d -p 5672:5672 --name myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq
其中
-p 代表将主机的端口映射到容器的一个端口,主机端口:容器内部的端口。
--name 即是设置在容器的名称
-d 代表后台运行。
-e 代表指定参数 RABBITMQ_DEFAULT_USER即是指定账号名称,RABBITMQ_DEFAULT_PASS即是指定账号密码。
操作如下图:
3、常用代码介绍
先了解RabbitMQ的结构,如下图:
结合上面的结构图介绍一下大概的用法:
1、创建Exchange(交换器)。
2、创建Queue(队列)。
3、将Queue(队列)与Exchange(交换器)进行绑定,并设置routingKey(路由键)。
4、通过设置Exchange(交换器)、routingKey(路由键)、消息,发送到指定或适配的队列中。
5、监听队列取出消息进行消费。
Exchange(交换器)目前总共有四种类型:
Direct 点对点模式 只有routingKey(路由键)完全匹配消息才能发送成功。
Fanout 广播模式 只要绑定了该交换器的队列 无需匹配routingKey(路由键)都能接收到消息。
Topic 匹配规则模式 在绑定队列时routingKey(路由键)的单词之间用点(.)隔开,通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配一个单词。
Headers 根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配,消息就能发送成功,headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了。
Exchange匹配结构如下图(一目了然):
Direct Exchange
Fanout Exchange
Topic Exchange
消息发送与管理功能控件主要用到以下两个类:
//消息发送处理组件 给RabbitMQ发送与接收消息
@Autowired
RabbitTemplate rabbitTemplate;
//管理功能组件 创建或删除 Queue(消息队列)、Exchange(交换器)、Binding(绑定规则)
@Autowired
AmqpAdmin amqpAdmin;
创建Exchange(交换器)代码如下:
//创建交换器
amqpAdmin.declareExchange(new DirectExchange("direct.exchange"));//点对点
或者在项目初始化的时候直接创建,代码如下:
//初始化时创建点对点交换器
@Bean
public DirectExchange directExchange(){
return new DirectExchange("direct.exchange");
}
创建Queue(队列)代码如下:
//创建队列
amqpAdmin.declareQueue(new Queue("direct.queue"));
或者在项目初始化的时候直接创建,代码如下:
//创建一个队列
@Bean
public Queue directQueue(){
return new Queue("direct.queue");
}
将Queue(队列)绑定Exchange(交换器),可以多对多绑定,代码如下:
//创建绑定规则 交换器与队列的绑定可以多对多
//Binding参数:1、目的地 2、绑定的类型 3、交换器名称 4、路由键名称 5、参数头信息,可以为空
amqpAdmin.declareBinding(new Binding("direct.queue",Binding.DestinationType.QUEUE,"direct.exchange","direct.queue",null));
或者在项目初始化的时候直接创建,代码如下:
//将队列都绑定到点对点交换器上
@Bean
public Binding bindingDirect1() {
return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct.queue");//with即为填写路由键
}
点对点发送消息代码如下:
//常用的点对点发送 转换并发送
//只需要传入要发送的对象,自动序列化保存并发送给rabbitmq
//参数:交换器 路由键(消息队列的名称) 要发送的对象
HashMap hm = new HashMap<>();
hm.put("message","这是点对点消息");
rabbitTemplate.convertAndSend("direct.exchange","direct.queue",hm);
广播发送消息代码如下:
HashMap hm = new HashMap<>();
hm.put("message","这是广播消息");
//广播不需要写路由规则
rabbitTemplate.convertAndSend("fanout.exchange","",hm);
匹配规则发送消息代码如下:
HashMap hm = new HashMap<>();
hm.put("message","这是匹配模式消息");
rabbitTemplate.convertAndSend("topic.exchange","topic",hm);
接收队列的消息,代码如下:
//接收与转换
//参数:路由键(消息队列的名称)
HashMap hm = (HashMap)rabbitTemplate.receiveAndConvert("direct.queue");
利用注解的方式监听队列,如果有消息即会消费:
在main类的头部标上如下注解,开启基于注解的RabbitMQ:
@EnableRabbit//开启基于注解的RabbitMQ
创建一个MyService类监听消息队列:
//监听队列的消息
@Service
public class MyService {
//监听queues队列的消息 该注解要起作用需要用@EnableRabbit开启基于注解的RabbitMQ
@RabbitListener(queues = "消息队列")
public void receiveMsg(HashMap hashMap){
}
}
4、SpringBoot整合RabbitMQ
利用IDEA创建项目并导入依赖,操作如下图:
配置RabbitMQ:
分别配置RabbitMQ的IP地址,账号与登录密码,在application.properties中添加以下代码:
#配置RabbitMQ
#配置服务器地址
spring.rabbitmq.host=127.0.0.1
#配置RabbitMQ用户名
spring.rabbitmq.username=admin
#配置RabbitMQ密码
spring.rabbitmq.password=123456
#如果是默认可以不配置端口号
#spring.rabbitmq.port=5672
server.port=80
本次测试案例目录结构图如下:
消息监听测试代码如下:
package com.heiban.springboot.service;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
import java.util.HashMap;
/**
* @author 公众号:鲁智深菜园子
* @date 2020/4/3
*/
//监听队列的消息
@Service
public class MyService {
//监听queues队列的消息 该注解要起作用需要用@EnableRabbit开启基于注解的RabbitMQ
@RabbitListener(queues = "direct.queue")
public void receiveMsg1(HashMap hashMap){
System.out.println("direct.queue接收到消息---"+hashMap);
}
@RabbitListener(queues = "fanout.queue")
public void receiveMsg2(HashMap hashMap){
System.out.println("fanout.queue接收到消息---"+hashMap);
}
@RabbitListener(queues = "topic.queue")
public void receiveMsg3(HashMap hashMap){
System.out.println("topic.queue接收到消息---"+hashMap);
}
}
控制器部分测试代码如下:
//点对点
@ResponseBody
@RequestMapping("/send1")
public String send1(){
// 参数:交换器 路由键 消息
// rabbitTemplate.send();
//常用的点对点发送 转换并发送
//只需要传入要发送的对象,自动序列化保存并发送给rabbitmq
//参数:交换器 路由键(消息队列的名称) 要发送的对象
HashMap hm = new HashMap<>();
hm.put("message","这是点对点消息");
rabbitTemplate.convertAndSend("direct.exchange","direct.queue",hm);
return "执行成功";
}
//广播
@ResponseBody
@RequestMapping("/send2")
public String send2(){
HashMap hm = new HashMap<>();
hm.put("message","这是广播消息");
rabbitTemplate.convertAndSend("fanout.exchange","",hm);
return "执行成功";
}
//匹配模式
@ResponseBody
@RequestMapping("/send3")
public String send3(){
HashMap hm = new HashMap<>();
hm.put("message","这是匹配模式消息");
rabbitTemplate.convertAndSend("topic.exchange","topic",hm);
return "执行成功";
}
下面将进行测试。
5、测试代码
该项目中MyAMQPConfig类中对RabbitMQ组件进行了初始化,创建交换器、创建队列、队列与交换器绑定(详细代码请在源文件中查看)。
测试点对点发送消息,如下图:
测试广播发送消息,如下图:
测试规则匹配发送消息,如下图:
回复获取资源
关注后回复 消息中间件
获取本次SpringBoot整合RabbitMQ的源文件