服务异步通信-Fanout

请添加图片描述
个人名片:

博主酒徒ᝰ.
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志三人行,必有我师焉。

请添加图片描述
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

三、SpringAMQP

3.发布、订阅模型-Fanout

发布( Publish )、订阅( Subscribe )
发布订阅模式与之前案例的区别就是允许将同一消息发送给多个消费者。实现方式是加入了exchange(交换机)。
常见exchange类型包括:

Fanout:广播
Direct:路由
Topic:话题

在这里插入图片描述

注意:exchange负责消息路由,而不是存储,路由失败则消息丢失
发布订阅-Fanout Exchange
Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue

案例:利用SpringAMQP演示FanoutExchange的使用

实现思路如下:
在consumer服务中,利用代码声明队列、交换机,并将两者绑定
在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
在publisher中编写测试方法,向itcast.fanout发送消息

步骤1:在consumer服务声明Exchange、Queue、Binding

SpringAMQP提供了声明交换机、队列、绑定关系的API

在consumer服务常见一个类,添加@Configuration注解,并声明FanoutExchange、Queue和绑定关系对象Binding,代码如下:
在这里插入图片描述

package cn.itcast.mq.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutConfig {
    
    
    @Bean
    public FanoutExchange fanoutExchange() {
    
    
        return new FanoutExchange("itcast.fanout");
    }

    @Bean
    public Queue fanoutQueue1() {
    
    
        return new Queue("fanout.queue1");
    }

    @Bean
    public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {
    
    
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Queue fanoutQueue2() {
    
    
        return new Queue("fanout.queue2");
    }

    @Bean
    public Binding bingingQueue1(Queue fanoutQueue2, FanoutExchange fanoutExchange) {
    
    
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}

步骤2:在consumer服务声明两个消费者
在consumer服务的SpringRabbitListener类中,添加两个方法,分别监听fanout.queue1和fanout.queue2:

@RabbitListener(queues = "fanout.queue1")
public void listenFanoutQueue1(String msg) throws InterruptedException {
    
    
    System.out.println("消费者1接收到Fanout消息:【"+ msg +"】");
}

@RabbitListener(queues = "fanout.queue2")
public void listenFanoutQueue2(String msg) throws InterruptedException {
    
    
    System.out.println("消费者2接收到Fanout消息:【"+ msg +"】");
}

步骤3:在publisher服务发送消息到FanoutExchange
在publisher服务的SpringAmqpTest类中添加测试方法:

@Test
public void testFanoutExchange() {
    
    
    String exchangeName = "itcast.fanout";
    String message = "hello, everyone";
    rabbitTemplate.convertAndSend(exchangeName, "", message);
}

在这里插入图片描述

总结:

  1. 交换机的作用是什么?
    接收publisher发送的消息
    将消息按照规则路由到与之绑定的队列
    不能缓存消息,路由失败,消息丢失
    FanoutExchange的会将消息路由到每个绑定的队列
  2. 声明队列、交换机、绑定关系的Bean是什么?
    Queue
    FanoutExchange
    Binding

猜你喜欢

转载自blog.csdn.net/m0_65144570/article/details/133106247