微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.7 DirectExchange

news2025/1/11 6:05:43

微服务框架

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

SpringCloud微服务架构

文章目录

      • 微服务框架
      • SpringCloud微服务架构
      • 16 SpringAMQP
        • 16.7 DirectExchange
          • 16.7.1 发布订阅 - DirectExchange
          • 16.7.2 直接开干
          • 16.7.3 总结

16 SpringAMQP

16.7 DirectExchange

16.7.1 发布订阅 - DirectExchange

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

  • 每一个Queue都与Exchange设置一个BindingKey

在这里插入图片描述

这个BindingKey就像是交换机和消息队列之间约定的暗号一样,现在约定好,将来就按照这个暗号进行通信

  • 发布者发送消息时,指定消息的RoutingKey

在这里插入图片描述

比如现在这个key 为 blue,

  • Exchange将消息路由到BindingKey与消息RoutingKey一致的队列【对暗号】

在这里插入图片描述

这次消息通信,就只有queue1 接收了

在这里插入图片描述

如果再来一个key 为yellow 的消息,就只有queue2 可以接受处理了

【而且】一个队列再和交换机进行绑定关系时,可以指定多个 key

在这里插入图片描述

像上面这样,如果说现在恰好来了一个 key 为 red 的消息

在这里插入图片描述

这样两个队列都会收到,就达到了广播的效果【对比起来,它有Fanout的 特性,但是它比Fanout 更加灵活】

16.7.2 直接开干

利用SpringAMQP演示DirectExchange的使用

整体架构:

在这里插入图片描述

实现思路如下:

  1. 利用@RabbitListener声明Exchange、Queue、RoutingKey

  2. 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2

  3. 在publisher中编写测试方法,向itcast. direct发送消息

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

  1. 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2,

  2. 并利用@RabbitListener声明Exchange、Queue、RoutingKey

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue1"),
        exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT), //默认就是direct 类型
        key = {"red","blue"}
))
public void listenDirectQueue1(String msg){
    System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}


@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue2"),
        exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT), //默认就是direct 类型
        key = {"red","yellow"}
))
public void listenDirectQueue2(String msg){
    System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}

直接重新启动服务,

在这里插入图片描述

OK,启动成功

查看控制台的交换机

在这里插入图片描述

可以看到已经生成 了

点击查看详细信息

在这里插入图片描述

可以看到队列1 和队列2 都绑定了两个key

【发送消息】

举个栗子,指定把消息发送给blue

@Test
public void testSendDirectExchange(){
    //交换机名称
    String exchangeName = "itcast.direct";
    //消息
    String message = "Hello,blue!";
    //发送消息
    rabbitTemplate.convertAndSend(exchangeName,"blue",message);
}

直接运行测试

在这里插入图片描述

OK,发送成功

查看消费者那边的控制台

在这里插入图片描述

OK,效果很明显,只有队列1 收到并消费了消息

【只发给yellow】

@Test
public void testSendDirectExchange(){
    //交换机名称
    String exchangeName = "itcast.direct";
    //消息
    String message = "Hello,yellow!";
    //发送消息
    rabbitTemplate.convertAndSend(exchangeName,"yellow",message);
}

直接运行测试

在这里插入图片描述

OK,发送成功

在这里插入图片描述

效果很明显,这次就只有队列 2 收到了

【现在发给red 】【预期效果是两个队列都能收到】

@Test
public void testSendDirectExchange(){
    //交换机名称
    String exchangeName = "itcast.direct";
    //消息
    String message = "Hello,red!";
    //发送消息
    rabbitTemplate.convertAndSend(exchangeName,"red",message);
}

直接运行

在这里插入图片描述

OK,发送成功,直接查看控制台

在这里插入图片描述

OK,效果很明显,两个队列都收到了

【这就是direct 模式】

回顾一下

步骤1:

在这里插入图片描述

步骤2:

在这里插入图片描述

16.7.3 总结

描述下Direct交换机与Fanout交换机的差异?

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

基于@RabbitListener注解声明队列和交换机有哪些常见注解?

  • @Queue
  • @Exchange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于遗传优化算法的小车障碍物避障路线规划matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 一种通过模拟自然进化过程搜索最优解的方法,对于一个最优化问题,该算法通过一定数量的候选解种群迭代地执行选择、交叉、变异、评价等操作使得种群向更好的解进化。 遗传算…

MyBatisPlus简述

文章目录一、MyBatisPlus入门案例与简介1.入门案例2.springboot整合mybatis的方式3.springboot整合mybatisplus步骤1.创建环境,上面我们已经创建过了步骤2.创建数据库及表步骤2.pom.xml补全依赖步骤3.添加MP的相关配置信息步骤4.根据数据库表创建实体类步骤5.创建Da…

linux安装redis哨兵

安装环境 服务器一台: 服务器IP:172.169.3.251主从端口:6379、6380、6381哨兵端口,26379、26380、26381安装目录:/usr/local/redis配置文件目录:/usr/loca/redis/conf redis安装 1、下载redis wget ht…

