目录
SpringAMQP
什么是AMQP
应用间消息通信的一种协议
SpringAMQP如何发送消息
1.引入amqp的starter依赖
spring-boot-starter-amqp
2.配置RabbitMQ地址
spring:
rabbitmq:
host: 192.168.214.130 #可变
port: 5672
virtual-host: /
username: guest
password: guest
3.注入RabbitTemplate,利用RabbitTemplate的convertAndSend方法
SpringAMQP如何接收消息?
- 引入amqp的starter依赖
- 配置RabbitMQ地址
- 定义类,添加@Component注解
- 类中声明方法,添加@RabbitListener注解,方法参数就时消息
- 注意:消息一旦消费就会从队列删除,RabbitMQ没有消息回溯功能
spring amqp(重点)
介绍
amqp 规定了p和MQ如何通信,c和MQ通信
spring amqp基于amqp协议定义的一套api规范。JDBC
spring-rabbit对 spring amqp规范实现。数据库驱动
1.简单模式
搭建项目
创建队列
生产者服务
1.引入依赖 spring amqp的starter
2.配置文件配置rabbitmq地址
3.rabbitTemplate.covertAndSend(交换机,routingKey,消息数据);
4.rabbitTemplate.covertAndSend(routingKey,消息数据);
消费者服务
1.引入依赖 spring amqp的starter
2.配置文件配置rabbitmq地址
3.编写消息监听器,监听队列获取消息
类-->@Component
方法:public void xxx()
方法加@RabbitListener(queues="队列名称")
方法:public void xxx(String message)
2.工作队列模式
再启动一个消费者就可以演示出效果
3.发布订阅模式
创建交换机
创建队列
绑定交换机和队列
4.路由模式
创建交换机
创建队列
绑定交换机和队列
指定具体的routingKey
发消息
rabbitTemplate.covertAndSend(交换机,routingKey,消息数据)
获取消息
5.通配符模式
创建交换机
创建队列
绑定交换机和队列
指定具体的routingKey
发消息
rabbitTemplate.covertAndSend(交换机,routingKey,消息数据)
获取消息
消息转化器
如何发送对象类型消息。
spring-amqp默认使用的消息转化器,默认采用jdk的序列化,将对象转化为字节数组。要求类实现Serializable
jdk的序列化,将对象序列化的结果看不懂
采用Jackson的序列化
生产者和消费者都要引入依赖
生产者和消费者都要声明@Bean Jackson2JsonMessageConverter
注意:配置类扫描
RabbitMq集群搭建
搭建流程
1.规划3个rabbitmq容器
mq1 mq2 mq3(三个主机名称,主机名用来代替ip)
- 容器是有自己独立的网络系统和文件系统。容器中可以通过主机名称或者ip进行互联。
- 管理控制台端口8081 8082 8083
- 通信端口8071 8072 8073
2.获取erlang语言的cookie值
- rabbitmq是基于erlang语言开发的,要想搭建集群erlang语言的cookie值必须一样。
- 进入之前我们安装的mq容器中查看文件
docker exec -it mq bash
cat /var/lib/rabbitmq/.erlang.cookie
DDFYTIUXFCJITRBQWBPA
3.创建一个记录cookie的文件.erlang.cookie,所有容器必须一样
- 所有的mq挂载同一个文件
- 文件内容,之前查看的cookie内容
- 授权:chmod 600 .erlang.cookie
4.创建一个集群配置文件rabbitmq.conf,该集群配置文件,所有的容器必须是一样的
- 通过目录挂载的方式保证一样
- 所有的mq挂载同一个文件
- 文件内容
loopback_users.guest = false listeners.tcp.default = 5672 cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config cluster_formation.classic_config.nodes.1 = rabbit@mq1 cluster_formation.classic_config.nodes.2 = rabbit@mq2 cluster_formation.classic_config.nodes.3 = rabbit@mq3
5.创建一个docker网络,保证三个mq在一个网络中
docker network create mq-net
6.创建三个mq节点,保证挂载同一个集群文件和cookie文件
docker run -d --net mq-net \
-v /tmp/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v /tmp/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123 \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v /tmp/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v /tmp/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123 \
--name mq2 \
--hostname mq2 \
-p 8072:5672 \
-p 8082:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v /tmp/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v /tmp/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123 \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.8-management