我们再来看另一个交换器的使用,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交换器的一个特点,我们把环境搭建好了,
接下来再来编写生产者和消费者的代码
4.0.0
com.learn
rabbitmq-topic-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-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
4.0.0
com.learn
rabbitmq-topic-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-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