当前位置: 首页 > article >正文

SpringCloud系列教程:微服务的未来(二十四)Direct交换机、Topic交换机、声明队列交换机

前言

在现代消息队列系统中,交换机是实现消息传递和路由的核心组件。本文将重点探讨三种常见的交换机类型:Direct交换机、Topic交换机和声明队列交换机。通过对这三种交换机的详细分析,我们将学习它们的工作原理、应用场景以及如何在实际项目中选择合适的交换机类型。无论你是刚接触消息队列的初学者,还是有一定经验的开发者,相信本篇博客能帮助你更深入地理解交换机的基本概念,并帮助你在使用消息中间件时做出更好的设计决策。


Direct交换机

Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由。

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchange将消息路由到BindingKey与消息RoutingKey一致的队列

在这里插入图片描述
利用SpringAMQP演示DirectExchange的使用
需求如下:

  1. 在RabbitMQ控制台中,声明队列direct.queue1和direct.queue2
  2. 在RabbitMO控制台中,声明交换机hmall.direct,将两个队列与其绑定
  3. 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
  4. 在publisher中编写测试方法,利用不同的RoutingKey向hmall.direct发送消息

创建队列direct.queue1和direct.queue2
在这里插入图片描述
在这里插入图片描述
创建交换机hmall.direct
在这里插入图片描述
声明 routing key并绑定队列
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
消费者代码如下:

	@RabbitListener(queues = "direct.queue1")public void listenDirectQueue1(String message)throws Exception {log.info("消费者1监听到direct.queue2的消息,["+message+"]");}@RabbitListener(queues = "direct.queue2")public void listenDirectQueue2(String message)throws Exception {log.info("消费者2监听到direct.queue2的消息,["+message+"]");}

