入门RabbitMQ

RabbitMQ核心概念

背景

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )协议的开源实现

AMQP 协议

  • AMQP 全称:Advance Message Queuing Protocol 高级消息队列协议

  • 一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

AMQP 协议模型

在这里插入图片描述

  • server:又称Broker,接受客户端连接,实现AMQP实体服务。
  • Collection:连接,应用程序与Broker的网络连接。
  • Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。
  • Message:消息,服务器与应用程序之间传递的数据,由properties和body组成。properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性,body则是消息体内容。
  • Virtual host:虚拟主机地址,用于进行逻辑隔离(不同应用之间隔离),最上层的消息路由。一个Virtual host里面可以有多个Exchange和Queue,同一个Virtual host 里面不能有相同名称的Exchange和Queue。
  • Exchange:交换机,接受消息,根据路由键转发消息到绑定的队列。
  • binding:Exchange和Queue的一个虚拟连接,binding中可以包含routing key。
  • routing key: 路由键,一个路由规则,虚拟主机可以用它来确定如何路由到一个特定的消息。
  • Queue:消息对列,保存消息并将它转发给消费者。

整体架构

在这里插入图片描述

消息流转

在这里插入图片描述

Exchange 交换机

  • 接受消息,并根据路由键转发消息到所绑定的队列。
    在这里插入图片描述

  • 蓝色框:表示客户端投递消息到Exchange中,Exchange根据路由键将消息转发到所绑定的队列。

  • 绿色框: 表示客户端消费消息,客户端跟队列建立监听并接受消息。

  • 黄色框:Routing key 即为Exchange个Queue建立的绑定关系。

Exchange 属性

  • Name:交换机名称
  • Type:交换机类型 direct、topic、fanout、headers
  • Durability:是否需要持久化,true为持久化
  • Auto Delete:对最后一个绑定到Exchange上的队列删除后,自动删除Exchange。
  • Internal:当前Exchange是否用户RabbitMQ内部使用,默认false。

生产者发消息如果没有指定Exchange,RabbitMQ会使用默认的Exchange:AMQP default (Direct 类型)。
AMQP default Exchange 会根据Routing key 找相同名称的Queue转发消息。如果无法转发就会删除消息
在这里插入图片描述

Direct Exchange 直连交换机

所有发送到Direct Exchange的消息都回转发到Routing key指定的Queue。
Direct模式 即 Exchange、Queue 通过Routing key绑定,Exchange直接通过Routing key找到Queue投递消息。
在这里插入图片描述

	1、请先运行消费者  
	2、客户端maven依赖
	<dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>4.4.2</version>
    </dependency>
		//生产者
 		//省略 创建连接和channel
        String exchange = "test.direct.exchange";
        String routingKey = "test.direct";
        String message = "hello rabbitmq";
        channel.basicPublish(exchange, routingKey, null, message.getBytes());
        channel.close();
        connection.close();
		//消费者
		//此处省略 创建连接和channel
 		String queueName = "testQueue";
        String exchange = "test.direct.exchange";
        String exchangeType = "direct";
        String routingKey = "test.direct";
        //声明交换机
        channel.exchangeDeclare(exchange, exchangeType);
        //声明队列
        channel.queueDeclare(queueName, false, false, false, null);
        //队列、交换机、routing key 三者绑定
        channel.queueBind(queueName, exchange, routingKey);
        
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
        	//监听
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.err.println(message);
            }
        };
        channel.basicConsume(queueName, true, defaultConsumer);
Topic Exchange

所有发送到Topic Exchange的消息被转发到所有关心Routing key中指定Topic的queue上。
Topic模式 即Routing key为模糊的,Exchange 通过Routing key模糊匹配到对应的队列。
通过通配符进行模糊匹配:
" # " 匹配一个或多个词
" * " 匹配一个词
例如:
“log.#” 能够匹配到 “log.info.oa”
“log.*” 只会匹配 “log.oa”、“log.err”
在这里插入图片描述

		//生产者
        //省略 创建连接和channel
        String exchange = "test.topic.exchange";
        String routingKey1 = "log.error";
        String routingKey2 = "log.info";
        String routingKey3 = "log.error.info";
        //我们把routingKey作为消息 方便实验
        channel.basicPublish(exchange, routingKey1, null, routingKey1.getBytes());
        channel.basicPublish(exchange, routingKey2, null, routingKey2.getBytes());
        channel.basicPublish(exchange, routingKey3, null, routingKey3.getBytes());
        channel.close();
        connection.close();
        //消费者
        //省略 创建连接和channel
        String queueName = "topicQueue";
        String exchange = "test.topic.exchange";
        String exchangeType = "topic";
        String routingKey = "log.#";
        //声明交换机
        channel.exchangeDeclare(exchange, exchangeType);
        //声明队列
        channel.queueDeclare(queueName, false, false, false, null);
        //队列、交换机、routing key 三者绑定
        channel.queueBind(queueName, exchange, routingKey);

        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.err.println(message);
            }
        };
        channel.basicConsume(queueName, true, defaultConsumer);
Fonout Exchange 广播

Fanout模式 会把消息推到Exchange下的所有的queue中,所以不需要指定routingkey,指定了也没用!
在这里插入图片描述

        //生产者
        //省略 创建连接和channel
        String exchange = "test.fanout.exchange";
        String routingKey = "";
        //我们把routingKey作为消息 方便实验
        String message = "hello rabbitmq";
        channel.basicPublish(exchange, routingKey, null, message.getBytes());
        channel.close();
        connection.close();
        //消费者
        //省略 创建连接和channel
        String queueName = "fanoutQueue";
        String exchange = "test.fanout.exchange";
        String exchangeType = "fanout";
        String routingKey = "";  //没有指定 routing key
        //声明交换机
        channel.exchangeDeclare(exchange, exchangeType);
        //声明队列
        channel.queueDeclare(queueName, false, false, false, null);
        //队列、交换机、routing key 三者绑定
        channel.queueBind(queueName, exchange, routingKey);

        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.err.println(message);
            }
        };
        channel.basicConsume(queueName, true, defaultConsumer);
Message

Message 消息:由properties和body组成


        //生产者
        //省略 创建连接和channel
        String exchange = "test.exchange";
        String routingKey = "test";
        //我们把routingKey作为消息 方便实验
        String message = "hello rabbitmq";

        AMQP.BasicProperties properties = new AMQP.BasicProperties();
        properties.builder()
                .headers() //自定义扩展
                .deliveryMode(2) //消息持久化
                .expiration("10000") //10s内没有消费 会删除
                ....
                .build();
        channel.basicPublish(exchange, routingKey, properties, message.getBytes());
        channel.close();
        connection.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值