rabbitmq一文彻底弄懂rabbitmq的四种交换机原理及springboot实战应用(代码片段)

干饭两斤半 干饭两斤半     2023-01-27     723

关键词:

交换机概念

交换机可以理解成具有路由表的路由程序,仅此而已。每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字符串。

最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

交换机的作用: 生产者向broker(rabbitmq服务器)发送消息,交换机通过生产者绑定的路由键,将消息推送到不同的消息队列中。而消费者,只绑定队列,从队列中获取消息。

direct 直连交换机

工作模式图解

生产者发送的消息;交换机会根据不同的路由键,发送到对应的队列;

springboot代码

MQ配置类,声明交换机、队列,路由键绑定

/**
 * 声明交换机、队列、路由键绑定
 * /
@Configuration
puvlic class RabbitConfig 
	/**
	 * 创建直连交换机
	 */
	@Bean
	public DirectExchange createExchange() 
	    // 交换机名字;是否持久化;是否自动删除
		return new DirectExchange("testE", true, false);
	
	/**
	 * 创建队列
	 */
	@Bean
	public Queue createQueue() 
	    // 交换机名字;是否持久化;是否自动删除
		return new Queue ("testQ", true, false, false);
	
	/**
	 * 通过路由键绑定交换机和队列
	 */
	@Bean
	public Binding createBinding() 
	    // 交换机名字;是否持久化;是否自动删除
		return BindingBuilder
		.bind(this.createQueue())
		.to(this.createExchange())
		.with("testR");
	

生产者

/**
 * 消息生产者
 */
@Service
public class ProduceMsg 
	@Autowire
	private RabbitTemplate rabbitTemplate;
	public void sendMsg(Object msg)
		// 消息唯一标识
	 	CorrelationData correlationData= new CorrelationData();
	 	correlationData.setId(msg.getId());
		rabbitTemplate.converAndSend("testE", "testR", msg, correlationData);
	

消费者

@Conponent
public class ConsumeMsg 
	/**
	 * 消费者监听队列
	 */
	@RabbitListener(queues = "testQ")
	public void sendMsg(String msg)
		log.info("接收到消息:", msg);
		// ......业务逻辑消费消息;
	

Fanout扇出交换机

工作模式图解

生产者发送到交换机的消息;会发送到绑定到该交换机的所有队列

springboot代码

MQ配置类,声明交换机、队列,绑定

/**
 * RabbitMQ配置类
 */
@Configuration
public class RabbitMqConfig 
    @Bean
    public Queue fanoutQueueA()
    
        return new Queue("queueA", true, false, false);
    
 
    @Bean
    public Queue fanoutQueueB()
    
        return new Queue("queueB", true, false, false);
    
 
    @Bean
    public Queue fanoutQueueC()
    
        return new Queue("queueC", true, false, false);
    
 
    @Bean
    FanoutExchange fanoutExchange()
    
        return new FanoutExchange("exchangeFanout");
    
 
    @Bean
    Binding bindingExchangeA()
    
        return BindingBuilder.bind(fanoutQueueA()).to(fanoutExchange());
    
 
    @Bean
    Binding bindingExchangeB()
    
        return BindingBuilder.bind(fanoutQueueB()).to(fanoutExchange());
    
 
    @Bean
    Binding bindingExchangeC()
    
        return BindingBuilder.bind(fanoutQueueC()).to(fanoutExchange());
    

生产者

/**
 * 消息生产者
 */
@Service
public class ProduceMsg 
	@Autowire
	private RabbitTemplate rabbitTemplate;
	public void sendMsg(Object msg)
		// 消息唯一标识
	 	CorrelationData correlationData= new CorrelationData();
	 	correlationData.setId(msg.getId());
		rabbitTemplate.converAndSend("exchangeFanout", "", msg, correlationData);
	

消费者

@Conponent
public class ConsumeMsg 
	/**
	 * 消费者监听队列
	 */
	@RabbitListener(queues = "testQ")
	public void sendMsg(String msg)
		log.info("接收到消息:", msg);
		// ......业务逻辑消费消息;
	

Topic主题交换机

topic模式跟direct的区别是,topic模式可以用通配符的方式,对路由键进行绑定;达到更灵活路由消息的效果。
交换机的routingKey不能随意写;必须是以点号分隔;如aa.bb; cc.dd.ee等形式
*号代表一个单词;#号代表0个或多个单词

工作模式图解

图中队列1绑定的路由键是 *.*.routeA
图中队列2绑定的路由键是 routeA.#
生产者向该交换机的routeA.xxx.routeA路由键发送消息;那么队列1和2都会收到消息

springboot代码

MQ配置类,声明交换机、队列,绑定


@Configuration
public class TopicRabbitMqConfig

    /**
     * 队列A
     */
    @Bean
    public Queue topicQueueA() 
        return new Queue("topic_queue_A", true, false, false);
    
 
    /**
     * 队列B
     */
    @Bean
    public Queue topicQueueB() 
        return new Queue("topic_queue_B", true, false, false);
    
 
    /**
     * Topic交换器
     */
    @Bean
    TopicExchange exchange() 
        return new TopicExchange("topic_exchange", true, false);
    
 
    /**
     * 绑定A
     */
    @Bean
    Binding bindingExchangeQueueA() 
        //将队列和交换机绑定, 并设置用于匹配键:routingKey
        return BindingBuilder.bind(topicQueueA()).to(exchange()).with("*.*.routeKey");
    
 
    /**
     * 绑定B
     */
    @Bean
    Binding bindingExchangeQueueB(Queue topicQueueB, TopicExchange exchange) 
        //将队列和交换机绑定, 并设置用于匹配键:routingKey
        return BindingBuilder.bind(topicQueueB()).to(exchange()).with("routeKey.#");
    

