什么是RabbitMQ
RabbitMQ是实现了AMQP(advanced message queue protocol)[高级消息队列协议]的开源消息代理软件(亦称面向消息的中间件)。
rabbitmq核心概念
publisher
消息的生产者(发布者),发送消息的程序就是生产者。
message
消息,由消息头和消息体组成,消息头存放的是路由键(routing-key)还有一些其他的,消息体则是我们自己设置的需要发送的消息了。
exchange
交换机,用来接受生产者发送的信息并通过一定规则路由到指定的消息队列(queue)。
binding
绑定,用于消息队列和交换机之间的关联。
queue
消息队列,用来存放生产者发送的消息队列,简单来说就是一个容器,消费者可以从此接受到消息。
consumer
消息的消费者,接受消息的即是消费者。
rabbitmq大概结构图如下:
为什么需要使用rabbitmq
支持多种消息传递协议,消息排队,传递确认,到队列的灵活路由,多种交换类型;部署为集群以实现高可用性和吞吐量;跨多个可用区域和区域联合;插件众多,方便扩展;跨语言,可以使用任何常用的编程语言进行开发。。。。
上面都是摘抄的官网,太抽象,这里举个例子,rabbitmq可以理解为以前的邮局,以前发送邮件每个人都是直接将信件和收件人地址告诉邮局就行了,不用管具体怎么送到收件人的,可以知道,每个人既可以是发信人,也可以是收件人,同理,一个应用程序也可以既是生产者,也是消费者。我们不可能自己去寄信直接送到对方手里吧,那还用寄信干啥,或许你会觉得现在谁还会寄信,都直接发微信了,同样,我们发微信也不是直接发到对方手机上,也是先发送给微信服务器端那里,然后微信服务端那里再将信息给你想发给的那个用户,中间过程不用我们知道怎么做到的,例子或许不那么恰当,能理解就好了。
没有使用和使用之后的对比图:
springboot整合rabbitmq
安装就不再赘述了,可以百度看下。
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>配置rabbitmq
spring:
rabbitmq:
addresses: 127.0.0.1
port: 5672
username: guest
password: guest环境准备
为了下面我们方便测试,首先我这直接就在rabbitmq的ui界面上添加了几个交换机,几个队列,以及绑定规则,直接看图把。
交换机exchange
队列queue
绑定规则
代码
package com.lytw13.demo.controller;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("user")
public class PublicController {
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("test1")
public String test1() {
rabbitTemplate.convertAndSend("demo.fanout","","welcome to regist lytw13'blog!");
return "success";
}
@GetMapping("test2")
public String test2() {
rabbitTemplate.convertAndSend("demo.direct","lytw13","welcome to regist lytw13'blog!");
return "success";
}
@GetMapping("test3")
public String test3() {
rabbitTemplate.convertAndSend("demo.topic","lytw13.hello","welcome to regist lytw13'blog!");
return "success";
}
}
测试:
- 访问localhost:8080/user/test01,可以看到3个队列都可收到消息,fanout是不管rounting key,将信息发送给所有队列。
- 访问localhost:8080/user/test02,可以看到只有1个队列可以收到消息,direct是rounting key必须完全符合才会将信息发送给对应队列。
- 访问localhost:8080/user/test03,可以看到有2个队列可以收到消息,topic是rounting key必须匹配设置的规则,*代表一个匹配一个单词,#任意个,符合才会将信息发送给对应队列。
具体代码我已经上传到了github,如果有问题可以参考下。前往