带着新人学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内。总之,你就当作这个图错了,这个应该是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服务器嘛!