这次就来说说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内。总之,你就当作这个图错了,这个应该是BindingKey,更好理解一些!

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服务器嘛!

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

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

    上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...

  2. 带着新人学springboot的应用04(springboot+mybatis+redis 完)

    对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...

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

    说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...

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

    spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...

  5. 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

    这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...

  6. 带着新人学springboot的应用10(springboot+定时任务+发邮件)

    接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...

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

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  8. 带着新人学springboot的应用08(springboot+jpa的整合)

    这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...

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

    上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...

随机推荐

  1. MT7688交叉编译环境配置

    在ubuntu下设置MT7688交叉编译环境,用于编译mt7688下使用的程序 1.首先在vmware下安装ubuntu64位,由于交叉编译工具需要64位系统,此次安装的是ubuntu14 2.在ub ...

  2. tf.contrib.slim.data数据加载(1) reader

    reader: 适用于原始数据数据形式的Tensorflow Reader 在库中parallel_reader.py是与reader相关的,它使用多个reader并行处理来提高速度,但文件中定义的类 ...

  3. box-shadow 画叮当猫

    值 描述 h-shadow 必需.水平阴影的位置.允许负值 v-shadow 必需.垂直阴影的位置.允许负值 blur 可选.模糊距离 spread 可选.阴影的尺寸 color 可选.阴影的颜色.请 ...

  4. React修改state(非redux)中数组和对象里边的某一个属性的值

    在使用React时,会经常需要处理state里边设置的初始值以达到我们的实际需求,比如从接口获取到列表数据后要赋值给定义的列表初始值,然后数据驱动view视图进而呈现在我们眼前,这种最简单的赋值方式实 ...

  5. HTML入门14

    HTML表单 这块部分开始强调表单也是用的比较多的部分,好好补漏啊啊啊啊 表单用来做交互,处理所有方面结构到样式,到自定义小部件. form元素,严禁嵌套表单,表单嵌套会使得表单得行为不可预知,引入f ...

  6. Live2D插件--漂浮的二次元小姐姐

    这个插件找了很久,都没找到,今天偶然翻到一个小哥的博客发现了这个,果断偷走. 教程转自简书:https://www.jianshu.com/p/1cedcf183633 还有这些,你可能有用 修改位置 ...

  7. koa2学习(一)

    前期准备: node环境 npm包管理工具 安装Koa npm install --save koa 第一个程序 创建index.js const Koa = require('koa'); cons ...

  8. 记一次通过c#运用GraphQL调用Github api

    阅读目录 GraphQL是什么 .net下如何运用GraphQL 运用GraphQL调用Github api 结语 一.Graphql是什么 最近在折腾使用Github api做个微信小程序练练手,本 ...

  9. Roslyn还出现这么低级的错误,不应该呀!

    前几天对Dora.Interception作了简单的重构,想提供C#脚本来定义Interception Policy,毫无疑问微软提供的编译平台Roslyn使C#脚本化提供了支持.但是没有想到随便尝试 ...

  10. 用Java实现给图片添加文字

    package image; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java. ...