我们讲一下RabbitMQ中的第三种交换器,Fanout交换器,相比上两种我们讲过的交换器,最大的特点它是以广播的
模式,来做消息的传递,我们来看一下这样的需求,我这里有一个订单服务,然后还有一个短信服务,还有一个push服务,
比如用户购买商品以后,我们的系统创建订单了,这个时候订单服务呢,要向短信服务发送信息,发送消息,短信服务平台
再给用户发送短信,然后订单服务平台还要去调push平台的接口,然后push服务再去向用户push消息,那么我们现在所看到的
这个图呢,是一个传统上的一个设计,什么意思呢,当用户创建完订单以后,订单服务要去调用短信服务平台的接口,然后再去
调用push平台的接口,也就意味着这两个平台的接口,都是在我订单平台服务上去调用的,那么也就是说,现在我的订单服务平台,
和短信服务平台,push服务平台,其实我们三个是紧耦合的,那么这种传统上的一个设计呢,它是不太人性化的,未来我们还得去
做改造,那么怎么去化解这种尴尬的问题呢
我们可以加入消息队列,来解决这个问题,还是订单服务,短信服务,push服务,三个服务,然后现在呢,
订单服务再发消息的时候,并不是直接调用短信服务和push服务的接口了,而是交给了中间的消息队列,
然后消息队列接收信息以后,我们现在的要求是,订单服务的消息,既要传递给短信服务,也要传递给push服务,
然后他两还不能公用一个服务,我还是给他分配两个队列短信服务走短信服务的队列,push服务走push服务的队列,
那么也就意味着,我的订单服务,要将信息传递到两个不同的平台下,都要传递的话,那要怎么办呢,我们肯定要换交换器了,
我们这个时候换一个谁呢,type=fanout,换一个广播模式的交换器,那么广播模式的交换器是什么意思呢,你订单服务发给我信息的
时候,将消息一并的放到这两个队列当中,或者你有三个四个五个都可以,我都可以将队列中发送信息,这样其他的平台,只要订阅了
相应的的队列,那么就可以订阅相关的服务和信息,就这样的一个过程,我们可以通过RabbitMQ,消息队列,来解决我们刚才说的尴尬的
问题,这样完全是一个松耦合的设计了,我的订单服务,再也不用去调用短信服务和push服务的接口了,我们二者之间的交互,完全通过
中间的消息中间件,来做信息传递,那么我们就按照这个需求去做一个实现,我们还是两个项目
一个是订单服务,一个是消息接收者,我们的consumer,然后我们通过消息队列,来进行信息的传递,并且我们配的交换器
是fanout交换器,打开我们的eclipse,我们首先去创建两个项目,还是从我们之前讲的direct,从这做一个拷贝,快速的构建
两个项目,我们先来一个consumer,然后我们这里改一个名称
rabbitmq-fanout-consumer
然后打开他的pom文件,我们对artifactId和name做一个修改,然后其他的我们就不用动了,然后我们再去创建一个Provider,
rabbitmq-fanout-provider
然后还是修改一下pom文件,这样我们就创建好了两个项目,搭建环境,第一个创建项目,然后我们接下来修改配置文件,我们先来看
Consumer的配置文件,首先我们的交换器名称是不是需要换一下了
mq.config.exchange=order.fanout
mq.config.queue.sms=order.sms
mq.config.queue.push=order.push
我们现在还叫log.direct,然后我们看一下这个图,我们图里面是创建订单服务的一个消息处理,我们现在是order.表示什么呢,
这个交换器叫fanout,然后队列名称我们得改一下,那么这个队列名称也不是什么info了,做日志处理了,我们会有两条队列,一个是短信
服务的队列,一个是push服务的队列,那我们就给这两个队列起个名字,比如sms表示是短信的队列,order的sms,然后广播模式,就是我们
的fanout交换器,他没有路由键,所以把路由键给删掉,然后这个也不是error了,是push,是order.push,然后他也没有路由键,
这样就配置完了,所以用fanout交换器,对于我们的配置文件来讲,配置项少很多,我们把它copy一下,粘到我们的笔记当中,
这个是consumer的配置文件,然后我们再来看Provider的,找到他的appliaction.properties,首先这个是要换一下
mq.config.exchange=order.fanout
他也要和consumer里面相同的交换器,那也要有相同交换器的名称,也是order.fanout,然后他也没有路由键,Provider里面只要修改
交换器的名称就可以了,这样我们就把两个配置就配好了,这样我们的基本环境就搭建完毕
4.0.0
com.learn
rabbitmq-fanout-provider
0.0.1-SNAPSHOT
jar
org.springframework.boot
spring-boot-starter-parent
1.5.12.RELEASE
UTF-8
UTF-8
1.8
3.0.9.RELEASE
2.2.2
org.springframework.boot
spring-boot-starter-amqp
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
spring.application.name=rabbitmq-fanout-provider
spring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=order.fanout
4.0.0
com.learn
rabbitmq-fanout-consumer
0.0.1-SNAPSHOT
jar
org.springframework.boot
spring-boot-starter-parent
1.5.12.RELEASE
UTF-8
UTF-8
1.8
3.0.9.RELEASE
2.2.2
org.springframework.boot
spring-boot-starter-amqp
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
spring.application.name=rabbitmq-fanout-consumer
spring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=order.fanout
mq.config.queue.sms=order.sms
mq.config.queue.push=order.push