设计模式--策略模式

文章目录前言一、未使用设计模式二、策略模式1.定义2.结构三、应用场景四、优缺点优缺参考资料前言 需求: 一天,产品经理走过来对你说。猫啊(自称),帮我设计一个计算器,需要的功能有求最大值,最…

【JavaEE-Servlet】Filter过滤器详解

Filter过滤器熟悉的关键字-Filter(回顾-联系-可以不看)Filter概述何时使用?Filter生命周期过滤器单个实现doFilter方法关于Filter的配置路径Filter的执行顺序在web.xml文件中进行配置的时候,Filter的执行顺序是什么?使…

HTML期末学生大作业-班级校园我的校园网页设计与实现html+css+javascript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

[附源码]Python计算机毕业设计Django停车场管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

使用 JavaScript 检测用户是否在线

有时您可能希望增强您的应用程序以通知用户他们可能已经失去了互联网连接。 用户可能正在访问您的网站并收到缓存版本,因此通常看起来他们的互联网仍在工作。 然而,他们失去了引擎盖下的连接,并且不会加载任何新内容。 在这里向他们显示一些…

博客系统(页面设计)

努力经营当下,直至未来明朗! 文章目录前言一、【博客列表页】blog_list.html参考代码:二、【博客详情页】 blog_detail.html参考代码:三、【博客登录页】login.html参考代码:四、【博客编辑页】参考代码:【…

QFtp的使用

1. 环境 Win10 QT5.9.9 2. 相关说明 Qt5.0之后移除了QFtp类(基于FTP协议实现的一个类),并且使用 QNetworkAccessManager 实现了 Ftp 的上传/下载功能。尽管后者在性能上和稳定性上有所提升,但有些原本 QFtp 有的功能 QNetwork…

什么是微服务?

文章目录什么是微服务微服务技术栈单体架构分布式架构认识微服务微服务技术框架SpringCloud什么是微服务 当我们提到微服务,很多人第一反应就是SpringCloud,但是微服务技术并不能与SpringCloud完全划等号: 微服务是分布式架构的一种&#x…

AI视频监控在畜牧养殖中的技术应用解决方案

一、方案概况 随着养殖业迅猛发展的同时也给养殖业主带来了严峻挑战。对养殖业来说,养殖场大多建立在偏远地区,给集中管理带来不便;畜禽养殖成本大,丢失、偷盗等情况时有发生,容易造成巨大的经济损失。建立一套远程视…

013. N 皇后

1.题目链接: 51. N 皇后 2.解题思路: 2.1.题目要求: 给一个数字 n ,要求返回所有 n 个 皇后能在 n X n 的棋盘上 不相互攻击 的情况。 能攻击到的情况:以皇后自身为原点,横、竖、同斜线(45度…

Linux搭建单机多进程zookeeper集群

01 ZooKeeper是什么 ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基…

用数字隔离器取代传统的光耦合器

介绍 光耦合器是一种已有几十年历史的技术,广泛用于信号隔离,通常提供安全隔离、信号电平移位和地面回路缓解。它们通常用于广泛的终端应用中,包括数据通信电路、开关模式电源系统、测量和测试系统,以及孤立的数据采集系统。光耦…

【入门】初识深度学习

文档背景 机器学习和深度学习的概念十分火热。听上去也很难,不慌,有时候就需要行动在前脑子在后。不管,干就完啦。 前言 人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是研发用于模拟、延…

数据库基本语法

SQL常用语句总结 mysql -u root -p mysql会提示你输入密码&#xff0c;输入安装配置MySQL服务时设置的密码即可。 输入如下命令生成样例数据库&#xff1a; CREATE DATABASE university; USE university; SOURCE <DLL.sql文件路径>; SOURCE <InsertStatements.sql文…

Jenkins实践指南--pipeline概述

1.pipeline概述 1.1 什么是pipeline 从某种抽象层次上讲&#xff0c;部署流水线&#xff08;Deployment pipeline&#xff09;是指从软件版本控制库到用户手中这一过程的自动化表现形式。——《持续交付-发布可靠软件的系统方法》 pipeline 英语愿意为管道&#xff0c;在Jen…

Python之路—200行Python代码搞了个打飞机游戏!!

早就知道pygame模块&#xff0c;就是没怎么深入研究过&#xff0c;恰逢这周未没约到妹子&#xff0c;只能自己在家玩自己啦&#xff0c;一时兴起&#xff0c;花了几个小时写了个打飞机程序。 很有意思&#xff0c;跟大家分享下。 先看一下项目结构 1 2 3 4 5 6 7 8 9 10 11 1…

盒子模型-css

个人学习笔记 文章目录1.什么是盒子模型&#xff1f;2.外边距3.css边框4.内边距1.什么是盒子模型&#xff1f; HTML文档中的每个元素都被描绘成矩形盒子&#xff0c;这些矩形盒子通过一个模型来描述其占用的空间&#xff0c;这个模型称为盒子模型。 盒子模型用四个边界描述&am…