Fanout交换器-搭建环境

我们讲一下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里面只要修改

交换器的名称就可以了,这样我们就把两个配置就配好了,这样我们的基本环境就搭建完毕
<project xmlns="http://maven.apache.org/POM/4.0.0" 
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
		 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.learn</groupId>
  <artifactId>rabbitmq-fanout-provider</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.12.RELEASE</version>
		<relativePath/> 
	</parent>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
		<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
	</properties>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<!-- 这个插件,可以将应用打包成一个可执行的jar包 -->
	<build>
	    <plugins>
	        <plugin>
	            <groupId>org.springframework.boot</groupId>
	            <artifactId>spring-boot-maven-plugin</artifactId>
	        </plugin>
	    </plugins>
	</build>
  
  
</project>
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
<project xmlns="http://maven.apache.org/POM/4.0.0" 
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
		 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.learn</groupId>
  <artifactId>rabbitmq-fanout-consumer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.12.RELEASE</version>
		<relativePath/> 
	</parent>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
		<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
	</properties>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<!-- 这个插件,可以将应用打包成一个可执行的jar包 -->
	<build>
	    <plugins>
	        <plugin>
	            <groupId>org.springframework.boot</groupId>
	            <artifactId>spring-boot-maven-plugin</artifactId>
	        </plugin>
	    </plugins>
	</build>
  
  
</project>
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值