返回顶部

RabbitMQ(一)安装与入门

一、MQ概述

MQ全称 Message Queue(消息队列),在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据

  • MQ,消息队列,存储消息的中间件
  • 分布式系统通信两种方式:直接远程调用 和 借助第三方 完成间接通信
  • 发送方称为生产者,接收方称为消费者

二、MQ的优势和劣势

优势:

  • 应用解耦

    如图所示。假设有系统B、C、D都需要系统A的数据,于是系统A调用三个方法发送数据到B、C、D。这时,系统D不需要了,那就需要在系统A把相关的代码删掉。假设这时有个新的系统E需要数据,这时系统A又要增加调用系统E的代码。为了降低这种强耦合,就可以使用MQ,系统A只需要把数据发送到MQ,其他系统如果需要数据,则从MQ中获取即可

    img

  • 异步提速

    如图所示。一个客户端请求发送进来,系统A会调用系统B、C、D三个系统,同步请求的话,响应时间就是系统A、B、C、D的总和,也就是800ms。如果使用MQ,系统A发送数据到MQ,然后就可以返回响应给客户端,不需要再等待系统B、C、D的响应,可以大大地提高性能。对于一些非必要的业务,比如发送短信,发送邮件等等,就可以采用MQ。

    img

  • 削峰填谷

    如图所示。这其实是MQ一个很重要的应用。假设系统A在某一段时间请求数暴增,有5000个请求发送过来,系统A这时就会发送5000条SQL进入MySQL进行执行,MySQL对于如此庞大的请求当然处理不过来,MySQL就会崩溃,导致系统瘫痪。如果使用MQ,系统A不再是直接发送SQL到数据库,而是把数据发送到MQ,MQ短时间积压数据是可以接受的,然后由消费者每次拉取2000条进行处理,防止在请求峰值时期大量的请求直接发送到MySQL导致系统崩溃

    img

劣势:

  • 系统可用性降低

    系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。

  • 系统复杂度提高

    MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?

  • 一致性问题

    A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?


三、RabbitMQ的特点

RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,官网可查:

  • 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
  • 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
  • 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
  • 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
  • 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
  • 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。

四、RabbitMQ的工作模式

  • 1.简单模式 HelloWorld

    一个生产者、一个消费者,不需要设置交换机(使用 默认的交换机)

    在这里插入图片描述

  • 2.工作队列模式 Work Queue

    一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认 的交换机),工作队列模式也是采用默认的default AMQP交换机,Queue中的消息会被平均分发给多个消费者处理。有两种消息分发方式:

    轮询分发:一个消费者消费一条,按均分配,woek模式下默认是采用轮询分发方式。轮询分发就不写代码演示了,比较简单,比如生产费者发送了6条消息到队列中,如果有3个消费者同时监听着这一个队列,那么这3个消费者每人就会分得2条消息。下面主要介绍公平分发。

    公平分发:根据消费者的消费能力进行公平分发,处理得快的分得多,处理的慢的分得少,能者多劳。

    在这里插入图片描述

  • 3.发布订阅(广播)模式 Publish/subscribe

    扇出模式,消息广播到所有于交换机绑定的队列当中。需要设置类型为fanout的交换机,并且交换机和队列进行绑定, 当发送消息到交换机后,交换机会将消息发送到绑定的队列

    在这里插入图片描述

  • 4.路由模式 Routing

    路由模式,消息发布者指定一个key,消息路由到所有匹配key的队列当中。需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

    在这里插入图片描述

  • 5.通配符模式 Topic

    主题模式,与路由模式差不多,可以通过通配符进行模糊匹配。需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

    在这里插入图片描述


五、安装RabbitMQ

1.安装erLang语言,官网链接


双击.exe文件安装,可以选择安装路径,不然就一路点下一步完成安装

img
右键我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 用户变量 -> 新建
img
用户变量 -> 找到Path变量 -> 编辑 -> 新建
img

使用CMD命令: erl -version 验证安装

2.安装RabbitMQ客户端,官网链接

选择所需要的版本

双击.exe文件安装,可以选择安装路径,不然就一路下一步完成安装

找到安装目录的sin下,打开cmd控制台,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件

img


六、启动RabbitMQ

1.启动服务

双击安装目录sbin文件夹下的rabbitmq-server.bat启动脚本

2.进入控制台

打开浏览器输入http://localhost:15672,账号密码默认是:guest/guest

img

成功跳转到这个界面就ok了


七、SpringBoot整合RabbitMQ

1.创建生产者和消费者SpringBoot模块

2.在pom文件中分别导入依赖

<!-- 导入rabbitmq依赖 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3.分别配置yml (properties)文件,生产端和消费端都一样的配置

spring:
  rabbitmq:
    host: 127.0.0.1 #ip地址
    port: 5672  #端口号
    virtual-host: /
    username: guest #账号
    password: guest #密码

4.编写配置类

package com.example.producer.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    public static final String EXCHANGE_NAME = "topic_exchange";//交换机名称
    public static final String QUEUE_NAME = "topic_queue";//队列名称
    //1.交换机
    @Bean("exchange") //定义bean名称
    public Exchange exchange(){
        return ExchangeBuilder
                .topicExchange(EXCHANGE_NAME)
                .durable(true)  //durable持久化
                .build();
    }
    //2.queue队列 //定义bean名称
    @Bean("queue")
    public Queue queue(){
        return QueueBuilder
                .durable(QUEUE_NAME)    //durable持久化
                .build();
    }
    //3.队列和交换机绑定
    @Bean
    public Binding bindQueueExchange(
            @Qualifier("queue") Queue queue,
            @Qualifier("exchange") Exchange exchange){

            return BindingBuilder
                    .bind(queue)//绑定队列
                    .to(exchange)//绑定交换机
                    .with("queue.")//routingKey可以理解为组名为queue的小组
                    .noargs();//不需要参数
    }
}

5.编写生产者测试类并运行,生成消息队列

@SpringBootTest(classes = ProducerApplication.class)
@RunWith(SpringRunner.class)
public class ProducerTest {
    //1.注入RabbitTemplate
    @Resource
    private RabbitTemplate rabbitTemplate;
    //2.发送消息
    @Test
    public void testSend(){
        /*convertAndSend参数:
            交换机名
            routingKey可以理解为组名为queue,成员hello
            消息
        */
        rabbitTemplate.convertAndSend(EXCHANGE_NAME,"queue.hello","这是一个消息。。。。。。");
    }
}

5.1 运行结果



6.编写消费者监听类

@Component
public class RabbitMQListener {
    @RabbitListener(queues = "topic_queue")//topic_queue为监听的队列名
    public void ListenerQueue(Message msg){
        System.out.println(new String(msg.getBody()));//输出消息body部分
    }
}

6.1 运行消费者启动类

@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

6.2 运行结果


posted @ 2023-04-07 16:21  r1se  阅读(50)  评论(0编辑  收藏  举报