rabbitmq简介与使用
概述
1,大多应用中,都可以通过消息中间件来提升系统异步通信,扩展解耦能力,中间件也可以说是消息队列
2,消息服务中两个关键点:
- 消息代理:也就是消息中间件的服务器,我们需要往消息中间件存数据,需要连接服务器,然后服务器会把消息发往目的地
- 目的地:消息队列主要有两种形式的目的地
- 队列:点对点消息通信,发送者发出消息,消息代理将其放入队列,接收者从队列获取消息,消息被移出队列,消息只有唯一的发送者与接受者(因为消息只有一个,取出去就没有了,自然第二个人取不出)
- 主题:发布与订阅:发布者发送消息到主题,多个接收者订阅主题,只要发消息,所有人都能收到消息
JMS消息服务
是一个规范,ActiveMQ是实现了这种规范的中间件
AMQP
也是一种消息代理的规范,rabbitMQ就是实现了这种规范的中间件
可以跨语言,跨平台
spring支持它们两者。
- spring在底层提供了JmsTemplate与RabbitTemplate来使用他们发送消息
- 通过connectionFactory的实现来连接消息代理
- @JmsListener 与@RabbitListener 注解在方法上监听消息代理发布的信息
- @EnableJms @EnableRabbit 开启功能
RabbitMQ简介
实现了AMQP规范的中间件
核心:
message:由消息头与消息体组成,消息体是不透明的而消息头由一系列可选属性组成
Publisher:消息生产者,也是向交换器发布消息的客户端
Exchange:交换器,存在于服务器,用来接收生产者发布的消息并将这些消息路由给服务器中的队列
交换器有四种类型,不同类型有不同的转发消息策略
Queue:消息队列,消息的容器,在消息队列服务器中,可能有很多队列,交换器根据消息的类型分配给不同的消息队列,
Binding:绑定,消息队列与交换器之间的关联,一个绑定就是基于路由键将交换器与消息队列连接起来的规则
可以将交换器理解为一张绑定规则的路由表,交换器与队列可以是多对多关系
Conection:网络连接
Channel:信道,发送消息时,我们只需要一条连接,然后在这个连接里面开辟好的信道,来发送消息
Consumer:消费者,从队列获取消息的客户端
Virtual Host:虚拟主机,vHost本质是一个mini的rabbitmq服务器,必须在连接时指定,默认是/
Broker:消息队列服务器实体
关系图

解释为:生成者发出消息,由交换器接收,交换器根据绑定规则把消息放入队列中,交换器与队列都处于服务器中,Broker是服务器实体,Vhost是虚拟体,接着消费者通过一条连接拿到队列中的消息,一个连接里面分了多个信道
交换器类型
- direct:直连式,作用是,发送消息时所带的路由键key与绑定中的队列名字一致,就会发送消息到对应的队列,点对点
- Fanout:不管什么信息,只要发送给一个队列,就会给所有绑定了的队列发送一份,参考发布订阅
- Topic:自定义消息与队列对应的key
可以说,direct是一对一,fanout是一对多,topic是多对多(路由键与队列名)
Rabbit安装
我们在docker中直接使用docker pull rabbitmq:3-management 指令下载rabbitmq的镜像
并且运行,开放15672与5672端口。之后我们就能通过服务器地址访问15672端口查看rabbitmq的图形化界面了
注意默认账号密码是,guest
然后我们可以手动生成交换器,绑定规则,队列,包括发送消息时带上路由键
Rabbit的使用
1,导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2,配置类
package com.lcx.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
@Bean//可以使数据以json格式来回
public MessageConverter messcon() {
return new Jackson2JsonMessageConverter();
}
}
3,使用
@Autowired
RabbitTemplate rt; //使用此对象发送接收数据
@Autowired
AmqpAdmin ad; //使用此对象创建或删除交换机,队列,或绑定
rt.convertAndSend("exchange.direct","news",map);
//指明交换器,路由键,消息内容,即可发送
Object object = rt.receiveAndConvert("news");//指明队列名即可获取队列里的数据
// 创建的操作在图形化界面直接创建或者使用ad创建
4,监听
//在service层写一个监听方法,标上注解,指明监听哪个队列
@RabbitListener(queues = "news")//这个方法监听这个队列,只要有消息进入,马上输出
public void recive(Message msg) {
System.out.println(msg.getBody());
}
//还需要在启动类,开启此功能
@EnableRabbit//开启注解的rabbit

浙公网安备 33010602011771号