Rabbit之服务异步通讯
创始人
2025-05-30 08:17:45

目录

1. 同步通讯和异步通讯

1.1 同步通信与异步通信区别:

1.2 同步调用的问题 

1.2.1 同步调用的缺点

1.2.2 总结 

1.3 异步调用方案

1.3.1 异步调用常见实现就是事件驱动模式 

1.3.2 事件驱动优势

1.3.3 总结

1.4 快速入门MQ 

1.4.1 RabbitMQ概述

1.4.2 总结 

1.4.3 常见消息模型 

1.4.4 HelloWorld案例 

1.4.5 总结

2. SpringAMQP

2.1 什么是SpringAMQP

2.2 利用SpringAMQP实现HelloWorld中的基础消息队列功能 

2.2.1 总结

2.3 Work Queue 工作队列 

2.3.1 总结  

2.4 发布( Publish )、订阅( Subscribe )

2.4.1发布订阅-Fanout Exchange 

2.5 发布订阅-DirectExchange

2.5.1 总结

2.6 发布订阅-TopicExchange

2.6.1 总结

2.7 SpringAMQP-消息转换器 

 2.7.1 消息转换器

 2.7.2 总结


1. 同步通讯和异步通讯

手机通话属于同步通信,微信聊天属于异步通信 

1.1 同步通信与异步通信区别:

   1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
    2.同步通信效率高;异步通信效率较低。
    3.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
    4.同步通信可用于点对多点;异步通信只适用于点对点。

1.2 同步调用的问题 

 微服务间基于Feign的调用就属于同步方式,存在一些问题。

同步调用的时间之和为调用给微服务之和及自身时间之和(耗时长,用户体验差)

1.2.1 同步调用的缺点

1.2.2 总结 

1.3 异步调用方案

1.3.1 异步调用常见实现就是事件驱动模式 

1.3.2 事件驱动优势

1.3.3 总结

 

1.4 快速入门MQ 

