SpringBoot高级-消息-JMS&AMQP简介

我们来学习SpringBoot和消息,SpringBoot与消息队列的整合使用,包括消息队列的两个常见规范,JMS Java消息服务,

和AMQP,高级消息队列协议,而且我们还会整合RabbitMQ来使用,其实在我们大多的应用中,我们都可以引用消息中间件,

来提升我们系统的异步通信能力,以及扩展解耦能力,为什么会有消息服务中间件

第一个是我们的异步处理,我们以某个用户注册为例,用户注册成功以后,将他的注册信息写进数据库,

我同时还想给他发送一封邮件,并且发一封短信,如果是以前我们的方式,同步调用,写完数据库,调发邮件

方法,再调发短信方法,每一个方法50毫秒,那我们合起来在150毫秒以后,我们来响应用户,这样是很慢的,

你发注册邮件,跟发短信,不是下一毫秒立马就要做完,用户立马就要看效果的,你可以慢慢来处理,我想要

第二种模式,当我用户吧用户信息写进数据库,50毫秒以后,那接下来我用多线程的方式,我来并发执行两个

操作,第一个是发送注册邮件,第二个发短信,由于是并发,发了一个最长的时间,合起来响应100毫秒,我们此时

就可以引入一个东西,叫消息队列,这样我们用户将注册好的信息,写进数据库以后,他只需要将我们后来需要的信息,

很快的写进消息队列里边,写进消息队列呢,比如5毫秒,只要写进消息队列,立马返回,用户在55毫秒就响应成功,

而接下来发送邮件,以及发送短信,这些服务呢,他们都可以通过异步读取的方式,自己从消息队列取出自己要的

信息,给用户发邮件,发短信,这是我们第一个场景,进行异步处理,来提升我们异步通信能力,第二个是我们应用

解耦

订单系统和库存系统,如果我们写在一个应用里面,我来下一个单,我们要减库存,下完单要来减库存的方法,

这样我们耦合起来也是很麻烦的,包括就跟我们刚才说的一样,接下来我们可以怎么做呢,我们把订单系统单独

抽取出来,库存系统也单独抽取出来,我们可以用微服务的方式抽取一个服务,只要我们下单了,下单的信息写到

消息队列里面,那么库存系统通过订阅消息队列,这些内容,只要消息队列里面有一个订单内容,里面就会收到订单

的信息,而库存系统在这计算库存相关的操作,这就是我们这个应用解耦,我们就引入消息队列,来解耦两个应用,

包括我们还有一个场景就是流量削峰,例如我们秒杀,比如我们有10万个人,我们这个商品只有1万个,10万个人要

同时来秒杀,如果每一个人的请求都发过来,我们TOMCAT来处理,这是不是很麻烦,而且肯定卡死,那怎么做呢,我们的

用户秒杀请求进来,秒杀请求直接进消息队列里边,消息队列我们可以来一个定长,他只能存储一万个数据,那怎么办呢,

10万个用户,谁快谁先进队,那么进队以后呢,后面9万个进不了队列,立即响应秒杀失败,那么相当于他抢占了一个座位,

只要他抢占到座位了,消息队列里面有内容了,秒杀业务处理逻辑就慢慢的取出这些数据,将秒杀的信息转发后台,这是我们

的应用场景

这些场景引入我们为什么要用消息中间件,我们的消息队列,说起消息服务这里面有两个重要的概念,

一个叫消息代理,另外一个叫目的地,所谓的消息代理,就是我们消息中间件的服务器,我们要给消息队列

里面存储内容,就要连接消息中间件的服务器,这个我们称之为消息代理,我们这个消息发送者,是将消息发送

到消息代理,也就是发送到服务器,我们服务器接管到消息以后,服务器要把消息发送到一个指定的目的地,这就是

我们要说的目的地,目的地可以有两种形式,第一种队列的形式,可以进行点对点通信,和主题来进行发布订阅,这两种

