RabbitMQ简介
参考:超详细的RabbitMQ入门,看这篇就够了!-阿里云开发者社区 (aliyun.com)
消息中间件
消息指的是两个应用间传递的数据。
“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。
工作方式:在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
就像nacos是微服务平台一样,rabbitmq是消息平台,让两个应用实现消息通信,发消息的向这个平台发,取消息的向这个平台取。而不需要发消息的应用直接联系取消息的应用。
消息队列作用:
-
解耦:各个系统之间发送、接受消息不用直接联系,只需要发到MQ或从MQ上取。减少了系统之间的依赖。
-
异步:不使用MQ,A系统向B系统发消息会调用B系统的功能,这是同步的。使用MQ,A只需发消息到MQ就直接返回,B向MQ取消息,A不用等B执行完,这是异步的,提高了性能。对于一些非必要的业务,比如发送短信,发送邮件等等,就可以采用MQ。
-
削峰:对于突发的大量请求,比如突然的5000条sql请求,Mysql会崩溃。为了减轻请求量,先把5000条sql发到MQ,mysql每次取2000条查询返回,就能防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃。
使用MQ
- 配置文件中先定义交换机和队列的名字、类型等,可定义多个
- 队列是用来储存消息的
- 交换机可以绑定一个或多个队列,发消息时发送给交换机,交换机转发储存到指定队列
- BindingKey:绑定键,交换机都是需要与队列进行绑定,这里交换键可以简单的理解为交换器与队列之间的路径的名称(可以重复,即可以把多条队列以同一绑定键与路由器绑定)
- RoutingKey:路由键,生产者发送消息的时候可以带上路由键发送给交换器,交换器就会根据路由键去匹配队列(路由键 与交换器的匹配)
- 交换机有直接交换机,主题交换机、扇形交换机
直接交换机:将消息发送到与路由键完全匹配的队列。
主题交换机:将消息发送到与路由键匹配的队列,使用通配符匹配。
扇形交换机:将消息发送到所有与其绑定的队列。无需路由键。
当使用直接交换机和主题交换机时:
- 当交换机与队列绑定时没有使用路由键,则向交换机发送消息时,无论你指不指定routingKey,交换机都转发到所有与其绑定的队列
- 当交换机与队列绑定时使用了路由键,则向交换机发送消息时,你可以指定路由键,这时交换机只会转发到,与其绑定的并且routingKey对应的队列
当使用扇形交换机时:
- 当使用扇形交换机时,无需指定绑定键和路由键,每条消息都会发送给与扇形交换机绑定的所有队列
MQ组成与运行模型:
配置MQ消息队列和交换机
@Configuration
public class RabbitConfig {
/**
* 新建队列 名字为 MAXWELL_QUEUE=article
* 1、name: 队列名称
* 2、durable: 是否持久化
* 3、exclusive: 是否独享、排外的。如果设置为true,定义为排他队列。则只有创建者可以使用此队列。也就是private私有的。
* 4、autoDelete: 是否自动删除。也就是临时队列。当最后一个消费者断开连接后,会自动删除。
* @return
*/
@Bean
public Queue articleQueue() {
return new Queue(MAXWELL_QUEUE, true);
}
/**
* 新建交换机 名字为 MAXWELL_EXCHANGE=maxwell
* @return
*/
@Bean
public FanoutExchange maxWellExchange() {
//Fanout交换机
return new FanoutExchange(MAXWELL_EXCHANGE, true, false);
}
/**
* 绑定交换机和队列
* @return
*/
@Bean
public Binding bindingArticleDirect() {
//链式写法,绑定交换机和队列,并设置匹配键
return BindingBuilder
//绑定队列
.bind(articleQueue())
//到交换机
.to(maxWellExchange());
}
/**
* 新建队列 名字为 EMAIL_QUEUE=email
* @return
*/
@Bean
public Queue emailQueue() {
return new Queue(EMAIL_QUEUE, true);
}
/**
* 新建交换机 名字为 EMAIL_EXCHANGE=send
* @return
*/
@Bean
public FanoutExchange emailExchange() {
return new FanoutExchange(EMAIL_EXCHANGE, true, false);
}
/**
* 绑定交换机和队列
* @return
*/
@Bean
public Binding bindingEmailDirect() {
return BindingBuilder.
bind(emailQueue()).
to(emailExchange());
}
}
生产者发送消息
// 发送消息指定一个交换机,交换机能把消息转存到对应的队列。扇形交换机无所谓routingKey,最后写上要发送的消息
rabbitTemplate.convertAndSend(EMAIL_EXCHANGE, "*",new Message(JSON.toJSONBytes(emailDTO), new MessageProperties()));
消费者接收消息
使用监听器接收监听到的消息,之后执行process里的方法处理消息
@Component
@RabbitListener(queuesToDeclare = @Queue(RabbitMQConfig.TOPIC_EXCHANGE_QUEUE_A))
public class TopicExchangeConsumerA {
@RabbitHandler
public void process(Map<String, Object> map) {
System.out.println("队列[" + RabbitMQConfig.TOPIC_EXCHANGE_QUEUE_A + "]收到消息:" + map.toString());
}
}
linux下安装
参考:(158条消息) linux 安装 RabbitMQ_早起的小鸟儿的博客-CSDN博客_linux 安装rabbitmq
本地下载安装包,通过vscode远程连接把文件传输到服务器/usr/local/src目录。打开文件目录。
先安装erlang
解压
tar -xvzf otp_src_23.3.tar.gz
安装依赖:
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel
在 /usr/local 目录创建erlang文件夹
mkdir -p /usr/local/erlang
编译
cd otp_src_25.2 //进入到Erlang目录下
./configure --prefix=/usr/local/erlang --without-javac
安装Erlang,进入/usr/local/src/otp_src_25.2
make && make install
配置erlang环境变量
vim /etc/profile
//添加如下配置信息
export ERLANG_HOME=/usr/local/erlang
export PATH= ${ERLANG_HOME}/bin:${PATH}
source /etc/profile //重新读取配置文件
安装RabbitMQ
解压
xz -d rabbitmq-server-generic-unix-3.11.5.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.11.5.tar
移动到/usr/local/rabbitmq_server目录
mv ./rabbitmq_server-3.11.5/ /usr/local/rabbitmq_server
配置RabbitMQ环境变量
vim /etc/profile
RABBITMQ_HOME=/usr/local/rabbitmq_server/rabbitmq_server-3.11.5
PATH=${RABBITMQ_HOME}/sbin:${PATH}
source /etc/profile //重新读取配置文件
开启rabbitMQweb访问界面。
cd /usr/local/rabbitmq_server/rabbitmq_server-3.11.5/sbin
./rabbitmq-plugins enable rabbitmq_management //开启web管理界面插件
启动rabbitMQ服务
./rabbitmq-server -detached //以守护进程启动
查看线程是否启动:
netstat -tunlp|grep 15672
设置允许远程访问
解决办法1-新加用户
新加个用户,设置权限,设置角色。
rabbitmqctl add_user admin admin
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
//若命令不存在,就直接启动文件
./add_user admin admin
./rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
./rabbitmqctl set_user_tags admin administrator
解决方法2-设置guest
暂略
rabbitMQ简单指令
启动服务:rabbitmq-server -detached【 /usr/local/rabbitmq/sbin/rabbitmq-server -detached 】
重启服务:rabbitmq-server restart
关闭服务:rabbitmqctl stop
查看状态:rabbitmqctl status
列出角色:rabbitmqctl list_users
开启某个插件:rabbitmq-pluginsenable xxx
关闭某个插件:rabbitmq-pluginsdisablexxx
注意:重启服务器后生效。