两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发微信可以同时与多个人收发信息,但是往往响应会有延迟。
学SpringCloud的时候,我们的Feign 其实就是同步通讯的,他其实有以下这几个缺点:
当然,同步调用(Feign)也有他的优点:他的时效性很强,可以立即得到结果。
异步调用就可以避免上述这些问题!
我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。
订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。
为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。 如下图所示:

Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。
优点:
缺点:
MQ,全称是 Message Queue(消息队列),你可以简单理解为就是一个存放消息的队列。也就是事件驱动架构中的 Broker。
目前比较常见的MQ的实现有以下四种:RabbitMQ、ActiveMQ、RocketMQ、Kafka。
| RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
|---|---|---|---|---|
| 公司/社区 | Rabbit | Apache | 阿里 | Apache |
| 开发语言 | Erlang | Java | Java | Scala&Java |
| 协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 |
| 可用性 | 高 | 一般 | 高 | 高 |
| 单机吞吐量 | 一般 | 差 | 高 | 非常高 |
| 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
| 消息可靠性 | 高 | 一般 | 高 | 一般 |
目前国内使用比较多的是:RabbitMQ,RocketMQ 以及 Kafka。
那么,如何选择我们应该用哪一个呢?从上面的表格可以看出来,他们是互有优缺点的。假设你需要很高的吞吐量,但是,对消息的延迟以及完整性(可靠性)要求不高的话,那么肯定首选Kafka。
下面,我们以RabbitMQ为例,简单介绍并给出详细的下载教程!!!
RabbitMQ是基于Erlang语言 开发的开源消息中间件,官网地址:https://www.rabbitmq.com
如果想要更好地学习RabbitMQ,首推官网的文档进行学习,就是这个位置:

下面介绍一下CentOS 7 怎么下载RabbitMQ。命令如下:
docker pull rabbitmq:3-management
这是最简单的方式,直接使用我们的Docker进行下载即可。不熟悉的Docker的小伙伴可以看我的Docker专栏快速入门啊。
下载完成后,我们使用命令docker images查看我们的镜像是否下载成功。(3-management是有管理平台的,3是没有的)

然后我们启动我们的容器,命令如下:
docker run \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=root \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
解释一下:
启动完成后,使用命令docker ps可以查看我们目前启动的容器如下:

然后,我们还得启动防火墙:
firewall-cmd --add-port=5672/tcp --permanent --zone=docker
firewall-cmd --add-port=15672/tcp --permanent --zone=docker
firewall-cmd --reload
完成后,我们输入虚拟机或者你的云服务器的ip地址加端口号(15672),比如,192.168.10.20:15672,可以看到rabbitMQ管理平台登录页面如下:

账号密码刚才我们设置为admin和root了。输入后直接登录就可以了。
进去后,我们首先看到的Overview就是我们的RabbitMq的总览,由于没有配置集群,所以下面只有一个mq1,mq1这个名字也是我们刚才在docker上配置的(–hostname mq1)。

第二个菜单项Connection(连接),要把RabbitMQ作为Broker,我们的服务当然要与我们的RabbitMQ建立连接。

第三个菜单项Channels(通道),建立连接后,我们必须创建我们的通道,让我们的生产者和消费者可以在上面收发信息。

第四个菜单项Exchanges(交换机),实现的是类似我们路由的功能。

第五个菜单项Queue(队列),用来做我们的消息存储。

第六个菜单项Admin(管理),用来管理我们的用户信息。目前只有我们当前登录的用户。

如果想要创建一个新的用户也很简单,下面有一个Add a user,点一下,输入我们的账号密码,然后给他定位一个角色就行了。

创建成功后,我们的新用户,可以看到,他是没有任何可以访问的虚拟主机的。

虚拟主机的创建如下:
点击右侧的Virtual Hosts,然后点击Add a virtual host,输入我们的虚拟主机路径,然后点击添加按钮就行了。虚拟主机与虚拟主机之间的关系类似于名称空间,是彼此独立的。

如果此时,我们要给某个用户分配一个虚拟主机,那么,我们只需要点击我们用户的Name。

选择要分配给他的虚拟主机,然后点击Set permission 按钮即可。

点击后,我们可以看到,上面的Current permissions多了一个叫 / 的虚拟主机,如果要别的也可以添加。

退出来后,我们也可以看到,Keeling多了一个可以访问的虚拟主机 / 。

RabbitMq的架构如下:

1、服务的提供者将消息发送给我们的交换机
2、交换机再把消息发送到我们的Queue队列中
3、然后队列再把接收到的消息发送给我们的消费者。
期间,虚拟主机与虚拟主机的消息和路由是完全独立,互不干扰的。