前言
MQ,消息队列,排队处理消息。以下为如何离线安装rabbitMQ
一、Linux安装rabbitMQ
1、前提
(1)mq以及erlang下载地址: https://www.rabbitmq.com/install-rpm.html#downloads ,有四个,选择第一个即可。我这里选择的是3.6.6版本。
(2)rabbitMQ是用erlang语言写的,需要先安装erlang
(3)在 /user/local/ 下新建文件夹rabbitMQ,将两个安装包复制到这里。
2、安装erlang
(1)在rabbitMQ文件夹下,安装erlang
rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm
(2)验证是否安装成功
3、安装rabbitMQ
(1)安装
rpm -ivh rabbitmq-server-3.6.6-1.el7.noarch.rpm
(2)如果提示依赖检测失败,安装socat
yum install socat
(3)再次安装rabbitMQ
rpm -ivh rabbitmq-server-3.6.6-1.el7.noarch.rpm
二、配置
1、开启服务和查看状态
service rabbitmq-server stop #关闭
service rabbitmq-server start #启动
service rabbitmq-server status #状态
2、添加用户 admin、用户授权
(1)添加用户、授权
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
(2)查询用户
rabbitmqctl list_users
(3)查询用户权限
rabbitmqctl list_permissions -p /
3、开启远程访问
修改配置文件 /etc/rabbitmq/rabbitmq.config
进入 /etc/rabbitmq/ 没有rabbitmq.config
直接新建编辑 vi rabbitmq.config
rabbitmq.config里添加以下配置
[
{rabbit,
[
{tcp_listeners, [5672]},
{loopback_users, ["admin"]}
]
}
].
4、开启web管理界面
(1)开启web管理界面
rabbitmq-plugins enable rabbitmq_management
(2)开放5672(代码访问端口)和15672(web页面端口)端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
5、浏览器访问
ip:15672 例如: 192.168.1.206:15672
输入添加的用户名和密码登录
三、springboot结合rabbitMQ
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、application.properties里配置
spring.rabbitmq.host=192.168.1.102
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
#采用消息确认模式,消息发出去后,异步等待响应
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true
#消费端配置
#消费者监听并发数
spring.rabbitmq.listener.simple.concurrency=10
#最大并发数
spring.rabbitmq.listener.simple.max-concurrency=20
#签收模式 推荐使用manual手工签收
spring.rabbitmq.listener.simple.acknowledge-mode=manual
#限流,每次消费一条,完事再取
spring.rabbitmq.listener.simple.prefetch=5
3、配置类
创建RabbitMQ的配置类 RabbitConfig,用来配置队列、交换器、路由等高级信息。这里我们以入门为主,先以最小化的配置来定义,以完成一个基本的生产和消费过程。
4、生产者
通过注入 AmqpTemplate接口的实例来实现消息的发送, AmqpTemplate接口定义了一套针对AMQP协议的基础操作。在Spring Boot中会根据配置来注入其具体实现。在该生产者,我们会产生一个字符串,并发送到名为 hello的队列中。
5、消费者
通过 @RabbitListener注解定义该类对 hello队列的监听,并用 @RabbitHandler注解来指定对消息的处理方法。所以,该消费者实现了对 hello队列的消费,消费操作为输出消息的字符串内容。
6、测试
(1)创建测试类
(2)启动应用主类
从控制台中,我们看到如下内容,程序创建了一个访问 127.0.0.1:5672的连接。
(3)运行测试类
运行单元测试类,我们可以看到控制台中输出下面的内容,消息被发送到了RabbitMQ Server的 hello队列中。
(4)查看应用主类的控制台
切换到应用主类的控制台,我们可以看到类似如下输出,消费者对 hello队列的监听程序执行了,并输出了接受到的消息信息。
四、使用模式
1、单生产者,多消费者(秒杀,抢红包)
(1)配置
(2)生产者
(3)消费者
(4)controller
打印结果:
生产者发送了十条消息,分别被两个消费者消费了
2、发布订阅
(1)配置类
(2)生产者
(3)消费者
(4)controller
(5)打印结果
由以上结果可知:就算fanoutSender发送消息的时候,指定了routing_key为"abcd.ee",但是所有接收者都接受到了消息
3、topic
(1)配置类
(2)生产者
(3)消费者
(4)controller
(5)打印结果
由以上结果可知:sender1发送的消息,routing_key是“topic.message”,所以exchange里面的绑定的binding_key是“topic.message”,topic.#都符合路由规则,所以sender1发送的消息,两个队列都能接收到;
sender2发送的消息,routing_key是“topic.messages”,所以exchange里面的绑定的binding_key只有topic.#都符合路由规则;所以sender2发送的消息只有队列topic.messages能收到。