RabbitMq(二)一文彻底弄懂RabbitMq的四种交换机原理及springboot实战应用

交换机概念

交换机可以理解成具有路由表的路由程序,仅此而已。每个消息都有一个称为路由键(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交换机

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干饭两斤半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值