Topic交换器-搭建环境
生活随笔
收集整理的這篇文章主要介紹了
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改一下,然后我們再來拷貝一個Consumerrabbitmq-topic-consumer然后我們再去修改一下他的pom文件,這樣我們兩個項目就創建好了,然后在這個項目當中呢,我們還是把配置文件修改一下,首先看一下Provider,看一下application.properties文件,在這個文件當中呢,上面的信息我們都不動,這個交換器的名稱我們肯定要改一下mq.config.exchange=log.topic現在改成什么呢,topic,然后下面這些信息,我們就先都不要了,都去掉,就留一個交換器的名稱就可以了,然后我們再來看Consumer的配置文件,Consumer的配置文件當中呢,交換器的名稱我們也得改成topicmq.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-providerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guestmq.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-consumerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guestmq.config.exchange=log.topic
mq.config.queue.info=log.info
mq.config.queue.error=log.error
mq.config.queue.logs=log.all
?
總結
以上是生活随笔為你收集整理的Topic交换器-搭建环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Direct交换器-编写生产者
- 下一篇: Topic交换器-编写生产者