1.RabbitMQ 重要组件的介绍
通常谈到的队列服务,由三部分组成:生产者、队列、消费者组成;而我们的RabbitMQ实则是在队列服务的基础上生产者与队列之间加了一层交换机。如下图:
名词解释:
名词 | 描述 |
---|---|
生产者 | 上图中,Producer1、Producer2 都为生产者(投送消息的一方)。 |
消息 | 就是服务间通信的数据;消息可以很简单,可是String 类型的一句话,也可以也很复杂,一个对象;消息有两部分组成:消息体和标签,消息体是用来保存消息的,而标签是说明描述这条消息的,例如消息的名称,路由键。 |
路由键 | 生产者将消息发送到交换机的时候,一般都会指定一个路由键(RoutingKey),用来指定这个消息的路由规则,而这个RoutingKey需要与 交换机和绑定键(BindinKey)联合使用才会生效 |
绑定键 | RabbitMQ通过绑定键(BindingKey)将交换机和队列关联起来,在绑定的时候一会会指定一个绑定键,这个时候交换机就知道将消息路由到哪个队列了。 |
交换机 | 当生产者产生消息,而并不是将消息投送到队列,而是将设置好路由键的消息发送到交换机。 |
队列 | 接收交换机路由过来的消息,并存储起来,直到有消费者将这条消息消费掉,才会将这条消息删除。 |
消费者 | 消费者连接到RabbitMQ服务器,消费订阅队列上的消息。 |
上面已经对RabbitMQ每个组成部分详细的介绍了,在这里还需要补充说明一下,交换机的类型:
类型 | 特点 |
---|---|
Direct | direct 类型的行为是”先匹配, 再投送”. 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去. |
Topic | 按规则转发消息(最灵活) |
Headers | 设置 header attribute 参数类型的交换机 (使用较少) |
Fanout | 转发消息到所有绑定队列 |
2.Spring Boot 整合RabbitMQ
2.1 引入整合RabbitMQ所需的jar包
Spring Boot 使用的版本是 2.1.5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2 配置application.yml
设置连接RabbitMQ服务的参数
spring:
application:
name: rabbitmq-demo #应用名词
rabbitmq:
host: 192.168.70.22 # RabbitMQ 服务所安装的ip
port: 5672 # RabbitMQ的端口
username: guest #用户名
password: guest #密码
server:
port: 8080 # 应用端口
2.3 定义RabbitConfig 类,配置Exchange、Queue、及绑定交换机。
@Configuration
public class RabbitmqConfig {
public static final String EXCHANGE_TOPIC_INFO = "exchange_topic_info";
public static final String QUEUE_INFO = "QUEUE_INFO";
/**
* 声明topic类型的交换机
* @return
*/
@Bean(EXCHANGE_TOPIC_INFO)
public Exchange exchange(){
return ExchangeBuilder.topicExchange(EXCHANGE_TOPIC_INFO)
.durable(true) //持久化
.build();
}
/**
* 声明队列
* @return
*/
@Bean(QUEUE_INFO)
public Queue queue(){
return new Queue(QUEUE_INFO);
}
/**
* 将队列与交换机绑定
* @param queue
* @param exchange
* @return
*/
@Bean
public Binding binding(@Qualifier(QUEUE_INFO) Queue queue,@Qualifier(EXCHANGE_TOPIC_INFO) Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("*.*").noargs();
}
}
发送消息
@RestController
public class ProductController {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/send1")
public void sendMessage(){
String message = "this is my first message!";
rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_TOPIC_INFO,"aa.bb",message);
}
}
发送请求 http://localhost:8080/send
查看 RabbitMQ界面
可以看出我们的消息已经发送成功。
2.4 消费者 代码
@Component
public class Consumer {
@RabbitListener(queues = {"QUEUE_INFO"})
public void consumer(String msg){
System.out.println(msg);
}
}
启动消费者应用 ,打印出两条消费的数据
这时我们再次查看RabbitMQ界面,
消费者消费了消息后,队列会将消息删除。