测试代码如下:

	@Testpublic void TestDirectQueue(){//1.交换机名String exchangeName = "hmall.direct";//2.消息String message = "Hello 红色!";//3.发送消息 rabbitTemplate.convertAndSend(exchangeName,"red", message);}

运行结果如下:
在这里插入图片描述
测试代码如下:

	@Testpublic void TestDirectQueue(){//1.交换机名String exchangeName = "hmall.direct";//2.消息String message = "Hello 蓝色!";//3.发送消息 rabbitTemplate.convertAndSend(exchangeName,"blue", message);}

运行结果如下:
在这里插入图片描述Direct交换机与Fanout交换机的差异:

  • Fanout交换机将消息路由给每一个与之绑定的队列
  • Direct交换机根据RoutingKey判断路由给哪个队列
  • 如果多个队列具有相同RoutingKey,则与Fanout功能类似

Topic交换机

TopicExchange也是基于RoutingKey做消息路由,但是routingKey通常是多个单词的组合,并且以,分割。
Queue与Exchange指定BindingKey时可以使用通配符:

  • #:代表0个或多个单词
  • *:代表一个单词

在这里插入图片描述
利用SpringAMQP演示DirectExchange的使用
需求如下:

  1. 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
  2. 在RabbitMQ控制台中,声明交换机hmall.topic,将两个队列与其绑定
  3. 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  4. 在publisher中编写测试方法,利用不同的RoutingKey向hmall.topic发送消息

在这里插入图片描述
创建队列topic.queue1和topic.queue2
在这里插入图片描述
在这里插入图片描述
创建交换机hmall.topic
在这里插入图片描述
绑定队列关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消费者代码如下:

	@RabbitListener(queues = "topic.queue1")public void listenTopicQueue1(String message)throws Exception {log.info("消费者1监听到topic.queue1的消息,["+message+"]");}@RabbitListener(queues = "topic.queue2")public void listenTopicQueue2(String message)throws Exception {log.info("消费者2监听到topic.queue2的消息,["+message+"]");}

测试代码如下:

	@Testpublic void TestTopicQueue(){//1.交换机名String exchangeName = "hmall.topic";//2.消息String message = "Hello 今日新闻!";//3.发送消息 参数分别是:交换机名称、RoutingKey(暂时为空)、消息rabbitTemplate.convertAndSend(exchangeName,"china.news", message);}

运行结果如下:
在这里插入图片描述
当routing key为china.weather,运行结果如下:
在这里插入图片描述
Topic交换机相比Direct交换机的差异:

  • Topic的RoutingKey和bindingKey可以是多个单词,以.分割
  • Topic交换机与队列绑定时的bindingKey可以指定通配符
  • #:代表0个或多个词
  • *:代表1个词

声明队列交换机

SpringAMQP提供了几个类,用来声明队列、交换机及其绑定关系:

  • Queue:用于声明队列,可以用工厂类QueueBuilder构建
  • Exchange:用于声明交换机,可以用工厂类ExchangeBuilder构建
  • Binding:用于声明队列和交换机的绑定关系,可以用工厂类BindingBuilder构建

在这里插入图片描述
例如,声明一个Fanout类型的交换机,并且创建队列与其绑定:

@Configuration
public class FanoutConfig{//声明FanoutExchange交换机@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("hmall.fanout");}//声明第1个队列@Beanpublic Queue fanoutQueuel(){return new Queue(fanout.queue1);}//绑 定队列1和交换机@Beanpublic Binding bindingQueuel(Queue fanoutQueuel, FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueuel).to(fanoutExchange);}//...略,以相同方式声明第2个队列,并完成绑定中 
}
@Configuration
public class FanoutConfig{//声明FanoutExchange交换机@Beanpublic FanoutExchange fanoutExchange(){return ExchangeBuilder.fanoutExchange("hmall.fanout").build();}//声明第1个队列@Beanpublic Queue fanoutQueuel(){return QueueBuilder.durable("fanout.queue1").build();}

通常在消费者这一端声明队列和交换机

package com.itheima.consumer.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 FanoutConfiguration {@Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("hmall.fanout");}@Beanpublic Queue fanoutQueue1(){return new Queue("fanout.queuue1");}@Beanpublic Binding fanoutQueue1binding( Queue fanoutQueue1, FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}@Beanpublic Queue fanoutQueue2(){return new Queue("fanout.queuue2");}@Beanpublic Binding fanoutQueue2binding( Queue fanoutQueue2, FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}
}

在这里插入图片描述


总结

通过本文的学习,我们深入了解了Direct交换机、Topic交换机和声明队列交换机的特点和使用场景。Direct交换机适用于点对点的消息传递,Topic交换机适合广播和发布/订阅模式,而声明队列交换机则在确保消息可靠性和一致性方面发挥重要作用。每种交换机都有其独特的优势和适用场景,掌握它们的应用将有助于我们在设计消息系统时做出更明智的选择。在实际项目中,了解这些基础概念将提升我们架构设计的能力,确保系统的高效性和稳定性。

相关文章:

SpringCloud系列教程:微服务的未来(二十四)Direct交换机、Topic交换机、声明队列交换机

前言 在现代消息队列系统中,交换机是实现消息传递和路由的核心组件。本文将重点探讨三种常见的交换机类型:Direct交换机、Topic交换机和声明队列交换机。通过对这三种交换机的详细分析,我们将学习它们的工作原理、应用场景以及如何在实际项目…...

Sojson高级加密技术科普

1. 引言 什么是Sojson? Sojson是一款用于JavaScript代码加密与混淆的工具,它能够有效保护前端代码的知识产权,避免开发者的心血被随意窃取。 为什么需要代码加密? 在当今的互联网环境下,代码被轻易复制、篡改或逆向…...

mysql多主集群 galera cluster for mysql 8安装配置启动重启集群

[TOC] 一、安装mysql 1、安装 系统环境: Ubuntu 18.04 64位 MySQL 8.0.19 下载MySQL APT安装配置包 首先访问 https://dev.mysql.com/downloads/repo/apt/ 获取配置包下载地址 wget https://dev.mysql.com/get/mysql-apt-config_0.8.14-1_all.deb sudo dpkg -i mysq…...

gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致

问题 :gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致 现象: [cxqiZwz9fjj2ssnshikw14avaZ rpc]$ git push Username for https://gitee.com: beihangya Password for https://beihangyagitee.com: To https://gitee.c…...

个人搭建CDN加速服务 特网科技

在互联网快速发展的今天,网站的加载速度对用户体验有着至关重要的影响,传统的网页加载方式依赖于服务器的性能和网络环境,这使得某些网站的页面加载时间过长,用户体验不佳,为了解决这个问题,许多企业开始采…...

mybatis 入门案例

前言 我们清楚 mybatis 是一个持久层框架,可以非常便捷的操作数据库。如最常见的对数据进行增删改查操作。 项目准备 1 在mybatis 数据库 创建 user 用户表 并插入以下两条数据 以下是一个user.sql 脚本文件如何使用 脚本文件可以参照MySQL数据库的备份与还原_控…...

Spring Boot最新技术特性深度解析与实战应用

一、反应式编程:WebFlux与非阻塞架构 1.1 核心价值与场景 Spring Boot 2.x全面拥抱反应式编程模型,通过Spring WebFlux支持异步非阻塞的请求处理,适用于高并发、低延迟的微服务场景(如实时通信、物联网数据处理)。其基于Reactor库实现,采用事件循环模型,显著提升资源利…...

Python使用Flask结合DeepSeek开发

一、背景 我之前关于DeepSeek使用ollama部署的文章大家可以把DeepSeek大模型部署起来。那么ollama还提供了可以调用对应部署模型的API接口。我们可以基于这些接口,做自己的二次开发。使用pythonflaskollama就可以进行模型对话调用。并且前端采用SSE的技术&#xff0…...

前端常见面试题-2025

vue4.0 Vue.js 4.0 是在 2021 年 9 月发布。Vue.js 4.0 是 Vue.js 的一个重要版本,引入了许多新特性和改进,旨在提升开发者的体验和性能。以下是一些关键的更新和新特性: Composition API 重构:Vue 3 引入了 Composition API 作为…...

大模型开发实战篇7:语音识别-语音转文字

语音识别大模型,是人工智能领域的一项重要技术,它能够将人类的语音转换为文本。近年来,随着深度学习技术的不断发展,语音识别大模型取得了显著的进展,并在各个领域得到了广泛应用。 主流语音识别大模型 目前&#xf…...

基于JAVA开发APISIX插件实战(1)-开发、部署、调试

我这篇APISIX-JAVA插件实战开编讲述初级工程师才会关心的开发部署调试,主要是因为APISIX-JAVA插件从前文基于JAVA开发APISIX插件-CSDN博客中我们可以了解到,它是通过unix的sock进行RPC的通信的,因此无法生成sock的windows环境是无法进行开发的。 如果使用Mac那么会怎么样?…...

QML 部件获得焦点触发的全局槽函数 onActiveFocusItemChanged

在qml的window窗口中,假如添加里许多其他部件,当这些部件改变时,会有一个全局部件焦点改变槽函数触发,就是 onActiveFocusItemChanged 可以通过此槽函数就可以知道当前焦点在哪一个部件上,也可以做一些自动化测试等&…...

DeepSeek 部署中的常见问题及解决方案:Mac 场景实践指南

DeepSeek 部署中的常见问题及解决方案:Mac 场景实践指南 随着大模型技术的快速发展,DeepSeek 作为开源领域的优秀代表,在本地化部署过程中常会遇到各类技术挑战。本文基于实际部署经验,梳理了五大高频问题及对应解决方案&#xf…...

OlympicArena 论文简介

近年来,大型语言模型(LLMs)和大型多模态模型(LMMs)的飞速发展,让AI逐渐展现出接近人类水平的认知推理能力。然而,如何科学评估AI在复杂问题解决中的真实水平,一直是学术界和产业界的…...

你具备数据素养吗?

在这个外卖平台能预测你明天想点什么的时代,当超市货架摆放都经过算法优化时,我们发现:数据素养已不再是专业人员的专利,而是数字公民的基本生存技能。一位小学班主任通过分析学生错题数据优化教学策略,社区便利店老板…...

如何用ClassFinal加密JAR保护知识产权!

0.前言 凌晨三点的办公室,咖啡杯底凝着褐色的残渍,键盘上跳跃的手指突然停滞。张工程师盯着屏幕上的反编译窗口,自己耗时三个月开发的规则引擎此刻像被解剖的标本般赤裸裸摊开——这正是上周交付给客户的jar包。当.class文件以伪代码形式暴露…...

轨迹优化 | 基于LBFGS优化器的无约束路径平滑(附ROS C++仿真)

目录 0 专栏介绍1 LBFGS优化器1.1 拟牛顿法框架1.2 LBFGS-Lite库 2 基于LBFGS的轨迹优化3 ROS C仿真 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、碰撞检测…...

Vue2到Vue3:无痛升级之路

为什么要从 Vue2 升级到 Vue3 Vue 3 带来了众多令人瞩目的改进和新特性,这些优势使得升级到 Vue 3 对项目的长期发展具有重要意义。 性能显著提升:Vue 3 采用了基于 Proxy 的响应式系统,相比 Vue 2 使用的 Object.defineProperty&#xff0c…...

第28篇 基于ARM A9处理器用C语言实现中断<四>

Q:可以改变上一期实验工程里红色LED计数的速率吗? A:在按键中断服务程序中使HPS Timer 0停止计数,修改定时器中使用的预设计数值,然后重启定时器;所有的修改都是在按键中断服务程序中完成。主程序和其他…...

Linux、Docker与Redis核心知识点与常用命令速查手册

Linux、Docker与Redis核心知识点与常用命令速查手册 一、Linux基础核心 1. 核心概念 文件系统:采用树形结构,根目录为/权限机制:rwx(读/写/执行)权限,用户分为owner/group/others软件包管理: …...

时间序列分析(四)——差分运算、延迟算子、AR(p)模型

此前篇章: 时间序列分析(一)——基础概念篇 时间序列分析(二)——平稳性检验 时间序列分析(三)——白噪声检验 一、差分运算 差分运算的定义:差分运算是一种将非平稳时间序列转换…...

《深度学习》——调整学习率和保存使用最优模型

调整学习率 在使用 PyTorch 进行深度学习训练时,调整学习率是一个重要的技巧,合适的学习率调整策略可以帮助模型更好地收敛。 PyTorch 提供了多种调整学习率的方法,下面将详细介绍几种常见的学习率调整策略及实例代码: torch.opt…...

零风险把数据盘挂载给根分区,给生产环境服务器扩容

背景 刚买服务器时,用户量不大,所以结合预算不多情况下,都是默认买个小点的系统盘挂载到服务器上,(或者默认服务器的40G),等到某一天业务量上来之后,发现抓肘见襟给自己一手措不及防…...

刷题日记4

2025.1.21 2904. 最短且字典序最小的美丽子字符串 2904. 最短且字典序最小的美丽子字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string shortestBeautifulSubstring(string s, int k) {//遍历找到美丽子字符串&#xff0c;更新时候如果<res&…...

在vscode中拉取gitee里的项目并运行

拉取项目: 方法一:vscode点击查看--->终端(或者直接通过快捷键ctrol+ `打开) 在终端内通过cd命令定位到你想存放项目的文件夹 例如:cd h: 通过命令:git clone 地址 例如:git clone newbee-mall-vue-app: 前端代码 等待拉取完成即可在对应文件夹下看到项目啦 方…...

IDEA通过Contince接入Deepseek

Deepseek 的出色表现&#xff0c;上期【Deepseek得两种访问方式与本地部署】 安装Continue插件 第一步、下载插件 在编辑栏【File】->设置【Settiings】或快捷键【CtrlAltS】,弹窗的左侧导航树&#xff0c;选择【plugins】,在marketplace 搜索【Continue】&#xff0c;点…...

Ubuntu如何利用.ibd文件恢复MySQL数据?

## 背景&#xff1a;服务器中&#xff0c;MySQL程序坏了&#xff0c;也没有做定时备份的操作。为了是数据库恢复到最新的。 ## 方法&#xff1a;可以使用MySQL的 .ibd 文件恢复。&#xff08;需要原数据库的表结构&#xff09; ## 文件位置&#xff1a;在Ubuntu系统中&#x…...

github上文件过大无法推送问题

GitHub 对文件大小有限制&#xff0c;超过 100 MB 的文件无法直接推送到仓库中。 解决思路&#xff1a; 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS&#xff1a; 1. 安装 Git LFS 首先&#xff0c;你需要安装 Git LFS。可以按照以…...

数据结构------单向链表。

一.实现单向链表的头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c;按位置插&#xff0c;按位置删&#xff0c;按位置修改&#xff0c;按元素查找&#xff0c;按元素修改&#xff0c;按元素删除&#xff0c;单链表的逆置&#xff0c;查找倒数第几个元素&…...

(.text+0x1b): undefined reference to `main‘

使用vscode Linux g编译出现 /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/Scrt1.o: in function _start: (.text0x1b): undefined reference to main collect2: error: ld returned 1 exit status make: *** [makefile:3: put] Error 1一定记得…...