RabbitMQ(一)

 

本文大纲:

  1.  消息队列概述

  2.  RabbitMQ介绍

  3.  RabbitMQ 工作模式

  4.  Spring Boot整合RabbitMQ
      

一、消息队列概述

  1.1 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

MQ全称为Message Queue,消息队列作用在(一个)应用程序和(一个或多个)应用程序之间进行通信过程中保存消息的容器。【是在消息的传输过程中保存消息的容器 】

  1.2 常见产品

  常见的消息中间件(MOM)产品有(部分):

 

  1.3 MQ的常见应用场景

  应用解耦、异步处理、流量削峰

  1.4  思考

  所有服务间调用是否都可以使用MQ?不是

  记住一个原则:调用方实时依赖执行结果的业务场景,使用直接调用,而不是MQ 。

  1.5  AMQP 和 JMS(api)

  • AMQP高级消息队列协议,是一个进程间传递异步消息的网络协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。

  • JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

  • JMS和AMQP区别

    • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式

    • JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的

    • JMS规定了两种消息模式(P2P、P/S);而AMQP的消息模式更加丰富

 

二、RabbitMQ介绍

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

RabbitMQ官方地址:http://www.rabbitmq.com/

 

三、RabbitMQ 工作模式

RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ);

官网对应模式介绍:https://www.rabbitmq.com/getstarted.html

3.1  简单模式

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

 

 

 

 

3.2  Work queues工作队列模式

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

 

 

 

 

3.3  发布订阅模式 Publish/subscribe

也叫Fanout广播模式,需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列,一个消息可以被多个消费者都收到。

 

 

 Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!

 

3.4  路由模式 Routing

需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

 

 

 

 

 

3.5  通配符模式 Topic

需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列。

 

 

Topic类型与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符 

Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割。通配符规则见图。

Topic主题模式可以实现 Publish/Subscribe发布与订阅模式Routing路由模式 的功能;只是Topic在配置routing key 的时候可以使用通配符,显得更加灵活。

 

 

四、Spring Boot整合RabbitMQ

 

  在Spring项目中,可以使用Spring-Rabbit去操作RabbitMQ https://github.com/spring-projects/spring-amqp

尤其是在spring boot项目中只需要引入对应的amqp启动器依赖即可,方便的使用RabbitTemplate发送消息,使用注解接收消息。

  

一般在开发过程中

生产者工程:

  1. application.yml文件配置RabbitMQ相关信息
  2. 在生产者工程中编写配置类,用于创建交换机和队列,并进行绑定
  3. 注入RabbitTemplate对象,通过RabbitTemplate对象发送消息到交换机

消费者工程:

  1. application.yml文件配置RabbitMQ相关信息
  2. 创建消息处理类,用于接收队列中的消息并进行处理

实现:

4.1 搭建生产者工程

  1. 创建生产者工程springboot-rabbitmq-producer
  2. 添加依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
View Code

   3.创建启动类ProducerApplication

@SpringBootApplication
public class RabbitMqProviderApplication {

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

    // 创建队列
    @Bean
    public Queue topicQueue(){
        return new Queue("topic_queue_spring_boot");
    }

    // 创建交换机
    @Bean
    public Exchange topicExchange(){
        return new TopicExchange("topic_exchange_spring_boot");
    }

    // 将队列绑定到交换机
    @Bean
    public Binding topicQueueBind(Queue topicQueue, Exchange topicExchange){
        return BindingBuilder.bind(topicQueue).to(topicExchange).with("item.#").noargs();
    }

}
View Code

  4. 配置RabbitMQ,创建application.yml配置文件

spring:
  rabbitmq:
    host: localhost
    port: 5672
    virtual-host: /test
    username: admin
    password: 123456
View Code

 

4.2 搭建消费者工程

  1. 创建消费者工程springboot-rabbitmq-consumer
  2. 添加依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
View Code

  3.创建启动类ConsumerApplication

@SpringBootApplication
public class ConsumerApplication {

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

  4. 配置RabbitMQ,创建application.yml配置文件

spring:
  rabbitmq:
    host: localhost
    port: 5672
    virtual-host: /test
    username: admin
    password: 123456

  5.编写消息监听器类MessageListener

@Component
public class MessageListener {

    /**
     * 监听某个队列的消息
     * @param message 接收到的消息
     */
    @RabbitListener(queues = "topic_queue_spring_boot")
    public void myListener1(String message){
        System.out.println("消费者接收到的消息为:" + message);
    }
}

4.3 测试

在生产者工程rabbitmq-producer中创建测试类RabbitMQTest,发送消息:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqProviderApplicationTests {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void contextLoads() {
        rabbitTemplate.convertAndSend("topic_exchange_spring_boot","item.update", "更新");
        rabbitTemplate.convertAndSend("topic_exchange_spring_boot","item.brand.insert", "插入");
    }

}
View Code

1、先运行上述测试程序(交换机和队列才能先被声明和绑定),然后启动消费者;在消费者工程springboot-rabbitmq-consumer中控制台查看是否接收到对应消息:

 

2、另外;也可以在RabbitMQ的管理控制台中查看到交换机与队列的绑定:

 

 

  至此,整合完毕。

 

posted @ 2020-10-19 22:06  ZFAblog  阅读(81)  评论(0)    收藏  举报