RabbitMQ= Message Queue 消息队列
素材来源(支持原创):
源码链接: link
官网链接: link
简介
RabbitMq是一个广泛使用的消息服务器,采用Erlang语言编写,是一种开源的实现AMQP(高级消息队列协议)的消息中间件
What is RabbitMQ?
常用的消息中间件
MQ的应用场景
异步处理
按照正常流程下订单操作需要700ms, 通过MQ异步执行 只需要200ms 向MQ发送完消息即可
系统解耦
以前系统之间是 A发送B、然后在发送C、D系统 如果再加一个E系统 A系统还需要再发送E系统... 麻烦
添加MQ后
1.A系统只需要发送消息到MQ上 谁需要消息 谁去MQ上拿去即可
2.系统A可以是Java编写 B系统可以使用Go编写 C系统使用Python编写
流量削峰(限流)
通过添加MQ实现限流的操作, 如果没有MQ,QPS请求全部打到数据库上,会造成DB服务器的压力,有可能宕机,现在将请求发送到MQ上 通过系统B来匀速消费请求
日志处理
在微服务环境中,系统可能有成千上百个,每个服务器都会记录大量日志 logger.info() 当我们查看日志的时候 ,需要到每一台服务器上去查看, 现在我们的请求全都发送到MQ上 查看起日志更加方便
主要通过ELK(elastic search +logstash +kabana)日志收集系统在kabana上查看
RabbitMQ的运行环境搭建
- Erlang以及RabbitMq的版本选择(要配套)
版本兼容说明地址:
下载安装Erlang(采用25.1.1版本) 下载好后上传到linux上
因为RabbitMQ是Erlang语言开发的 要先下载安装Erlang
[ErLang下载地址:](https://www.erlang.org/patches/otp-25.1.1)
- 由于Erlang需要其他依赖 所以安装Erlang需要先安装其他依赖
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
**说明:yum -y install 是linux安装依赖的命令 -y代表自动确认下载**
- 解压Erlang文件
tar -zxvf opt-src-25.1.1.tar.gz -C /usr/local
**说明:-C 是指定目录 不写就是当前目录**
- 配置
因为下载的Erlang是源代码包,需要把它编译成可以运行的
./configure
- 编译
make
说明:执行make命令 把源代码编译成可以运行的程序
- 安装
make install
说明: 执行make install 就是将编译后能运行的程序 添加到path下 类似配置java_home 执行后就可以在任何地方都可以运行Erlang了
- 验证Erlang是否安装成功 输入
erl
代表成功
下载安装RabbitMQ(3.10.11)
-
下载RabbitMq安装包 上传到linux上
RabbitMQ下载地址: -
展开下载包
tar -xvf rabbitmq-server-generic-unix-3.10.11.tar.xz -C /usr/local
说明: 不需要解压 tar -zxvf 直接展开就好 tar -xvf 添加 -C 就是展开在指定的目录
- 进入展开的位置 启动rabbitMQ
cd /usr/local
cd rabbitmq_server-3.10.11/
cd sbin/
./rabbitmq-server //启动rabbitMq
- 启动、关闭RabbitMq 以及查看RabbitMQ状态
./rabbitmq-server -detached //后端启动
ps -ef|grep rabbit // 查看rabbitMQ进程
./rabbitmqctl status // 查看rabbitMQ当前状态
./rabbitmqctl shutdown //关闭rabbitMQ
- 配置RabbitMQ的环境变量
- 打开配置文件
vi +$ /etc/profile // 打开配置文件 添加+$ 表示光标选中文件的最后一行
- 添加环境变量
RABBIT_HOME=/usr/local/rabbitmq_server-3.10.11
PATH=$PATH:$RABBIT_HOME/sbin
export RABBIT_HOME PATH
- 保存退出 :wq!
- 刷新配置文件
source /etc/profile
- 然后就可以在任何地方启动rabbitMQ了
rabbitmq-server -detached //启动rabbitMQ
rabbitmqctl status //查看rabbitMQ状态
添加rabbitMQ用户 赋予角色+权限
rabbitmqctl add_user admin 123456 // 添加用户:admin 密码:123456
rabbitmqctl list_users //查看添加用户列表
rabbitmqctl set_user_tags admin administrator // 设置用户:admin 角色:administrator
rabbitmqctl set_permissions ".*" ".*" ".*" //设置用户admin权限为:可读 可写 可配置
rabbitmqctl list_permissions //查看用户权限
启动RabbitMQ的web后台 需要添加插件
cd /usr/local/rabbitmq_server-3.10.11/sbin //切换到sbin下
rabbitmq-plugins list //查看rabbitMQ下的插件
rabbitmq-plugins enable rabbitmq_management //启动rabbitmq_management 插件
- 然后就可以执行
http://192.168.110.178:15672/ 来访问rabbitMQ了 这个时候不行 需要打开防火墙
systemctl status firewalld // 查看防火墙状态
systemctl disable firewalld //设置防火墙开启不自动启动
systemctl stop firewalld //关闭防火墙
出现下图表示成功
添加虚拟主机步骤如图
RabbitMQ的工作模型
交换机的类型
- 扇形交换机
- 群发策略 提供者发送消息到 交换机 上 交换机绑定几个队列 就将消息发送几遍
- 配置类
@Configuration
public class RabbitConfig {
// rabbitMQ 三部曲
// 1.定义交换机
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("exchange.fanout");
}
// 2.定义队列
@Bean
public Queue queueA(){
return new Queue("queue.fanout.a");
}
@Bean
public Queue queueB(){
return new Queue("queue.fanout.b");
}
// 3.绑定交换机和队列 扇形交换机不需要路由 直接绑定交换机就行了
@Bean
public Binding bingingA(FanoutExchange fanoutExchange,Queue queueA){
return BindingBuilder.bind(queueA).to(fanoutExchange);
}
@Bean
public Binding bingingB(FanoutExchange fanoutExchange,Queue queueB){
return BindingBuilder.bind(queueB).to(fanoutExchange);
}
}
- 业务类
@Component
@Slf4j
public class MessageService {
@Resource
private RabbitTemplate rabbitTemplate;
public void sendMessage(String exchange,String routingKey,String message){