前言
RabbitMQ是用Erlang语言开发的,是一个开源的消息代理软件,其主要功能是作为消息代理,接收和转发消息。它实现了高级消息队列协议(AMQP),用于在分布式系统之间进行可靠的异步通讯。
应用场景:异步处理、应用解耦、流量削峰
RabbitMQ安装
安装Erlang环境
安装RabbitMQ之前需要装一下Erlang环境,为啥呢?可以去官网看一下答案,看不懂英文不要紧,我来告诉你答案,刚开始我就说了,RabbitMQ是用Erlang语言开发的,它的安装包里并没有集成Erlang的环境,因此,需要先安装Erlang。
注意,安装Erlang环境首先得去官网查询一下Erlang与RabbitMQ的版本对应关系
Erlang官网下载地址:https://www.erlang.org/downloads
下载好.exe文件后直接傻瓜式安装即可
配置Erlang环境变量
注意:变量名一定要配置成ERLANG_HOME,变量值就是Erlang的安装目录
win + R输入cmd回车,输入erl或erl -version出现版本号即成功。
安装RabbitMQ
RabbitMQ官网:install-windows-rabbitmq
进入官网直接往下走,直到找到下面的安装人口后直接点击下载
下载好后直接根据图形界面安装完成即可
配置RabbitMQ环境变量
与配置Erlang环境变量相似,变量名和值要改成RabbitMQ
安装管理工具RabbitMQ-Plugins
进入sbin目录下,打开cmd命令窗口输入:
rabbitmq-plugins enable rabbitmq_management
成功会输出以下信息:
启动RabbitMQ
进入安装目录的sbin目录,点击rabbit_server.bat,启动rabbitMQ
启动后输入http://localhost:15672/(默认账号密码是guest)就能进入rabbitMQ管理页面
添加用户
如果使用ip:端口的形式访问输入guest账号密码提示"User can only log in via localhost"
RabbitMQ默认提供了一个guest/guest用户,但是从3.3.0 版本以后该账号只能localhost登陆,解决办法就是通过命令行创建一个管理员账号
通过以下命令创建一个用户user,密码为123456
rabbitmqctl add_user user user123456
创建完成之后通过以下命令设置用户标签为administrator
rabbitmqctl set_user_tags user administrator
给用户user赋予权限,授予user用户可访问虚拟主机 /,并在所有的资源上具备可配置、可写及可读的权限
rabbitmqctl set_permissions -p / user ".*" ".*" ".*"
最后,通过以下命令可以看出当前的所有用户
rabbitmqctl list_users
再次使用ip+端口使用,登录成功
至此,RabbitMQ就安装完成了。
RabbitMQ使用
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>3.4.0</version>
</dependency>
添加配置
在application.yml添加RabbitMQ连接配置信息:
spring:
rabbitmq:
host: 192.168.100.199
port: 15672
username: guest
password: guest
创建配置文件
注意,如果你先写product发送消息时,需要用到RabbitTemplate,这时候有可能会报:Could not autowire. No beans of ‘RabbitTemplate’ type found.即未配置RabbitTemplate.
注意如果传递的消息不是普通类似string类型的,则要配置序列化
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
public static final String EXCHANGE = "exchange_lucy"; //交换机
public static final String QUEUE_NAME = "lucy";
public static final String BINDING_KEY = "lucy.*";
public static final String ROUTING_KEY = "lucy.a";
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter());
return rabbitTemplate;
}
@Bean
Queue queue(){
return new Queue(QUEUE_NAME);
}
//交换机
@Bean
TopicExchange topicExchange(){
return new TopicExchange(EXCHANGE);
}
//绑定关系
@Bean
Binding binding(){
return BindingBuilder.bind(queue()).to(topicExchange()).with(BINDING_KEY);
}
//序列化
@Bean
Jackson2JsonMessageConverter jackson2JsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
}
创建produce
@RestController
@AllArgsConstructor
public class ProduceController {
private final RabbitTemplate rabbitTemplate;
@PostMapping("/rabbitmq/sendMsg")
public String sendMsg(@RequestBody TestVo vo) {
System.out.println("发送消息");
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE,RabbitMQConfig.ROUTING_KEY, vo);
return "success";
}
}
消息传递对象:
@Data
public class TestVo implements Serializable {
private String msg;
private int code;
public TestVo() {
}
}
创建消息接收
@Component
public class MsgConsumer {
@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)
public void handleMsg(TestVo testVo){
System.out.println("监听到消息,处理:"+testVo.getMsg());
}
}
测试
使用postman或者apifox请求接口,后台打印日志