MQ (MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

1.4.1 RabbitMQ概述

RabbitMQ的结构和概念

1.4.2 总结 

  

1.4.3 常见消息模型 

1.4.4 HelloWorld案例 

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

• publisher:消息发布者,将消息发送到队列queue • queue:消息队列,负责接受并缓存消息 • consumer:订阅队列,处理队列中的消息

 

 

1.4.5 总结

2. SpringAMQP

2.1 什么是SpringAMQP

SpringAmqp的官方地址:Spring AMQP 

 

  • Basic Queue 简单队列模型
  • Work Queue 工作队列模型
  • 发布、订阅模型-Fanout
  • 发布、订阅模型-Direct
  • 发布、订阅模型-Topic
  • 消息转换器 

2.2 利用SpringAMQP实现HelloWorld中的基础消息队列功能 

流程如下:

  1. 在父工程中引入spring-amqp的依赖
  2. 在publisher服务中利用RabbitTemplate发送消息到simple.queue这个队列
  3. 在consumer服务中编写消费逻辑,绑定simple.queue这个队列 

步骤1:引入AMQP依赖 


   
org.springframework.boot
spring-boot-starter-amqp

步骤2:在publisher中编写测试方法,向simple.queue发送消息 

1.在publisher服务中编写application.yml,添加mq连接信息:

spring:rabbitmq:host: 192.168.150.101 # 主机名port: 5672 # 端口virtual-host: / # 虚拟主机username: itcast # 用户名password: 123321 # 密码

2.在publisher服务中新建一个测试类,编写测试方法: 

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class SpringAmqpTest {     @Autowired     private RabbitTemplate rabbitTemplate;@Test     public void testSimpleQueue() {          String queueName = "simple.queue";         String message = "hello, spring amqp!";         rabbitTemplate.convertAndSend(queueName, message);     }
}

步骤3:在consumer中编写消费逻辑,监听simple.queue 

  

2.2.1 总结

 

 

2.3 Work Queue 工作队列 

 Work queue,工作队列,可以提高消息处理速度,避免队列消息堆积

 

消费者代码

 

2.3.1 总结  

 

 

2.4 发布( Publish )、订阅( Subscribe

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

 

注意:exchange负责消息路由,而不是存储,路由失败则消息丢失

Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue 

2.4.1发布订阅-Fanout Exchange 

利用SpringAMQP演示FanoutExchange的使用

实现思路如下:

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

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

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

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

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

步骤2:在consumer服务声明两个消费者

在consumer服务的SpringRabbitListener类中,添加两个方法,分别监听fanout.queue1和fanout.queue2:

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

 步骤3:在publisher服务发送消息到FanoutExchange

 2.4.2 总结

2.5 发布订阅-DirectExchange

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

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

 

  

 

2.5.1 总结

 

2.6 发布订阅-TopicExchange

 

 

 

2.6.1 总结

2.7 SpringAMQP-消息转换器 

 

 2.7.1 消息转换器

 

 2.7.2 总结

 

相关内容

热门资讯

一口一口吃掉yolov8(2) 前面介绍了训练的第一个部分,也是大部分人在网上找得到的文章,但是后面2个...
lol女枪西部牛仔有没有特效,... lol女枪西部牛仔有没有特效目录lol女枪西部牛仔有没有特效烬哪个皮肤手感好?lol女枪西部牛仔有没...
灭鼠神器超声波管用吗,超声波灭... 灭鼠神器超声波管用吗目录灭鼠神器超声波管用吗超声波灭老鼠有效果吗?电子猫超声波驱鼠器电子灭鼠器,管用...
5173交易账号收多少手续费啊... 本篇文章极速百科给大家谈谈5173交易账号收多少手续费啊,以及5173账号交易收费标准对应的知识点,...
父亲节是每年的几月几号呢,父亲... 父亲节是每年的几月几号呢目录父亲节是每年的几月几号呢父亲节母亲节是几月几号 父亲节和母亲节是每年的几...
53-exec进程替换 exec进程替换 一.exec系列 1.execl #include#include#include...
CF1737E Ela Goe... CF1737E Ela Goes Hiking 题目大意 nnn 只蚂蚁站成一排,第 ...
福州一日游哪里好玩,福州一日游... 福州一日游哪里好玩目录福州一日游哪里好玩福州一日游必去景点福州一天游,求推荐去哪福州一日游,有什么好...
新车5到6万买什么车好,预算5... 新车5到6万买什么车好目录新车5到6万买什么车好预算5万,有哪些车款可以推荐?买车5-6万买什么车好...
网络语言JMS是什么意思(jm... 本篇文章极速百科给大家谈谈网络语言JMS是什么意思,以及jms是什么意思中文翻译对应的知识点,希望对...
苹果6id锁怎么强制解除,苹果... 苹果6id锁怎么强制解除目录苹果6id锁怎么强制解除苹果六忘记ID激活锁怎么办如何强制解除id锁的方...
机器人阻抗控制(二) #阻抗控制 #机器人控制 #动力学方程 《Cartesian Impedance Control o...
SkyWalking 日志收集 SkyWalking 日志收集一、需求二、步骤2.1 pom文件引入依赖2.2 logback-sp...
DETR网络模型构建 这篇文章主要为记录DETR模型的构建过程 首先明确DETR模型的搭建顺序:首先是bac...
算法强化每日一题--组队竞赛 大家好 先看看题目 链接:组队竞赛__牛客网 [编程题]组队竞赛 牛牛举办了一次编...
什么是人际交往,什么是人际交往... 什么是人际交往目录什么是人际交往什么是人际交往?影响人际交往的因素有哪些?什么是人际交往人际交往指的...
自考大专什么时候报名,自考大专... 自考大专什么时候报名目录自考大专什么时候报名自考大专怎么报名 报考时间在几月份?每年的什么时候报名自...
蚕的变化过程,蚕的一生经历了哪... 蚕的变化过程目录蚕的变化过程蚕的一生经历了哪几个阶段?咨询:蚕的演变过程?蚕的生长变化顺序是怎样的?...
汽车出现service是什么意... 汽车出现service是什么意思目录汽车出现service是什么意思车上的service是什么意思?...
arcpy基础篇(6)-制图脚... arcpy.mapping模块可以实现地图制图的自动化,它的具体功能包括管理地图文档、...
基于 Zynq 的振动台控制器... 3 振动台控制器架构设计与实现 如前所述,Zynq-7000 本身已经具有了独特的架...
为什么手机收不到验证码短信,为... 为什么收不到短信验证码 3. 曾经向运营商申请过屏蔽短信号码,或添加过黑名单。 4. 短...
中国移动如何免费领取10G流量... 中国移动如何免费领取10G流量目录中国移动如何免费领取10G流量免费领10g流量的软件中国移动送10...
描写孩子童真的句子,孩子童真的... 描写孩子童真的句子目录描写孩子童真的句子孩子童真的唯美句子有哪些?描写童真童趣的一段话,急急!!!描...
QQ空间如何自定义封面,进入q... QQ空间如何自定义封面目录QQ空间如何自定义封面进入qq空间时的封面怎么设置?不花钱的那种怎样制作Q...
55-kill命令及实现kil... kill命令及实现kill命令 一. kill命令简介 在Linux系统中,kill命...
【问题与方法】如何使用vsco... 码字不易,如果各位看官感觉该文章对你有所帮助,麻烦点个关注,...
OMM导致tomcat引用假死 背景 在开发测试环境发现一个奇怪的情况,因查询100w条数据导致OOM,...
座落是哪个坐,座落是座还是坐?... 座落是哪个坐目录座落是哪个坐座落是座还是坐?座位是广字框的左还是哪个座?座落的意思座落是哪个坐 ...
人在什么情况下会失温(人体失温... 今天给各位分享人在什么情况下会失温的知识,其中也会对人体失温如何自救进行解释,如果能碰巧解决你现在面...