rabbitMQ学习笔记(认识架构,运行原理,安装)

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
注意:重启服务器后生效。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值