RabbitMQ的简单使用

一. RabbitMQ简介

MQ-消息队列(消息中间件),是用来处理异步问题的。当今市面上有很多消息中间件,ActiveMQ、RabbitMQ、Kafka以及阿里巴巴自研的消息中间件RocketMQ等。
RabbitMQ的简单使用_第1张图片

二. RabbitMQ的六种消息模式

2.1 简单模式
一对一关系
RabbitMQ的简单使用_第2张图片
2.2工作模式
不同消费者之间共享任务。谁都可以完成,但任务只有一个,最终只能由一个消费者完成任务。
RabbitMQ的简单使用_第3张图片
RabbitMQ的简单使用_第4张图片
2.3 发布/订阅模式
不同消费者间不共享任务,收到消息后各做各的事。

RabbitMQ 中消息传递模型的核心思想是生产者从不直接将任何消息发送到队列。实际上,生产者通常根本不知道消息是否会被传递到任何队列。生产者只能向交换器发送消息。交换是一件非常简单的事情。一方面它接收来自生产者的消息,另一方面它将它们推送到队列中。通过交换机与队列的绑定决定消息是否丢弃或推送,应该推送到哪些队列中。
RabbitMQ的简单使用_第5张图片
RabbitMQ的简单使用_第6张图片
2.4 路由直连模式
在生产者与交换机、交换机与队列间通过固定绑定键决定消息将发送到哪些队列中,发送到所有匹配的队列中。

在这个设置中,我们可以看到绑定了两个队列的直接交换X。第一个队列使用绑定键orange进行绑定,第二个队列有两个绑定,一个使用绑定键black,另一个使用green。在这样的设置中,使用路由键橙色发布到交换的消息 将被路由到队列Q1。带有黑色 或绿色路由键的消息将发送到Q2。所有其他消息将被丢弃。
RabbitMQ的简单使用_第7张图片
2.5 路由主题模式
在生产者与交换机、交换机与队列间通过模糊绑定键决定消息将发送到哪些队列中,且只发送到最先匹配到的队列中。

路由键设置为“ quick.orange.rabbit ”的消息将被传递到两个队列。消息“ lazy.orange.elephant ”也将发送给他们两个。另一方面,“ quick.orange.fox ”只会进入第一个队列,而“ lazy.brown.fox ”只会进入第二个队列。“ lazy.pink.rabbit ”只会被传递到第二个队列一次,即使它匹配两个绑定。“ quick.brown.fox ” 不匹配任何绑定,因此将被丢弃。
RabbitMQ的简单使用_第8张图片
2.6 RPC模式

  • 当客户端启动时,它会创建一个匿名独占回调队列。
  • 对于 RPC 请求,客户端发送具有两个属性的消息: reply_to,设置为回调队列,correlation_id,设置为每个请求的唯一值。
  • 请求被发送到rpc_queue队列。
  • RPC 工作者(又名:服务器)正在等待该队列上的请求。当一个请求出现时,它会使用reply_to字段中的队列完成这项工作并将带有结果的消息发送回客户端。
  • 客户端等待回调队列中的数据。当出现一条消息时,它会检查correlation_id属性。如果它与请求中的值匹配,则将响应返回给应用程序。
    RabbitMQ的简单使用_第9张图片

三. RabbitMQ的简单使用

此处不做安装介绍,若还没有安装RAbbitMQ,可以参照官网文档介绍RabbitMQ官方文档
3.1 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

3.2 配置RabbitMQ

spring:
  rabbitmq:
    host: ip
    username: admin
    password: admin
    port: 5672

3.3 初始化Rabbit

package com.autel.export.server.config;

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * rabbitMq 配置
 */
@Configuration
public class AmqpConfig {

    @Resource
    private AmqpAdmin amqpAdmin;

    @Bean
    public MessageConverter messageConverter()
    {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public void initRabbitmq() {
        //rabbitmq初始化...
        amqpAdmin.declareExchange(new DirectExchange("export.syslog.exchange"));
        amqpAdmin.declareQueue(new Queue("syslog",true));
        amqpAdmin.declareBinding(new Binding("syslog",Binding.DestinationType.QUEUE,"export.syslog.exchange","syslog",null));
    }
}

3.4 发送消息
RabbitMQ的简单使用_第10张图片
3.5 消费消息
RabbitMQ的简单使用_第11张图片

你可能感兴趣的:(微服务架构,其他)