一、RabbitMQ是什么
-
RabbitMQ是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统。支持多种语言,包括java、Python、ruby、PHP、C/C++等。
-
)MQ:MQ是 message queue 的简称,是应用程序和应用程序之间通信的方法。
-
AMQP:advanced message queuing protocol ,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息并不受客户端/中间件不同产品、不同开发语言等条件的限制。
二、RabbitMQ的核心概念
-
生产者(Producer):发送消息的应用。
-
消费者(Consumer):接收消息的应用
-
队列(Queue):存储消息的缓存
-
队列(Queue):存储消息的缓存
-
消息(Message):由生产者通过RabbitMQ发送给消费者的信息
-
连接(Connection):连接RabbitMQ和应用服务器的TCP连接。
-
通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
-
交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
-
绑定(Binding):绑定是队列和交换机的一个关联连接。
-
路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。
三、RabbitMQ五种消息发送模式
生产者(Producer)发送->中间件->消费者(Consumer)接收消息。
RabbitMQ包括五种队列模式,简单队列、工作队列、发布/订阅、路由、主题、rpc等。
1、简单队列
(1)生产者将消息发送到队列,消费者从队列获取消息。
(2)一个队列对应一个消费者。
2、工作队列
1)一个生产者,多个消费者。
(2)一个消息发送到队列时,只能被一个消费者获取。
(3)多个消费者并行处理消息,提升消息处理速度。
注意:channel.basicQos(1)表示同一时刻只发送一条消息给消费者。
3、发布/订阅模式(Publish/Subcribe)
将消息发送到交换机,队列从交换机获取消息,队列需要绑定到交换机。
(1)一个生产者,多个消费者。
(2)每一个消费者都有自己的一个队列。
(3)生产者没有将消息直接发送到队列,而是发送到交换机。
(4)每一个队列都要绑定到交换机。
(5)生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的。
(6)交换机类型为“fanout”。
注意:交换机本身没有存储消息的能力,消息只能存储到队列中。
4、路由模式(Routing)
路由模式是发布/订阅模式的一种特殊情况。
(1)路由模式的交换机类型为“direct”。
(2)绑定队列到交换机时指定 key,即路由键,一个队列可以指定多个路由键。
(3)生产者发送消息时指定路由键,这时,消息只会发送到绑定的key的对应队列中。
5、主题模式(Topic)
将路由键和某模式进行匹配。此时,队列需要绑定到一个模式上。
符号“#”匹配一个或多个词,“*”匹配不多不少一个词。
绑定队列到交换机指定key时,进行通配符模式匹配。
四、RabbitMQ与项目结合
使用boot
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
yml
现在代码操作的端口就是5672了不是15672切记
server:
port: 8081
spring:
rabbitmq:
host: localhost
username: guest
password: guest
port: 5672
当然要在主启动类加上rabbitmq开启注解
@EnableRabbit
@SpringBootApplication
@EnableRabbit
public class SpringBootRabbitmq {
public static void main(String[] args) {
SpringApplication.run(SpringBootRabbitmq.class,args);
}
}
使用rabbitmq的话要对消息序列化不然可能会乱编码 需要一个RabbitmqConfig 解决
@Configuration
public class RabbitmqConfig {
//Rabbitmq json序列化
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
rabbitmq封装了一个工具类RabbitTemplate
点进去就可以看到这个方法,这个就经常用的发送消息的方法
我就用点对点测试
接受:
public void test1(){
Object test = rabbitTemplate.receiveAndConvert("mrtang");
System.out.println(test);
}
创建广播模式
路由不用写 因为他绑定的全有队列都能收到,接受和单点一样
public void testFanout(User user){
rabbitTemplate.convertAndSend("test.fanout","",user);
}
创建交换器和队列代码创建
AmqpAdmin创建 交换器 路由绑定 和队列
@Autowired
private AmqpAdmin amqpAdmin;
创建Exchange规则
public void exchanges(){
//创建单点
amqpAdmin.declareExchange(new DirectExchange("directExchange"));
//创建广播
amqpAdmin.declareExchange(new FanoutExchange("fanoutExchange"));
//创建 主题
amqpAdmin.declareExchange(new TopicExchange("topicExchange"));
}
创建队列
public void queue(){
//创建队列 testQueue名称 true 持久化
amqpAdmin.declareQueue(new Queue("testQueue",true));
}
绑定
public void binding(){
//绑定规则
/**
* testQueue 队列名称
* Binding.DestinationType.QUEUE 是绑定队列类型
* fanoutExchange 交换器 名称
* testQueue 路由key
*/
amqpAdmin.declareBinding(new Binding("testQueue",Binding.DestinationType.QUEUE,"fanoutExchange","testQueue",null));
}