一、入门概述
1、MQ的产生背景
系统之间直接调用存在的问题?
微服务架构后,链式调用是我们在写程序时候的一般流程,为了完成一个整体功能会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。但在大型分布式应用中,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,从单机架构过渡到分布式微服务架构的通例。这些架构会有哪些问题?
(1) 系统之间接口耦合比较严重
每新增一个下游功能,都要对上游的相关接口进行改造;
举个例子:如果系统A要发送数据给系统B和系统C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据进行了组装,然后逐一发送;
当代码上线后又新增了一个需求:把数据也发送给D,新上了一个D系统也要接受A系统的数据,此时就需要修改A系统,让他感知到D系统的存在,同时把数据处理好再给D。在这个过程你会看到,每接入一个下游系统,都要对系统A进行代码改造,开发联调的效率很低。其整体架构如下图:
(2) 面对大流量并发时,容易被冲垮
每个接口模块的吞吐能力是有限的,这个上限能力如果是堤坝,当大流量(洪水)来临时,容易被冲垮。
举个例子秒杀业务:上游系统发起下单购买操作,就是下单一个操作,很快就完成。然而,下游系统要完成秒杀业务后面的所有逻辑(读取订单,库存检查,库存冻结,余额检查,余额冻结,订单生产,余额扣减,库存减少,生成流水,余额解冻,库存解冻)。
(3) 等待同步存在性能问题
RPC接口上基本都是同步调用,整体的服务性能遵循“木桶理论”,即整体系统的耗时取决于链路中最慢的那个接口。比如A调用B/C/D都是50ms,但此时B又调用了B1,花费2000ms,那么直接就拖累了整个服务性能。
根据上述的几个问题,在设计系统时可以明确要达到的目标:
1,要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;能够解耦
2,设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;能削峰
3,强弱依赖梳理能将非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步
2 、MQ的主要作用
(1) 异步。调用者无需等待。
(2) 解耦。解决了系统之间耦合调用的问题。
(3) 消峰。抵御洪峰流量,保护了主业务。
3、 MQ的定义
面向消息的中间件(message-oriented middleware)MOM能够很好的解决以上问题。是指利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储、流量削峰,异步通信,数据同步等功能。
大致的过程是这样的:发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题topic中,在合适的时候,消息服务器回将消息转发给接受者。在这个过程中,发送和接收是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然的关系;尤其在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。
4、MQ的特点
(1) 采用异步处理模式
消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或者队列)上;
消息接收者则订阅或者监听该爱通道。一条消息可能最终转发给一个或者多个消息接收者,这些消息接收者都无需对消息发送者做出同步回应。整个过程都是异步的。
案例:
也就是说,一个系统跟另一个系统之间进行通信的时候,假如系统A希望发送一个消息给系统B,让他去处理。但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活了”,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事儿,与系统A无关。
(2) 应用系统之间解耦合
发送者和接受者不必了解对方,只需要确认消息。
发送者和接受者不必同时在线。
(3) 整体架构
(4) MQ的缺点
两个系统之间不能同步调用,不能实时回复,不能响应某个调用的回复。
二、ActiveMQ的安装及控制台
**环境及工具说明:**阿里云服务器+centos7+xshell+jdk8(要提前准备好)
1、安装
1.2 下载安装压缩包
官网地址: http://activemq.apache.org/
点击下面,开始下载。
下载完之后,将压缩包上传到lunix系统中。
# 创建一个新的文件夹,将压缩包上传到文件夹中
[root@izbp1bbjc5qwrrd5z2ezayz opt]# mkdir myacitvemq
[root@izbp1bbjc5qwrrd5z2ezayz opt]# ls
containerd myacitvemq
上传完之后进行解压缩:
# 解压
[root@izbp1bbjc5qwrrd5z2ezayz opt]# cd myacitvemq/
[root@izbp1bbjc5qwrrd5z2ezayz myacitvemq]# ls
apache-activemq-5.15.13-bin.tar.gz
[root@izbp1bbjc5qwrrd5z2ezayz myacitvemq]# tar -zvxf apache-activemq-5.15.13-bin.tar.gz
进入bin目录启动:
[root@izbp1bbjc5qwrrd5z2ezayz bin]# pwd
/opt/myacitvemq/apache-activemq-5.15.13/bin
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ./activemq start
INFO: Loading '/opt/myacitvemq/apache-activemq-5.15.13//bin/env'
INFO: Using java '/usr/local/jdk/jdk1.8/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/opt/myacitvemq/apache-activemq-5.15.13//data/activemq.pid' (pid '20324')
# 出现上述信息表示启动成功,或者查看一下:
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ps -ef|grep activemq
root 13419 1 0 Jul02 ? 00:01:53 /usr/local/jdk/jdk1.8/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/myactivemq/apache-activemq-5.15.13//conf/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/opt/myactivemq/apache-activemq-5.15.13//tmp -Dactivemq.classpath=/opt/myactivemq/apache-activemq-5.15.13//conf:/opt/myactivemq/apache-activemq-5.15.13//../lib/: -Dactivemq.home=/opt/myactivemq/apache-activemq-5.15.13/ -Dactivemq.base=/opt/myactivemq/apache-activemq-5.15.13/ -Dactivemq.conf=/opt/myactivemq/apache-activemq-5.15.13//conf -Dactivemq.data=/opt/myactivemq/apache-activemq-5.15.13//data -jar /opt/myactivemq/apache-activemq-5.15.13//bin/activemq.jar start
root 20379 19695 0 10:41 pts/0 00:00:00 grep --color=auto activemq
# 停止
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ./activemq stop
INFO: Loading '/opt/myacitvemq/apache-activemq-5.15.13//bin/env'
INFO: Using java '/usr/local/jdk/jdk1.8/bin/java'
INFO: Waiting at least 30 seconds for regular process termination of pid '21116' :
Java Runtime: Oracle Corporation 1.8.0_231 /usr/local/jdk/jdk1.8/jre
Heap sizes: current=63360k free=62653k max=1013632k
JVM args: -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/myacitvemq/apache-activemq-5.15.13//conf/login.config -Dactivemq.classpath=/opt/myacitvemq/apache-activemq-5.15.13//conf:/opt/myacitvemq/apache-activemq-5.15.13//../lib/: -Dactivemq.home=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.base=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.conf=/opt/myacitvemq/apache-activemq-5.15.13//conf -Dactivemq.data=/opt/myacitvemq/apache-activemq-5.15.13//data
Extensions classpath:
[/opt/myacitvemq/apache-activemq-5.15.13/lib,/opt/myacitvemq/apache-activemq-5.15.13/lib/camel,/opt/myacitvemq/apache-activemq-5.15.13/lib/optional,/opt/myacitvemq/apache-activemq-5.15.13/lib/web,/opt/myacitvemq/apache-activemq-5.15.13/lib/extra]
ACTIVEMQ_HOME: /opt/myacitvemq/apache-activemq-5.15.13
ACTIVEMQ_BASE: /opt/myacitvemq/apache-activemq-5.15.13
ACTIVEMQ_CONF: /opt/myacitvemq/apache-activemq-5.15.13/conf
ACTIVEMQ_DATA: /opt/myacitvemq/apache-activemq-5.15.13/data
Connecting to pid: 21116
.Stopping broker: localhost
# 启动时指定日志的位置,非常重要。启动后控制台无消息显示
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ./activemq start > /opt/myacitvemq/apache-activemq-5.15.13/data/myactivemq.log
# 查看,启动成功
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ps -ef | grep activemq
root 22153 1 21 11:12 pts/0 00:00:07 /usr/local/jdk/jdk1.8/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/myacitvemq/apache-activemq-5.15.13//conf/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/opt/myacitvemq/apache-activemq-5.15.13//tmp -Dactivemq.classpath=/opt/myacitvemq/apache-activemq-5.15.13//conf:/opt/myacitvemq/apache-activemq-5.15.13//../lib/: -Dactivemq.home=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.base=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.conf=/opt/myacitvemq/apache-activemq-5.15.13//conf -Dactivemq.data=/opt/myacitvemq/apache-activemq-5.15.13//data -jar /opt/myacitvemq/apache-activemq-5.15.13//bin/activemq.jar start
root 22221 19695 0 11:12 pts/0 00:00:00 grep --color=auto activemq
[root@izbp1bbjc5qwrrd5z2ezayz bin]# cd ..
[root@izbp1bbjc5qwrrd5z2ezayz apache-activemq-5.15.13]# ls
activemq-all-5.15.13.jar bin conf data docs examples lib LICENSE NOTICE README.txt tmp webapps webapps-demo
[root@izbp1bbjc5qwrrd5z2ezayz apache-activemq-5.15.13]# cd data
# 已经生成了指定的日志文件
[root@izbp1bbjc5qwrrd5z2ezayz data]# ls
activemq.log activemq.pid activemq.pid.stop audit.log kahadb myactivemq.log
# 查看生成的日志内容,其实就是原本显示在控制台的内容输出到日志上去了。
[root@izbp1bbjc5qwrrd5z2ezayz data]# cat myactivemq.log
INFO: Loading '/opt/myacitvemq/apache-activemq-5.15.13//bin/env'
INFO: Using java '/usr/local/jdk/jdk1.8/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/opt/myacitvemq/apache-activemq-5.15.13//data/activemq.pid' (pid '22153')
2、进入管理界面
访问activemq管理页面地址:http://IP地址:8161/
初始账号和密码都是admin
请注意: 使用前务必将端口开放,要不然会被访问拒绝!!!
点击Manage ActiveMQ broker可以进入消息的管理界面:
功能栏就是对应的首页,队列和话题等相关功能。后面会详细讲解到。
到这里的话,基本的安装就完成了。下一章会讲解一下最基础的使用。