Topic交换器-搭建环境

我们再来看另一个交换器的使用,Topic交换器的使用,Topic交换器也称之为主题交换器,他的特点是什么呢,

是根据这个规则来匹配,是一个什么样的规则呢,咱们先看这个图,这个图和上面最大的区别就是,我的服务端

多了,消息的生产者多了,有用户服务,有商品服务,有订单服务,然后他们都像RabbitMQ发送消息,这个消息会交给

交换器来处理,交换器是谁呢,注意看匹配模式,这个我们是交给一个叫topic的交换器来处理,那么Topic最大的

特点是什么呢,他可以根据一个规则,什么规则呢,我们看他的路由key,看到了吗,原来我们的路由key是写一个具体的

字符串,而现在的交换器的路由key呢,*.log.info,*.log.error,*.log.*,什么意思呢,它是可以根据星号,模糊匹配,

去决定将那个信息放到哪个队列里面,这是Topic交换器最大的一个特点,相比我们的direct,最大的特点是可以根据路由key,

模糊匹配,然后决定将那个消息,放到哪个队列当中,这就是Topic交换器的一个特点,然后相比上一个案例,我们的队列又多了一个

了,原来有log.info队列,log.error队列,现在还有log队列,然后至于消息的消费者呢,原来我们只有一个INFO日志处理,有一个Error

日志处理,现在多了一个全日志处理,这个全日志处理是什么意思呢,我们看这个匹配规则,能进入到log队列里的,路由key,

它是"*.log.*",也就是说,原来进入到log.info的消息和log.error队列的消息,其实最终都会进入到log队列里,我们这个叫

全日志处理,所以这就是Topic交换的一个特点,可以根据路由key进行模糊匹配,决定将哪个消息放到哪个队列当中,那么接下来

我们就按照这个需求,去使用以下Topic交换器,首先我们还是先去搭建环境

回到我们的代码当中,我们把上两个案例做一个拷贝,我们多个服务就不用多个项目来模拟了,用一个项目里面

加多个类来表示多个服务,消费者这里也是这样的,那我们还是把这两个项目copy一下,我们先来拷贝一个Provider,

然后我们改一下名称,这个叫

rabbitmq-topic-provider

然后我们先修改一下他的pom文件,把它的artifactId改一下,把name改一下,然后我们再来拷贝一个Consumer

rabbitmq-topic-consumer

然后我们再去修改一下他的pom文件,这样我们两个项目就创建好了,然后在这个项目当中呢,我们还是把配置文件修改一下,

首先看一下Provider,看一下application.properties文件,在这个文件当中呢,上面的信息我们都不动,这个交换器的名称我们

肯定要改一下

mq.config.exchange=log.topic

现在改成什么呢,topic,然后下面这些信息,我们就先都不要了,都去掉,就留一个交换器的名称就可以了,然后我们再来看Consumer

的配置文件,Consumer的配置文件当中呢,交换器的名称我们也得改成topic

mq.config.exchange=log.topic
mq.config.queue.info=log.info
mq.config.queue.error=log.error
mq.config.queue.logs=log.all

然后队列的名称我们是要的,然后这里是不是还有队列的,3个队列,路由键我们可以先把他注释掉,error队列名称留着,

我们现在是三条队列,这里还有一个是log队列,也是我们的全日志服务,log队列名称,我们改一下,我们叫

mq.config.queue.logs=log.all

然后key对应的value叫什么都行,我们叫log.all,这样我们把consumer的配置文件,也搞定了,这个是我们创建的两个项目,

创建项目,第二个是修改配置文件,第一个是Provider的,Provider里面只有一个,设置交换器的名称,然后是Consumer的,

这样我们就把配置文件建立好了,我们还是要理解这个需求,Topic交换器到底在什么时候使用,我们再简单的回顾一下说一说,

你想,用户服务,订单服务,商品服务未来会产生很多的日志,错误日志也好,消息日志也好,如果我要记录不同服务当中的日志,

其实不管你是用户服务商品服务还是订单服务,它产生的日志不都是日志吗,如果我们对产生日志去做处理的话,如果我们不用

Topic,我们还用direct交换器去做的话,你会发现,你得针对每个服务,服务越多,你在这里创建的队列也就越多,其实对于我们

来讲呢,比如log.info队列,我就是存info级别的消息,我不管你是用户服务还是商品服务还是订单服务,只要你是info级别的信息,

都进入到我这个队列里,就可以了,所以说呢,他的这种匹配模式呢,可以从数据库的专业来看,他针对消息是多对多的设计,

你所有的服务都可以往这里发,然后我可以根据你当前的路由键,模糊匹配,给不同的队列,而不像direct,一个服务对应一个队列,

那这样服务越多队列也就越多了,其实没有必要的,我们只关心你的消息是什么,我不管你是哪个服务产生的,你哪个服务产生的,

你是用户服务也好,还是商品服务也好,这两个产生info的信息,没有必要放到两条队列里面来存放,你都进入到log.info队列里面

来存就可以了,所以这种应用的领域还是比较广的,可以降低我们队列的个数,所以这是Topic交换器的一个特点,我们把环境搭建好了,

接下来再来编写生产者和消费者的代码
<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-topic-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-topic-provider

spring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

mq.config.exchange=log.topic
<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-topic-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-topic-consumer

spring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

mq.config.exchange=log.topic
mq.config.queue.info=log.info
mq.config.queue.error=log.error
mq.config.queue.logs=log.all

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值