「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用
系列文章(更新ing):
「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现
「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制
「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
「 从0到1学习微服务SpringCloud 」05消费者Fegin
「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config
在上篇文章中,我们已经用到了MQ,用于实现配置自动刷新。接下来,就具体说说MQ的应用场景以及RabbtMq的基本使用。
MQ应用场景
异步处理
比如用户注册之后,需要加积分和发短信。就可以在用户信息入库后,通过异步消息让积分服务和短信服务做它们的事,用户无需等待这个过程,从而提高用户体验。
流量削峰
最常见的是秒杀场景,一般会因为流量暴增,甚至应用挂掉。为解决这种情况,需要在应用前端加入消息队列。服务器接收用户的请求后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。
日志处理
最典型的就是kafka,kafka最初的设计就是为了日志处理,大数据里用得特别多。通过日志采集,定时写入kafka队列,然后kafka对日志进行接收,储存和转发
应用解耦
比如用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。但假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合。引入应用消息队列后,用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功,库存系统阅下单的消息,进行库存操作。在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
消息通讯
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等
基本使用
继续使用eureka-client项目
1.添加maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.添加配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3.Mq接收-发送
有3种接收方式,我这里为了方便,在同一个应用中写的发送和接收,大家可以想象一下它们是在不同应用中,如下
3.1 不自动创建Queue,需要在Mq手动建立对应名字的队列,否则会报"找不到队列"的错误
//接收消息
@Log4j2
@Component
public class MqReceiver {
//不会自动创建队列
@RabbitListener(queues = "myQueue1")
public void receiver1 (String message){
log.info("MqReceiver1: {}", message);
}
}
//发送消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class MqSenderTest{
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void send1(){
amqpTemplate.convertAndSend("myQueue1","Hello!Mq Message!");
}
}
3.2 若Mq中无相应名称的队列,会自动创建Queue
//接收消息
@RabbitListener(queuesToDeclare = @Queue("myQueue2"))
public void receiver2 (String message){
log.info("MqReceiver2: {}", message);
}
//发送消息
@Test
public void send2(){
amqpTemplate.convertAndSend("myQueue2","Hello!Mq Message!");
}
3.3 消息队列分组,将不同的队列归为一组,以不同关键字区分(会自动创建队列)
这里以订单服务为例,假设现有两种订单,一种是数码订单,另一种是水果订单,数码供应商和水果供应商两个服务同时订阅订单服务,但数码供应商只关心数码订单,水果供应商只关心水果订单,这里就需要对订单消息进行分类了
//接收消息
/**
* 数码供应商服务 接收消息
* @param message
*/
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange("myOrder"),//相当于分组名
key = "computer",//相当于分类名
value = @Queue("computerQueue")
))
public void computerReceiver (String message){
log.info("computerReceiver: {}", message);
}
/**
* 水果供应商服务 接收消息
* @param message
*/
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange("myOrder"),//相当于分组名
key = "fruit",//相当于分类名
value = @Queue("fruitQueue")
))
public void fruitReceiver (String message){
log.info("fruitReceiver: {}", message);
}
//发送消息
@Test
public void sen4(){
amqpTemplate.convertAndSend("myOrder","computer","computer Order!");
}
@Test
public void sen5(){
amqpTemplate.convertAndSend("myOrder","fruit","fruit Order!");
}
4.启动eureka-client,eureka-server,config应用,运行刚才写的单元测试
发送接收消息成功啦!
如果觉得不错,分享给你的朋友!
THANDKS
- End -
一个立志成大腿而每天努力奋斗的年轻人
伴学习伴成长,成长之路你并不孤单!
「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用的更多相关文章
- 「 从0到1学习微服务SpringCloud 」10 服务网关Zuul
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...
- 「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 Eureka的高可用需要 ...
- 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! Spring Cloud Eureka 基于Netflix Eureka做了二次封装(Spring Clo ...
- 「 从0到1学习微服务SpringCloud 」01 一起来学呀!
有想学微服务的小伙伴没?一起来从0开始学习微服务SpringCloud,我会把学习成果总结下来,供大家参考学习,有兴趣可以一起来学!如有错误,望指正! Spring .SpringBoot.Sprin ...
随机推荐
- 1134 最长上升子序列 (序列型 DP)
思路: 由于一般的动态规划时间复杂度是O(n^2)(哈哈哈哈 第一次用的就是这个!)用在这里由于n最大为50000 所以会超时 到这里我们可以用一个数组来动态维护这个最长上升的子序列,将你要输入的子序 ...
- Javascript 防扒站,防止镜像网站
自己没日没夜敲出来的站,稍微漂亮一点,被人看上了就难逃一扒,扒站是难免的,但不能让他轻轻松松就扒了: 前些天有个朋友做的官网被某不法网站镜像,严重影响到 SEO,当时的解决方法是通过屏蔽目标 IP 来 ...
- 使用git命令修改commit提交信息
很多时候我们在提交代码时可能会把commit提交信息写错了,这个时候我们就可以用到下面的git命令来修改commit提交信息 git commit --amend 输入"i"之后进 ...
- tensorflow中models的安装
tensorflow中models的安装参看网址: 1. Tensorflow Object Detection API Windows Install Guide http://www.insigh ...
- iDrac6 虚拟控制台 连接失败
最近给公司的服务器升级硬件(其实是服务器要淘汰了,公司就不管了,爱怎么折腾就怎么折腾,只要不坏就行) 服务器配置:Dell PowerEdge R610,E5606 x2(双路2.13G 4核4线程) ...
- Math类入门学习
Math类 Math类包含用于执行基本的数字运算等基本指数.对数.平方根法.三角函数. import java.lang.*; public class TestMath { public stati ...
- 转载:通过监控Nginx日志来实时屏蔽高频恶意访问的IP
通过监控Nginx日志来实时屏蔽高频恶意访问的IP 目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Ngin ...
- ssh保持连接不断开
使用ssh连接服务器,长时间不使用,会自动断开,控制台会卡死无法使用,现提供以下两个方案解决这个问题: [服务器主动保持连接] 修改服务器配置文件: vim /etc/ssh/sshd_config ...
- [03]java中的方法以及控制语句
00 Java中的语句块 语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句.块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的.块可以被嵌套在另一个块中,但 ...
- CSS的核心属性和浮动
1.CSS属性组成和作用 属性:属性值 1)每个css样式都必须由两部分组成:选择符(Selector)和声明(Decleration) 注:声明又包括属性(Properyt)和属性值(Value ...