RabbitMQ
何为RabbitMq?
RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言。
RabbitMq原理![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3c1533e0c2b94272be566fe074d3418d.png)
Provider
:消息的生产者Exchange
:消息交换机Binding
:绑定,将交换机与队列进行绑定Queue
:即队列,用于存储消息Consumer
:消息的消费者,如果有多个消费者同时订阅同一个Queue中的消息,Queue中的消息会被平摊给多个消费者
简单来说,就是交换机与相应队列进行绑定,生产者生产消息并发送到对应的交换机中,再由交换机将消息转到到队列中,消费者在从订阅的队列中获取消息进行消费。
交换机类型
Direct Exchange
直连型交换机,根据消息携带的路由键将消息投递给对应队列。
大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X(路由值需要完全匹配),这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。
Fanout Exchange
扇型交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。(消息转发速度较快一些)
Topic Exchange
主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。(类似正则表达式,不需要完全匹配)
安装RabbitMq
Rabbit 安装需要搭建Erlang环境,采用docker安装较为简单
#拉取镜像
docker pull rabbitmq:3-management
#运行镜像 远程连接时阿里云服务器需要配置相应的安全组
docker run -d --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
#进入容器内部
docker exec -it 849d3cbe9e0d bash
#添加用户rabbitmqctl add_user 账号 密码
rabbitmqctl add_user root root
#设置角色rabbitmqctl set_user_tags 账号 角色
rabbitmqctl set_user_tags root administrator
#赋予权限 使用户root具有默认(/)这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
SpringBoot整合RabbitMq
导入maven依赖
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.yml
server:
port: 8080
spring:
#给项目来个名字
application:
name: rabbitmq-provider
#配置rabbitMq 服务器
rabbitmq:
host: *.*.*.*
port: 5672
username: root
password: root
以Direct Exchange为例
rabbitmq配置类
@Configuration
public class DirectRabbitConfig{
//队列 起名:TestDirectQueue
@Bean
public Queue TestDirectQueue() {
return new Queue("TestDirectQueue",true); //true 是否持久 会持久化到磁盘中 rabbitmq重启后消息会依然存在 但会影响性能。改为false时需先确定队列中没有之前设为true产生的消息,否则会报错
}
//Direct交换机 起名:TestDirectExchange