通信机制呢,我们来了解一下
我们说的点对点式,其实指的就是发送者发送A,把消息发到一个队列里边,我们这个消息接着收呢,可以从B里面

取出这个东西,而且消息一旦被取出以后,我们这个消息队列里面的东西,就会被移除,当然我们说,消息只有一个

唯一的发送者,和接受者,但是不是只有一个接收者,接受者和接收者,我们B,C,D可以同时都来收消息队列里面的内容,

但是我们说了,只要有一个人比如B拿到了,那C就不可能再来拿到了,比如我们这个消息一旦被消费,就会被删除,这是我们

点对点式,还有一种叫发布订阅式,发布订阅式指的就是,我们消息的发布者A,他把一个消息发布到主题,成为主题里面的topic,

那我们多个接收者,B,C,D,我们可以同时来订阅这个主题,也就是监听,我们可以监听里面的消息,只要这个消息已经到达,

B,C,D同时都能够收到消息,这叫发布订阅,而以前这个点对点,是只有一个能够收到这个消息,这个就是两个收到消息通信机制,

接下来就是两个常见的消息服务规范,第一个叫JMS,JAVA消息服务,这是J2EE给我们制定的JVM的消息代理规范,而大家听过的

ActiveMQ,就是基于JVM的一个实现,而另外一个代理消息规范呢,就是AMQP,高级消息队列协议,他能兼容JMS,而RabbitMQ就是高级

消息队列的一个实现,那么这两个有什么不同呢,都是相当于消息代理的规范,我们在这做一个简单的对比

首先JMS是我们JAVA规定的API,而AMQP呢,它是网络级的一个协议,所以跨语言和跨平台,那我们JAVA规定的那只能

用JAVA语言,和我们JAVA平台,而我们AMQP,它是跨语言和跨平台的,而JMS规范呢,他提供了两种消息模型,就是我们的

第一种点对点的消息模型,和第二种发布订阅模型,而我们高级消息队列,他提供了5种消息模型,后来我们在用RabbitMQ

的时候呢,我们回来进行测试,第一种就是我们说的点对点,而后面四种就是发布订阅,只是他更细致,那么对于JMS来说,

能发消息,我们有这么多的类型,而我们AMQP,相关系列的产品,由于它是跨平台的,所以说你发的什么消息,都是将消息序列化后

在发送,都是一些字节数据,综合起来,首先JMS他不是跨平台的,但是如果我们都是JAVA应用,用面向JMS对象编程,我们无论用

哪个产品的JMS的实现,我们都不需要改代码,这是比较友好的,我们AMQP呢,它是跨平台的,所以说这个在后来,用的还是比较多的,

但是后来不管选型JMS,还是用AMQP,我们Spring底层都是支持的

Spring底层有JMS模块,它提供了对JMS产品操作的支持,包括对Spring-rabbit模块,提供了对AMQP产品,

特别是对rabbitmq操作的支持,那如果有了SpringBoot,要用相应的场景,就更简单了,你来到SpringBoot里边,

比如你要操作JMS的

spring-boot-starter-activemq

Starter for JMS messaging using Apache ActiveMQ

这里有JMS的两个操作产品,比如有ActiveMQ的,还有artemis的,都不可以导入相关的依赖,比如我们后面要来测

rabbitmq的,我们都可以在这里导入相关的场景,我们来提供支持,当然有了他们以后呢,Spring在底层给我们提供了

JmsTemplate,和RabbitTemplate,来发送消息,我们可以用Spring提供的两个简化注解,如果是Jms的情况下,可以用JMSListener

来监听,如果是AMQP,可以用@RabbitListener来监听,我们要用这两个注解来开启相关的支持,JMS的情况下用他,我们后来进行测试,

包括我们用了SpringBoot,都是有相关的配置的,我们只需要简单,最少量的情况下,配置一个消息代理的服务器地址

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值