2019独角兽企业重金招聘Python工程师标准>>>

之前学习了SpringCloud Bus结合MQ,没有多学习MQ,本次学习相关内容,先了解异步,同步就不说了

异步: 客户端非阻塞进程,服务端响应可以是非即时的

应用场景: 
①通知类的服务->发出去即可,无需回应; 
②请求的异步响应->就是客户端发送请求,服务端异步响应请求,客户端不会产生阻塞且是默认响应,但不会立刻送达;
①②都属于1对1交互模式;
③消息->可以实现1对多的交互模式,比如发布订阅模式下,客户端发布消息通知,可以被0到N个服务消费,再例如客户端发送消息等待其他服务的响应

MQ在分布式系统中都会用到的组件,还是很重要的

应用场景: 
①异步处理->比如用户注册的时候,需要手机(邮箱)验证,有的平台用户注册还可以加用户积分(经验)奖励,还有什么身份证认证等等很多,这时候在用户信息写入数据库后,可以通过异步消息让验证服务或者奖励各自执行各自的服务,提升效率,提升用户体验;

②流量控制->比如电商秒杀活动,秒杀时一般会因为流量突然暴涨,过大流量导致服务挂掉,解决此问题,一般会在服务前端加入消息队列,控制可容流量,如果消息队列长度超过最大可容数量,需要丢弃额外的请求(或者跳转其他页面)来控制流量,接着秒杀业务可以根据消息队列中有效的请求信息再做后续的处理;

③日志处理->比如kafka消息队列,其最初设计是为了处理日志,大数据中应用的比较多,当日志数据采集的时候,定时写入kafka队列,然后kafka对数据进行储存,转发等处理;

④服务解耦->接着上面秒杀话题,假设用户抢到,会有订单order服务,商品product服务,用户下单后,order服务需要通知product服务,如果order服务直接调用product服务的接口,这两个服务之间是耦合的;那么使用MQ,用户下单后,order完成持久化并将消息写入MQ队列,返回order订单完成,product服务订阅MQ队列中order的消息,采用推拉的方式获取order下单信息,product服务根据order下单的信息,进行相关product商品的信息的变动(扣库存),如果过程中product服务不能正常执行,也不会影响order服务,因为order服务写入MQ队列之后,就不在关心其他订阅服务的后续操作了,这样就现实了服务解耦;

就用order,product应用来做测试

order 服务

第一步老套路先引入maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

第二步yml配置还是和上篇差不多,将rabbitmq的配置写入了码云git仓库里,利用SpringCloud Bus读取

spring:application:name: ordercloud:config:discovery:enabled: trueservice-id: CONFIGprofile: deveureka:client:service-url:defaultZone: http://localhost:8761/eureka/

希望码云git早点支持动态SpringCloud Bus,能用还是能用,先用着,自己手动post请求好了

MQ接收方: 新建一个ReceiverMsg类,用来测试接收MQ的消息

