带着新人学springboot的应用05(springboot+RabbitMQ 上)

  这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的。(注意:这一节很多都是概念的东西,需要操作的比较少)

  至于AMQP协议(Advanced Message Queuing Protocol),专业名称叫做高级消息队列协议,就是只要你遵守这个协议,那么做出来的产品就能跨平台,跨语言,很牛的一个协议,具体多么牛可以自己百度一下。

  而RabbitMQ就是基于这个协议的!很多语言都可以用RabbitMQ,例如python,C语言,PHP,Java等语言,而且windows,linux,macos等平台都可以使用。。。

简单看看使用场景:

  运用场景1:比如大家注册博客园的时候,注册信息写入数据库之后,还需要激活吧!你要等博客园的一个线程给你发邮件,假如这个时候注册的人很多,那就需要非常多的线程,大家也知道线程到达一定数目效率反而是降低的,而且只有等到邮件给你发送之后你才知道注册成功,你就可能一直卡了几分钟。所以这个时候,就把很多个发邮件需要的消息放到一个消息队列中你就马上收到响应“注册成功”,然后你就可以去玩玩手机,等一下就会收到邮件,其实对博客园来说,只需要几个或者几十个线程慢慢的从这个队列中取消息、一个一个慢慢发邮件就是了。

  运用场景二:大家都知道双11,淘宝各种活动,假如一个店铺生意特别好,一下子卖了十几万件。那么假如每个人都是提交订单,还要去库存那边查查之后再调用方法减库存,然后再给你响应订单成功,emmmm....你就慢慢等十几分钟吧!用户体验贼差!但是直接把所有订单消息给消息队列(也叫做消息中间件),然后立刻给用户响应:订单成功!用户可以想干嘛就干嘛去了,而这边的库存系统只需要从消息队列中慢慢拿数据就ok,假如没货了还能通知店主补充货物。

  运用场景三:很多秒杀活动,就在那一秒钟看谁的是单身三十年的手速了!然而秒杀的点击量太高,会把那个系统卡爆了。。。所以做了一个限制,将前n个人点击的消息放入消息队列(可以就设置这个队列长度为1,那么第二个及之后的消息自动全部舍弃),后面的无论多少点击,直接丢掉并响应秒杀失败!而秒杀业务只需要慢慢从这个队列取消息就可以做后续的操作了。

  

  简单的下载安装一下,因为这个RabbitMQ是用erlang这个语言开发的(反正我是没有用过这个语言....),虽然我们不用,但是RabbitMQ启动的时候要用这个的环境。

  就像我们的java程序要运行,肯定要jre啊,这是一个道理!所以下载一个erlang(这个读音是不是挺像二郎啊,哈哈!话说RabbitMQ,Rabbit是兔子的意思,M指的是Message,Q代表Queue,我猜意思是不是兔子消息队列啊,哈哈哈)

1.RabbitMQ的简单安装

  新建一个文件夹,把erlang和RabbitMQ放在一起。

  下载relang地址:http://erlang.org/download/,多往下翻!!!我用的是下图的这个,版本可以根据条件选择。下完之后安装,然后就一直next就ok了 ,存放的位置自己看着办。(我用360极速浏览器下了三次都没成功,用了谷歌一次就成功了,可还各种给我提醒不安全、对电脑有害,emmmm......看我电脑今天会不会爆炸)

  

  一番努力之后这个erlang下好了,然后到http://www.rabbitmq.com/install-windows.html下载,如果点了下面这个跳转到了github,就点9M多的那个文件进行下载,下完之后也是一直下一步。

  ok,两个不知道什么鬼的软件下好了,我们就能够看到这两个文件夹,其中erl文件夹没什么用,我们把重点放在rabbitmq_server,看名字就知道这个就是一个服务端,只要启动它,我们基本的功能就能用了(虽然我们也就只会用到基本的功能)

  

  打开rabbitmq_server-3.7.9,有个sbin,进去,打开命令窗口

  然后运行命令

  第一种:rabbitmq-plugins.bat enable rabbitmq_management(用了这个命令就可以直接在浏览器里可视化的看到RabbitMQ内部的数据了,类似Druid)

  第二种:"C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin\rabbitmq-plugins.bat" enable rabbitmq_management

  其实我感觉两种应该是一样的,但是可能会碰到秘之错误,看情况用啊!出现类似下图这个界面就ok了(因为这个命令我运行了一次了,所以可能有些出入,但大概的应该差不多),还有估计还会有其他的错误,其实很正常,试试命令net stop RabbitMQ && net start RabbitMQ,重启一下试试,没用的话就慢慢百度是什么错误吧!

  到此安装成功,打开浏览器,输入url:http://localhost:15672,用户名和密码都是:guest

  登录成功,出现如下这个页面就成功了。

  话说这个RabbitMQ可以添加新用户,权限啊什么的,emmm....我们就自己用的,不搞这么麻烦了。

  如果不小心关闭了RabbitMQ服务端或者下次再想开启,可以在安装目录xxx\rabbitmq_server-3.7.9\sbin,双击rabbitmq-server.bat就开启服务端了,当然你也可以去设置windows服务。

