首先复习一下我们使用消息队列的原因:削峰、异步、解耦。
然后我们在本地安装一个RabbitMQ。
在安装RabbitMQ之前,我们先得安装erlang语言,因为它是RabbitMQ的开发语言。
erlang的安装包下载地址为:https://www.erlang.org/downloads (下载比较慢的时候建议挂梯子或百度云)
erlang的安装没什么好讲的,就普通的安装程序而已,但是要注意不能有中文安装路径。
安装好之后,打开电脑环境变量配置。配置ERLANG_HOME。
然后再PATH加上erlang的bin目录。
保存之后打开CMD,输入erl ,提示版本号说明前面的操作都成功。
接下来安装RabbitMQ,下载地址:https://www.rabbitmq.com/install-windows.html (我这是windows演示,下载慢挂梯子或者百度云)
RabbitMQ的安装也是普通安装,记得安装路径不能有中文和空格。
安装好之后开始菜单会有这几个快捷方式。
我们先执行stop ,别管原来有没有启动,先把它关闭了,然后双击start,提示启动成功。
如果start没有成功,那就stop->remove->(re)install->start的顺序再来一遍。
启动成功之后,我们到rabbit的安装目录的sbin文件夹下
按住shift,在空白处右键,选择“在此处打开PowerShell窗口”。键入
.\rabbitmq-plugins.bat enable rabbitmq_management
然后回车,会开始安装管理插件,首次安装是提示6个,我这里因为已经安装过所以只提示了3个。
然后到浏览器访问,RabbitMQ的默认端口是16572
http://localhost:15672/
输入默认的账户名和密码,都是 guest 然后点击“Login”
进入了RabbitMQ的管理界面,前面的操作就算成功了。
接下来我们学习消息队列中间件RabbitMQ与SpringBoot的整合(与SpringCloud无关,所以只启动了eurek,网关和配置中心都忽略掉)。
我们模拟最简单的场景,生产者发送消息,多个消费者获取消息。我就不新建项目了,直接使用member作为生产者,order作为消费者。
首先在他们的父项目parent引入依赖。
<!-- 消息队列 RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
这样member和order都能直接使用amqp了。
接下来我们在member的application.yaml添加我们的rabbitmq的连接参数,(order也需要添加,但是由于我全部使用默认,所以order不加也一样)
之后在member的controler中增加一个接口用来新增消息。
使用RabbitTemplate工具类将简化我们的配置和代码。调用其converAndSend方法,指定交换机和队列之后可以直接发送消息,消息的格式为object对象。
最后在启动前加上@EnableRabbit
启动成功之后,RabbitMQ的管理页面会增加一个连接。(若启动失败,请检查jar包是否下载完整,我被这个坑了一天,一直提示RabbitTemplate未注入到Spring)
然后我们在RabbitMQ管理页面中手动添加交换机和队列(根据上面代码的来,我的交换机为test,路由为q1)
队列创建好之后点击一下它的名称,就会进入到队列详情里,在Bind里绑定交换机和路由。
绑定之后消息才能准确发送到队列中,然后调用接口发送消息。
然后我们在RabbitMQ页面就可以看到增加了一条消息,我们可以通过Get Messages查看消息,并且不会消耗掉,Ready为未消耗掉的消息。
然后我们准备消费者,消费者往往通过监听去获取消息,当然也可以通过RabbitTemplate的receiveAndConvert来主动消费。
消费者代码简单贴一下
package com.study.api.mq;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
@Component
public class CousumerService {
@RabbitListener(queues = "q1")
@RabbitHandler
public void onMessage(Message message){
// 1. 收到消息以后进行业务端消费处理
System.err.println("收到消息:" + message.getPayload());
}
}
然后同样也要在启动类中加上@EnableRabbit
启动成功之后马上就收到刚刚的消息了。
我们换个端口再启动一个消费者
然后再发几条消息
这可以看得出来是轮询的。消费者不能设置权重但可以给它设置同时处理数量来平衡服务器。