package com.cloud.order.MQmsg;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class ReceiverMsg {//此处注解指定去获取名为myQueue的queues队列消息@RabbitListener(queues = "myQueue")public void printMQ(String message){log.info("【队列消息】ReceiverMsg ,printMQ={}",message);}}

MQ发送方: 这边直接写在单元测试中,测试是否能成功,代码如下

package order;import com.cloud.order.ServerApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;//由于之前对项目进行了项目多模块化,运行单元测试的时候需要引导main启动类
//没有可以不考虑classes = ServerApplication.class
@SpringBootTest(classes = ServerApplication.class)
@RunWith(SpringRunner.class)
public class MQTest extends OrderApplicationTests{//AmqpTemplate  操作MQ的API@Autowiredprivate AmqpTemplate amqpTemplate;@Testpublic void send() {amqpTemplate.convertAndSend("myQueue","hello , MQ");}}

RabbitMQ : 开启docker中的rabbitmq,在http://192.168.99.100:15672/#/queues中新增一个名为myQueue的队列,用于上面测试

启动服务,可以看到有已经有两个SpringCloudBus队列了,一个是SpringCloud Config,一个是上面的order服务,注册中心eureka一直都是开启状态

接着执行单元测试,在myQueue中的波动,说明有流量: ↓↓↓

调用方法中的print,也在控制台中打印日志 : ↓↓↓

循序渐进,每次操作推拉队列信息的时候,需要方法写一下,rabbitmq面板中手动加一次,肯定是很lower的

将ReceiverMsg类中的注解,改成以下方式,即可自动批量创建Queue

@RabbitListener(queuesToDeclare = {@Queue("myQueue"),@Queue("myQueue2")})

启动项目后,即可生成Queue

Exchange交换机,消息不直接发送到队列,而是发送到了交换机,通过队列绑定交换机转给队列

如果需要绑定Exchange,可以改动注解

@RabbitListener(bindings = @QueueBinding(value = @Queue("myQueue"),exchange = @Exchange("MyExchange")
))

继续order服务中,假设有很多卖方参与,卖奶茶的、卖mac的等等

不同卖方服务会发出不同的MQ消息,比如卖奶茶的只关心奶茶订单、卖mac的只关心mac订单,相互不关心其他的组的信息,机子跑不动了,就模拟多服务处理方式 ↓↓↓

接收方:

@Component
@Slf4j
public class ReceiverMsg {@RabbitListener(bindings = @QueueBinding(key = "milkTea",value = @Queue("milkTeaOrder"),exchange = @Exchange("MyOrder")))public void milkTeaMQ(String message){log.info("【队列消息】ReceiverMsg.milkTeaMQ ,milkTea={}",message);}@RabbitListener(bindings = @QueueBinding(key = "mac",value = @Queue("macOrder"),exchange = @Exchange("MyOrder")))public void macMQ(String message){log.info("【队列消息】ReceiverMsg.macMQ ,macMQ={}",message);}
}

测试 发送方:

@SpringBootTest(classes = ServerApplication.class)
@RunWith(SpringRunner.class)
public class MQTest extends OrderApplicationTests{@Autowiredprivate AmqpTemplate amqpTemplate;@Testpublic void sendMilkTea() {//第一个参数exchange; 第二个参数key; 第三个参数发送的msgamqpTemplate.convertAndSend("myOrder","milkTea","hello , milkTeaMQ");}@Testpublic void sendMac() {amqpTemplate.convertAndSend("myOrder","mac","hello , macMQ");}
}

以上是RabbitMQ的基础使用学习,还有很多高级内容,比如消息延迟处理,优先级等等

之后慢慢研究,有相关学习的同学,可以分享一下地址,Mark一起学习学习,谢谢

----------------------------------------------------------------

转载于:https://my.oschina.net/u/3829444/blog/1836946

SpringCloud 微服务 (十) 消息队列MQ 基础相关推荐

  1. 架构师图谱之微服务和消息队列

    概述 "架构师图谱"是一个很宏大的命题,特别是优秀的架构师自身也是"由点到面再到图",一点点成长积累起来,尝试写这篇文章的目的更多的是结合自身的一些架构.研发. ...

  2. SpringCloud 微服务 (十五) 服务容错 Hystrix

    2019独角兽企业重金招聘Python工程师标准>>> 壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直 ...

  3. OneNET物联网平台06 消息队列MQ服务开启与配置

    消息队列MQ可作为规则引擎对接的扩展增值服务使用,配合物联网套件,可形成具备设备接入.设备管理.消息分发.应用承载能力的高性能服务组合 消息队列MQ具有如下特点: 消息缓存 MQ服务支持消息缓存,可以 ...

  4. 学习笔记:SpringCloud 微服务技术栈_实用篇②_黑马旅游案例

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  5. 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  6. 微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.3 延迟队列 51.3.1 延迟队列 51.3.2 延迟队列插件

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 服务异步通讯 文章目录 微服 ...

  7. 学习笔记:SpringCloud 微服务技术栈_高级篇⑤_可靠消息服务

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  8. Github三天点击破亿,四天助力金九银十,精通SpringCloud微服务架构,成就大厂梦

    又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群众多,技术 ...

  9. SpringCloud微服务技术实践与总结(基础篇)

    1.认识微服务 1.1.单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署. 单体架构的优缺点如下: 优点: 架构简单.部署成本低 缺点: 耦合度高(维护困难.升级困难) 1.2 ...

最新文章

  1. html 自动跳转5秒,html 实现5秒倒计时跳转首页
  2. 一条简单的 SQL 执行超过1000ms,纳尼?
  3. 姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测
  4. Ember.js 入门指南——路由切换的终止和回跳
  5. mysql 索引条件推送_MySQL 处理where条件 index condition pushdown索引条件下推
  6. kafka重复消费问题
  7. 6款程序员不得不爱的bootstrap模板
  8. WinUI 3 试玩报告
  9. 简述SAS逻辑库的概念及建立方法。什么是临时库和永久库?
  10. 修改2440里面的FriendlyARM
  11. oracle基本的操作命令,oracle命令基本操作
  12. 为什么优秀和听话总是难两全?
  13. 手机可用熵_时间之矢,生命之熵
  14. 适合高中生看的科普类书籍,助力一窥科学世界
  15. 技术领导者空降后,如何管理全新的团队
  16. android 显示大屏幕_android android如何将优化的体验带到大屏幕
  17. 遥控视频小车实际应用效果以及功能实现
  18. 10 大话设计模式C++实现之模板方法模式
  19. 题9.5:有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输人10个 学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓 名、3门课程成绩、平均分数)。
  20. 在SWD模式下用SEGGER J-Flash 下载STM32.hex文件

热门文章

  1. .NET自动化测试工具链:Selenium+NUnit+ExtentReport
  2. 一个简单视频网站开发小记
  3. iOS.访问通讯录.02.写入联系人
  4. visual c++ for .net(新语法)
  5. Linux-鸟菜-1-Linux简介
  6. 【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
  7. 【数字信号处理】序列分类 ( 单边序列和双边序列 | 左边序列 | 右边序列 | 有限序列和无限序列 | 稳定序列和不稳定序列 )
  8. 【计算理论】计算复杂性 ( 算法复杂度标记 | 渐进上界 | 大 O 记号 | 常用的渐进上界 )
  9. 【集合论】二元关系 ( A 上二元关系 | A 上二元关系示例 )
  10. 【计算机网络】网络层 : DHCP 协议 ( DHCP 协议概念 | DHCP 协议特点 | DHCP 协议流程 )