2.说说RabbitMQ的基本概念

  刚开始说专业名词很是头痛,而听不懂,我就来用一个小场景来引出一些概念。

  小王,小李和小陈一起去路边小饭店吃饭,这个饭店规模不大,就一个厨师,一个服务员,我们要吃饭,怎么办呢?首先是跟服务员点菜,就点两个菜,清炒小白菜和鱼香肉丝,然后服务员将点好的菜单丢给厨师师傅做。

  场景一: 厨师做好了,把一盘小白菜给服务员,说了一句“这是清炒小白菜”,服务员就端着小白菜就跑过来了,对那三人也说了一句“这是清炒小白菜”,然后放桌子上,服务员就走了;那三人没过几秒钟就把小白菜吃完了。过了一会儿,鱼香肉丝做好了,根据上面的步骤又走了一遍,鱼香肉丝也被拿到桌子上,慢慢的等着被吃,服务员在这过程中是离开的,而且无论点了多少个菜,都是这样的流程;等三人吃饱喝足之后,三人也就走了,剩下的空碗空盘子和桌子会被处理。

  这里涉及几个关键的地方:厨师,一盘小白菜,“这是清炒小白菜”,服务员,“这是清炒小白菜”,桌子,三人,服务员离开,吃完了,桌子被处理

  好了,故事听完了,现在看看RabbitMQ的大概原理:生产者(Producer,或者叫做Publisher)生产消息(Message),并为消息设置一个路由键(Routing key),将消息交给交换器(Exchange),交换器通过一个绑定键(Binding key)和一个消息队列绑定,只有当路由键和绑定键相同的时候,交换器就会将消息丢给消息队列(Message Queue),然后交换器就不管了,然后消费者(Consumer)过来取队列中的消息,取完一个消息队列就删除一个。

   我随便找个图可以看一下,下图所示:broker在这里指的就是RabbitMQ

  想想啊,小饭店可能就只有一个厨师,一个服务员,就只有你们一桌人在吃饭,但是五星级大酒店呢?肯定是厨师师傅十几个甚至几十个,服务员更是很多,吃饭的人也是多不胜数,很多桌都有老板在吃饭,而消息中间件也是一样。

  实际情况就是:生产者可能有多个,交换器可能有多个,Queue可能有多个,消费者也可能有多个,下图也只是粗略的显示了一下几个关键点。下图的那个RoutingKey其实指的是:交换器根据不同Message内的RoutingKey,交换器和不同Queue绑定的Binding key,将这两个key比较一下(要符合一定的规则),交换器就会把消息丢到目的Queue内。

3.RabbitMQ名词解释(核心是RoutingKey,交换器和绑定)

  Publisher(生产者):其实就是一两行代码或者一个程序,调用一个什么方法发送一个消息

  Message(消息):由消息头和消息体组成。消息体是真正要发送的数据,消息头里面可以设置属性RoutingKey,其他属性碰到再说

  Exchange(交换器):接收生产者传过来的消息,按照一定的规则丢给指定的Queue,具体什么规则跟交换器类型有关,只说三种,direct(默认类型,那两个key一定要一样才会发给指定的一个或几个Queue),fanout(不管什么key了,给所有Queue发一遍消息,类似微信公众号的功能),topic(两个key模糊匹配一下,差不多就行了,然后发给一个或几个Queue)

  Queue(消息队列):存消息的容器,其实就类似一个List集合,就是放对象的容器,而且有顺序。

  Binding(绑定):其实就是交换器和Queue的绑定,说白了就是靠那个BindingKey(默认会用Queue的名字)嘛!注意,交换器和Queue是多对多的关系!!!一个虚拟主机可能有多个交换器,一个交换器可以绑定多个队列,一个队列也可以绑定多个交换器。

  Connection(网络连接):emmmm....消息到达交换器、消费者从队列取消息总不可能是凭空就能做吧?肯定要建立连接啊,这里是TCP连接

  Channel(信道):就是Connection里面很多条通道,就跟公路一样,分为很多个车道,让流通更快嘛!而且每个消费者去队列取消息都开启一个TCP,那么很浪费资源,也就是会很卡。

  消费者(Consumer):表示一个程序或一两行代码,从队列拿消息。

  Virtual Host(虚拟主机):专业的话来说就是一个RabbitMQ服务器,可以设置很多个虚拟主机,每个虚拟主机都可以看作一个迷你型的RabbitMQ,虚拟主机之间隔离。emmmm....不就是跟电脑的虚拟机一个道理吗???,默认的虚拟主机url是“/”,我们还可以设置其他的虚拟主机“/abc”,"/ccd",随意。。。

  Broker:代表消息队列服务主体,在我们这里不就是RabbitMQ服务器嘛!

