目录
一、同步与异步
微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待 服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们称这种调用方式为同步调用 ,也可以叫同步通讯。而异步调用就是实时性比较差,其他服务可能无法立即受到处理该请求,但是一个微服务却可以同时向多个服务发起请求;所以,如果我们的业务需要实时得到服务提供方的响应,则应该选择同步通讯(同步调用)。而如果我们追求更高的效率,并且不需要实时响应,则应该选择异步通讯(异步调用)。


这样不利于我们拓展业务,倘若我们希望添加一个通知客户成功支付的功能,则需要新加代码,也就是说每次有新的需求,现有支付逻辑都要跟着变化,代码经常变动,不符合开闭原则,拓展性不好。其次,我们采用了同步调用,服务一多,各个服务相互等待就会出现性能问题,而我们又不见简单地做限流、熔断等处理,那样会导致更严重的数据不一致问题,所以这里就需要异步调用来解决该问题。


二、消息队列技术选型
消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.

据统计,目前国内消息队列使用最多的还是RabbitMQ,再加上其各方面都比较均衡,稳定性也好,因此我们选择RabbitMQ来学习。
RabbitMQ:
接下来我们就来安装RabbitMQ:
1.将RabbitMQ的tar包拉到虚拟机/root目录下并使用以下指令加载tar包:
bash
docker load -i mq.tar

2.执行以下指令创建容器:
bash
docker run \
-e RABBITMQ_DEFAULT_USER=******* \ #这里是自己设置的账号
-e RABBITMQ_DEFAULT_PASS=****** \ #这里是自己设置的密码
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
--network hm-net\
-d \
rabbitmq:3.8-management

安装完成后,我们访问 http://192.168.150.101:15672即可看到管理控制台。首次访问需要登录,默认的用户名和密码在配置文件中已经指定了。


其中包含几个概念:
-
publisher
:生产者,也就是发送消息的一方 -
consumer
:消费者,也就是消费消息的一方 -
queue
:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理 -
exchange
:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。 -
virtual host
:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue
RabbitMQ的使用:
1.首先需要创建队列:

2.接着绑定交换机与队列,也就是创建路由:

3.最后在交换机当中发送信息:

我们回到Queues
页面,可以发现hello.queue
中已经有一条消息了:

点击队列名称,进入详情页,查看队列详情,这次我们点击get message:


数据隔离:
点击Admin
选项卡,首先会看到RabbitMQ控制台的用户管理界面:

这里的用户都是RabbitMQ的管理或运维人员。目前只有安装RabbitMQ时添加的itheima
这个用户。仔细观察用户表格中的字段,如下:
-
Name
:itheima
,也就是用户名 -
Tags
:administrator
,说明itheima
用户是超级管理员,拥有所有权限 -
Can access virtual host
:/
,可以访问的virtual host
,这里的/
是默认的virtual host
对于小型企业而言,出于成本考虑,我们通常只会搭建一套MQ集群,公司内的多个不同项目同时使用。这个时候为了避免互相干扰, 我们会利用virtual host
的隔离特性,将不同项目隔离。一般会做两件事情:
-
给每个项目创建独立的运维账号,将管理权限分离。
-
给每个项目创建不同的
virtual host
,将每个项目的数据隔离。
那么接下里,我们给黑马商城创建一个新的用户以及虚拟主机:
1.创建我们项目的用户,并设置密码以及超级管理员权限,添加好后退出登录并以hmall账号登录:

可以看到我们创建好的用户以及没有虚拟主机的状态,所以我们接下来要创建虚拟主机
2.根据图示顺序即可创建虚拟主机并且完成与hmall账号的绑定(因为是在这个账号下创建的)

这样就创建好了我们项目专属的虚拟主机环境啦