生产者

/**
 * 消息生产者
 */
@Service
public class ProduceMsg 
	@Autowire
	private RabbitTemplate rabbitTemplate;
	public void sendMsg(Object msg)
		// 消息唯一标识
	 	CorrelationData correlationData= new CorrelationData();
	 	correlationData.setId(msg.getId());
		rabbitTemplate.converAndSend("topic_exchange", "routeKey.test.routeKey", 
	
	msg, correlationData);
	

这个生产者发送的消息;队列topic_queue_Atopic_queue_B都会接收到该生产者发送的消息

header交换机

该交换机不同于其他机制,且实际开发不常用,此处不作讲解

rabbitmq交换器的四种模式

rabbitmq交换器的四种模式:1.fanout:fanout类型的Exchange会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 2.direct:direct类型的Exchange会把消息路由到那些bindingkey与routingkey完全匹配的Queue中。 3.topic:topic... 查看详情

rabbitmq交换器的四种模式

rabbitmq交换器的四种模式:1.fanout:fanout类型的Exchange会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 2.direct:direct类型的Exchange会把消息路由到那些bindingkey与routingkey完全匹配的Queue中。 3.topic:topic... 查看详情

一文带你彻底搞懂springboot-rabbitmq(代码片段)

...le模式,共计创建三个子modulecommon:通用实体信息rabbitmq-publisher:消息发布者,基于SpringBootrabbitmq-subscriber:消息订阅者,基于SpringBoot在消息发布者和订阅者两个项目中加入rabbitmqmaven依赖&l 查看详情

rabbitmq交换器的四种模式

rabbitmq交换器的四种模式:1.fanout:fanout类型的Exchange会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。 2.direct:direct类型的Exchange会把消息路由到那些bindingkey与routingkey完全匹配的Queue中。 3.topic:topic... 查看详情

rabbitmq一文读懂(代码片段)

目录1、RabbitMQ介绍应用场景其他消息队列选择RabbitMQ原因2、AMQP消息队列其他相关知识什么是AMQP?什么是JMS?3、RabbitMQ快速入门RabbitMQ的工作原理RabbitMQ消息发送和接受流程梳理RabbitMQ消息发送RabbitMQ消息接受RabbitMQ安装Rabbi... 查看详情

3.rabbitmq第一个程序

RabbitMQ消息服务器主要解决应用程序之间异步消息传输问题,传统的MQ分为点对点和主题与订阅,RabbitMQ使用Exchange(交换机)实现更加灵活的消息传递。前面介绍过几个概念,RoutingKey,Binding,Queue,Exchange,Binding将Exchange和Queue绑定... 查看详情

一文彻底弄懂“commonjs”与“esmodule”区别(代码片段)

简介文章中就不具体解释什么是“CommonJs”与“EsModule”了,我们先简单的描述一下“CommonJs”与“EsModule”的区别。它们有三个重大差异。CommonJS模块输出的是一个值的拷贝,ES6模块输出的是值的引用。CommonJS模块是运行... 查看详情

gis风暴一文彻底弄懂数字地形(demdomtdomdsm)的区别与联系

在2021自然资源部发布的《实景三维中国建设技术大纲(2021版)》中,空间数据部分包括“数字高程模型(DEM)、数字表面模型(DSM)、数字正射影像(DOM)、真正射影像(TDOM)、倾斜摄影三维模型、激光点云等。”那么到底什... 查看详情

rabbitmq四种交换机类型介绍

RabbitMQ 原文地址:https://baijiahao.baidu.com/s?id=1577456875919174629&wfr=spider&for=pc最新版本的RabbitMQ有四种交换机类型,分别是Directexchange、Fanoutexchange、Topicexchange、Headersexchange。DirectExchange处理路由 查看详情

一文彻底弄懂linux-shell编程(代码片段)

一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式... 查看详情

一文彻底弄懂linux-shell编程(代码片段)

一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式... 查看详情

一文彻底弄懂linux-shell编程(代码片段)

一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式... 查看详情

玩转rabbitmq系列01:一文带你敲响rabbitmq的大门(代码片段)

...帮助,点赞、收藏、留言都是对我最大的动力【玩转Rabbitmq系列】文章直通车~【玩转Rabbitmq系列】01:一 查看详情

gis风暴一文彻底弄懂数字地形(demdomtdomdsm)的区别与联系

在2021自然资源部发布的《实景三维中国建设技术大纲(2021版)》中,空间数据部分包括“数字高程模型(DEM)、数字表面模型(DSM)、数字正射影像(DOM)、真正射影像(TDOM)、倾斜摄影三维模型、激光点云等。”那么到底什... 查看详情

rabbitmq四种集群架构

参考技术A一、主备模式warren(兔子窝),一个主/备方案(主节点如果挂了,从节点提供服务,和ActiveMQ利用Zookeeper做主备一样)二、远程模式Shovel(架构简单,配置复杂,使用的少)三、镜像模式四、多活模式 查看详情

一文读懂rabbitmq消息队列

前言RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。AMQP,即AdvancedMessageQueuingProtocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息... 查看详情

一文读懂rabbitmq消息队列

前言RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。AMQP,即AdvancedMessageQueuingProtocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息... 查看详情

cookie从入门到进阶:一文彻底弄懂其原理以及应用(代码片段)

来自秦一授权的分享Cookie是什么?FortunecookieCookie,它的名字源自一种叫Fortunecookie的饼干,这种饼干里面有一张写着精辟句子的小纸条。在浏览器中,Cookie是服务器让浏览器帮忙携带信息的手段,就像饼干里的... 查看详情