原文地址:https://www.cnblogs.com/wyq1995/p/10031162.html

时间: 2024-10-14 01:52:14

带着新人学springboot的应用05(springboot+RabbitMQ 上)的相关文章

带着新人学springboot的应用07(springboot+RabbitMQ 下)

说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发现很多你以为自己会的东西其实你并不会,然后你会经常在头脑中不断的搜索有关的片段,或者去别的大神博客里到处找有关的资料,最后领悟了属于自己的东西!然后再写出来和别人分享,别人也会给你点意见,你也会慢慢的改进.这不就是学习+复习+巩固+创新+分享+改进的这么的一个过程吗? 以前看过曹雪芹的红楼梦,让我印

带着新人学springboot的应用01(springboot+mybatis+缓存 中)

继续接着上一节,大家应该知道驼峰命名法吧!就是我们javabean中属性一般命名是lastName,userName这种类型的,而数据库中列名一般都是last_name,user_name这种的,要让对应起来,在springboot中可以设置 另外大家可以看看我们用了mybatis依赖之后,导入了一些什么jar包,比较关键的是那个autoconfigure,其实内部就跟之前我们手写的那个starter原理差不多 我们也可以用xxxCustomizer来定制功能,以上面的驼峰命名为例,就可以使用这

带着新人学springboot的应用01(springboot+mybatis+缓存 下)

springboot+mybatis+缓存,基本的用法想必是会了,现在说一说内部大概的原理. 稍微提一下mybatis,只要导入了mybatis的依赖,那么有个自动配置类就会生效,你可以去mybatis的jar包里面的META-INF/spring.factories中看到这个xxxAutoConfiguration,就如下图所示,这个应该很熟悉了,所以我们要看看mybatis的配置,肯定要看这个类. 开这个类,看到这里 看了看,其他的没什么说的,要看看在yml给mybatis可以配置哪些参数,

带着新人学springboot的应用06(springboot+RabbitMQ 中)

上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. 打开可视化页面,http://localhost:15672 顺便说一下RabbitMQ中的持持久化:这里持久化分为三种:消息持久化,交换器持久化,队列持久化... 举个例子,就简单说说交换器持久化,其实就是为了防止将消息发到交换器了,但是RabbitMQ服务器突然暴毙,没用了,那数据不就丧失了么?

带着新人学springboot的应用09(springboot+异步任务)

本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的任务就是异步任务,定时任务,发邮件. 异步任务:其实就是一个很特别的方法,这个方法没有返回值(也可以有返回值,后面会说的),但是方法内部的逻辑会耗费很多时间!例如,用户请求每次到controller,要执行到这个异步方法的时候,我们只需要命令一个空闲状态的线程去执行它即可,由于没有返回值不影响后续代

带着新人学springboot的应用13(springboot+热部署)

spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫做热部署,看到这名字就吓退了我继续学习的欲望!),但是实际上可以把这个看成是一个小技巧. 就是导入一个依赖,要用的时候,就是快捷键操作:Ctrl+F9 有什么用呢?就是避免你每次对springboot修改一点东西,就要重新启动springboot应用,贼麻烦!而且对于电脑性能不怎么样的小伙伴来说(咳

带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)

上半节已经下载好了Zookeeper,以及新建了两个应用provider和consumer,这一节我们就结合dubbo来测试一下分布式可不可以用. 现在就来简单用一下,注意:这里只是涉及最简单的部分,新手入门用的,详细的内容要学习的可以自己查一查资料;然后再说说用Zookeeper当作注册中心的一个特点. 话说注册中心是一个类似第三方软件的东西,那么我们能不能用Dubbo+其他注册中心呢?其实也是可以的,比如redis,有兴趣的可以查查资料自己试试,原理都差不多. 1.导入依赖       两个

【spring-boot】快速构建spring-boot微框架

spring-boot是一个快速构建环境的一套框架,其设计理念是尽可能的减少xml的配置,用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 废话不多说,关于spring-boot是什么具体请百度. 官网:http://projects.spring.io/spring-boot 1. spring-boot是一个mavan项目,所以其使用的jar包全部是通过maven管理,当然,使用maven也是非常方便的. 首先上我的

纵向文字滚动代码,带上下图片控制的。鼠标放到上下图片上时滚动

<style type="text/css"> #swsh .swsh_body{height:352px;overflow:hidden;}</style></p> <div id="swsh"> <script language="javascript"> var UDMoveflag=true function scrollStart(object,offset){ object.