RaDirect交换器-搭建环境
生活随笔
收集整理的這篇文章主要介紹了
RaDirect交换器-搭建环境
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們看一下RabbitMQ交換器講解,交換器在消息隊(duì)列當(dāng)中,是非常重要的一個(gè)環(huán)節(jié),所以我們要重點(diǎn)的講一下,我們先回顧一下在講Rabbit原理的時(shí)候,我們提到了一個(gè)Exchange的關(guān)鍵組件,那么Exchange是什么呢,其實(shí)就是交換器,然后他的作用是什么呢,再回顧一下,是用來(lái)接收生產(chǎn)者發(fā)送的消息,并將這些消息路由給服務(wù)器中的隊(duì)列,其實(shí)通過(guò)這句話我們也能夠看出來(lái),所謂的交換器,就是接收生產(chǎn)者所發(fā)送的消息,根據(jù)交換器,指定來(lái)決定,當(dāng)這個(gè)消息存入到哪個(gè)隊(duì)列當(dāng)中,然后消費(fèi)者再通過(guò)這個(gè)信道,去從隊(duì)列當(dāng)中取出相應(yīng)的消息,就是這樣的一個(gè)過(guò)程,所以說(shuō)你的交換器,使用的是哪一種交換器,將決定會(huì)進(jìn)入到相應(yīng)的隊(duì)列當(dāng)中,常見的交換器類型有三種,第一種是direct,發(fā)布與訂閱類型的,采用的是基于路由器完全匹配,然后還有一個(gè)fanout,廣播模式的,還有一個(gè)是topic,主題,它是基于模糊規(guī)則匹配的,那么這三種交換器的類型,在接下來(lái),我們都會(huì)逐一講解,你可以將交換器理解為消息隊(duì)列當(dāng)中,非常重要的一個(gè)技術(shù)點(diǎn)了,所以對(duì)于這一塊我們也會(huì)詳細(xì)的去講解一下,我們先來(lái)看第一個(gè)交換器,就是這個(gè)direct,我們先看一個(gè)需求,我們會(huì)按照我們的需求去使用direct,這個(gè)需求是什么呢,業(yè)務(wù)場(chǎng)景是系統(tǒng)日志處理場(chǎng)景,然后他有這么三個(gè)特點(diǎn),來(lái)看一下,第一微服務(wù)日志交給日志服務(wù)器處理,日志處理服務(wù)器有4個(gè)服務(wù),分別為Debug,info,warn,error,然后服務(wù)直接通訊采用direct,發(fā)布訂閱的方式,來(lái)發(fā)送消息,然后我們?cè)偻驴催@個(gè)圖,我們?cè)谶@個(gè)圖當(dāng)中呢,有三個(gè)重要的環(huán)節(jié),第一個(gè)就是有一個(gè)服務(wù)方,這個(gè)服務(wù)方是什么呢,就是消息的生產(chǎn)者,第二個(gè)是我們的消息隊(duì)列,第三個(gè)是INFO日志服務(wù)器和ERROR日志服務(wù)器,這兩個(gè)是什么呢,是我們的消息接收者,就是我們的Consumer,這個(gè)是Provider,那么我們按照這個(gè)圖,去實(shí)現(xiàn)一下,在這里呢,我們要注意的是什么呢,第一個(gè)就是消息隊(duì)列里有一個(gè)要求,他的交換器類型我們用的是direct,然后他會(huì)根據(jù)我們所使用的路由器,來(lái)決定將不同的消息,放到不同的隊(duì)列當(dāng)中,我們有幾個(gè)隊(duì)列,有兩個(gè)隊(duì)列,那就要求我們根據(jù)不同的日志類型,放到兩個(gè)不同的隊(duì)列當(dāng)中,我們這里為什么只有兩個(gè)隊(duì)列呢,因?yàn)槭沁@樣的,日志處理服務(wù)器有四個(gè)服務(wù),我們這里其實(shí)只有兩個(gè)服務(wù),因?yàn)槟阕龀鲞@兩個(gè)和做出這四個(gè)沒有太大的區(qū)別,能夠做出這兩個(gè)那另外兩個(gè)也是一樣的,我們就以兩個(gè)服務(wù)作為我們的需求點(diǎn),一個(gè)是INFO日志處理服務(wù),一個(gè)ERROR日志處理服務(wù),所以說(shuō)你有兩個(gè)服務(wù)了,隊(duì)列我們使用兩個(gè)就可以了,然后隊(duì)列的名稱也給我們了,一個(gè)叫l(wèi)og.info,一個(gè)叫l(wèi)og.error,然后這兩個(gè)服務(wù)從不同的隊(duì)列當(dāng)中去取消息就可以了,這是我們的一個(gè)需求,接下來(lái)我們先去搭建環(huán)境,在搭建環(huán)境的時(shí)候,我們?cè)趺慈プ鲂“咐?我準(zhǔn)備兩個(gè)項(xiàng)目,兩個(gè)project,一個(gè)是服務(wù)的發(fā)送者,一個(gè)是消息的接收者,但是消息接收者你們看,我們畫的是兩個(gè)處理服務(wù),其實(shí)你單獨(dú)做兩個(gè)也可以,我們?yōu)榱斯?jié)省時(shí)間,就做一個(gè)Consumer,然后在Consumer里面呢,寫兩個(gè)不同的類,從兩個(gè)不同的隊(duì)列當(dāng)中,去獲取消息的一個(gè)實(shí)現(xiàn),當(dāng)然你拆分成兩個(gè)項(xiàng)目也可以,那我們接下來(lái)就搭建環(huán)境
回到我們的eclipse當(dāng)中,首先我們先要去創(chuàng)建兩個(gè)項(xiàng)目,大家一定要看懂這個(gè)圖,創(chuàng)建兩個(gè)項(xiàng)目,一個(gè)是服務(wù),一個(gè)是消息的生產(chǎn)者,一個(gè)是消息的消費(fèi)者,我們先來(lái)創(chuàng)建消息的生產(chǎn)者,我們不采用快速創(chuàng)建的方式了,你也可以直接new一個(gè)project,然后進(jìn)行相關(guān)的配置也可以,還有通過(guò)spring的官網(wǎng)去創(chuàng)建項(xiàng)目也可以,那我這里為了節(jié)省時(shí)間,把我們上一個(gè)項(xiàng)目做一個(gè)拷貝,我們把里面的內(nèi)容做一個(gè)修改,把這個(gè)項(xiàng)目copy一下,然后我們改個(gè)名,這個(gè)我們就不叫springcloud了,我們用的是direct交換器,然后我們這個(gè)做的是consumerrabbitmq-direct-consumerpom文件里做一些修改,這樣我們一個(gè)consumer就創(chuàng)建好了,我們看一下他的配置文件,spring.application.name=rabbitmq-direct-consumerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest然后再去創(chuàng)建一個(gè)Providerrabbitmq-direct-provider然后我們?cè)俑囊幌滤膒om文件,無(wú)論是consumer還是provider,pom文件就沒有什么需要修改的了,容器,測(cè)試,然后amqp,這個(gè)搭建環(huán)境當(dāng)中的第一個(gè)環(huán)節(jié),創(chuàng)建項(xiàng)目,項(xiàng)目創(chuàng)建好以后呢,完成一些配置,修改全局配置文件,我們看一下需要做什么配置呢,我們先看Consumer,現(xiàn)在在Consumer當(dāng)中配置文件,只有 一些基本的配置的,我們需要在Consumer的配置文件當(dāng)中呢,添加這么幾項(xiàng)配置,第一個(gè)我們需要給我們的交換器,未來(lái)要使用的交換器起個(gè)名稱,這個(gè)名稱如果我們直接寫死在代碼當(dāng)中呢,其實(shí)這樣就稱為硬編碼了,我們可以把交換器的名稱呢,定義到配置文件當(dāng)中,然后我們?nèi)ヅ渲梦募锶ト∷?就可以了,未來(lái)我們的交換器想要去交換名稱的時(shí)候,只要修改配置文件就可以了,所以呢第一個(gè)環(huán)節(jié),我們?nèi)ピO(shè)置交換器名稱的配置,設(shè)置交換器的名稱,然后你名稱叫什么都可以,無(wú)論是key也好,還是value也好,這個(gè)都是我們自己定義的,比如我們的key打算用這樣的一個(gè)結(jié)構(gòu)去定義,mq.config.exchange=log.directexchange不是交換器嗎,然后這是他的一個(gè)key,key后面所對(duì)應(yīng)的就是我們未來(lái)要使用的,我們自己起的一個(gè)名稱,比如這個(gè)名稱我們叫l(wèi)og.direct,為什么要交log.direct,看我們這個(gè)圖,看我們的需求,需求我們主要要做的消息處理,日志處理的這樣一個(gè)過(guò)程,所以我前面加一個(gè)log.direct,表示處理日志的一個(gè)交換器,我們需要加日志交換器的名稱,接下來(lái)我們還要去建立一些配置,增加一些配置,我們接著再往下看,我們?cè)偌右粋€(gè)info級(jí)別的隊(duì)列名稱,我們現(xiàn)在設(shè)置的是什么,還得看這個(gè)圖,這不是有 兩個(gè)隊(duì)列的名稱嗎,隊(duì)列名稱不是我們自己起的嗎,那到底你這個(gè)隊(duì)列名稱是記錄info級(jí)別的呢,還是error級(jí)別的呢,我們肯定不能讓兩個(gè)隊(duì)列名稱相同,所以我們?cè)谂渲梦募?dāng)中,來(lái)給這兩個(gè)隊(duì)列起一個(gè)普通的名稱,然后未來(lái)給隊(duì)列起名稱的時(shí)候,不要從配置文件里獲取不就行了嗎,所以我就建立一個(gè)info的隊(duì)列名稱,這個(gè)名我們?cè)趺唇心?比如我們還是以mq作為前綴,mq.config.queue.info,表示我隊(duì)列的名稱是,這個(gè)隊(duì)列是info級(jí)別的隊(duì)列,然后我們給他起一個(gè)名字,名字叫l(wèi)og.infomq.config.queue.info=log.infoinfo的名稱建立完了,就是隊(duì)列的名稱建立完了,我們還要建立什么呢,交換器和隊(duì)列之間還有一個(gè)箭頭,有一個(gè)router-key,這是什么呢,其實(shí)這個(gè)我們上節(jié)課已經(jīng)說(shuō)過(guò)了,這個(gè)就是路由件,路由件是什么呢,回顧一下,RabbitMQ決定消息該投遞到哪個(gè)隊(duì)列的一個(gè)規(guī)則,我現(xiàn)在這個(gè)交換器,是可以把信息放到不同的隊(duì)列當(dāng)中的,但是往哪個(gè)隊(duì)列里放,你得給我一個(gè)規(guī)則,那么其實(shí)這個(gè)規(guī)則,就是這個(gè)Router-key,就是我們說(shuō)的路由鍵,所以如果我們采用的是發(fā)布訂閱式的,direct的交換器,他只要是路由key相同的,他就會(huì)把這些信息放到一個(gè)隊(duì)列當(dāng)中,所以說(shuō)我們現(xiàn)在,在做這個(gè)需求的時(shí)候,我們要告訴交換器,進(jìn)到這個(gè)隊(duì)列里的消息,他的路由鍵是什么,只要你保證不同的消息,擁有相同的路由鍵,他們就會(huì)進(jìn)入到相同的隊(duì)列當(dāng)中,所以我們還得去配置路由鍵,路由鍵是我們自己來(lái)配置的,其實(shí)他就是一個(gè)字符串,接下來(lái)我們?cè)賮?lái)配置路由鍵,先來(lái)配info的路由鍵mq.config.queue.info.routing.key=log.info.routing.key這個(gè)也是我們自己起的,我們這個(gè)路由鍵叫什么呢,我們還是叫mq.config.queue.info.routing.key,然后我們給他起一個(gè)key,當(dāng)然這個(gè)key叫什么都行,我們叫l(wèi)og.info.routing.key,表示的是info級(jí)別的路由信息,那么到這我們的info信息就配置完了,接下來(lái)我們還有一個(gè)error級(jí)別的,所以我們還得去配置一個(gè)error級(jí)別的,error的隊(duì)列名稱,然后還有error的路由鍵mq.config.queue.error=log.error
mq.config.queue.error.routing.key=log.error.routing.key然后我們把這個(gè)copy過(guò)來(lái),做一個(gè)改變,把info全部改成error就可以了,這樣我們就做了兩套的隊(duì)列名稱和路由鍵,一套是info的,一套是error的,當(dāng)然如果你要想去做debug,跟warn的話,你這里加相應(yīng)的key和value就可以了,我們這里就做兩個(gè),這樣消息的接收者,Consumer的配置文件,就搞定了,第一個(gè)修改consumer的配置文件,然后我們就來(lái)看Provider的,Provider我們也得對(duì)他做一個(gè)修改,我們還是看這個(gè)圖,現(xiàn)在Provider和Consumer他們使用同一類的交換器,是不是才能把信息發(fā)送到不同的隊(duì)列里,你服務(wù)器通過(guò)這個(gè)交換器發(fā)送過(guò)來(lái),然后接收者才能通過(guò)這個(gè)隊(duì)列把消息取出來(lái),所以他這塊也得配置交換器,這樣我們就把Consumer里面的copy過(guò)來(lái),這個(gè)拿過(guò)來(lái)mq.config.exchange=log.direct交換器的配置在Provider里面,然后Provider還要配什么呢,還得配路由鍵,就是他在這,也得根據(jù)路由鍵,發(fā)消息的時(shí)候,消息也得帶路由鍵,你不帶路由鍵,交換器哪知道你的消息放到消息隊(duì)列里,所以得根據(jù)你的路由鍵知道你的消息發(fā)送到哪個(gè)路由鍵當(dāng)中,所以他肯定也得用路由鍵,那我們就得把這兩個(gè)級(jí)別的,路由鍵copy過(guò)來(lái),放到Provider當(dāng)中mq.config.queue.info.routing.key=log.info.routing.key對(duì)于Provider來(lái)講,主要配置這三項(xiàng)就可以了,這個(gè)是修改Provider的配置文件,這樣按照我們圖形的需求,我們基本的環(huán)境就搭建完畢了
<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-direct-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><!-- 這個(gè)插件,可以將應(yīng)用打包成一個(gè)可執(zhí)行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
spring.application.name=rabbitmq-direct-consumerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=log.direct
mq.config.queue.info=log.info
mq.config.queue.info.routing.key=log.info.routing.key
mq.config.queue.error=log.error
mq.config.queue.error.routing.key=log.error.routing.key
<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-direct-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><!-- 這個(gè)插件,可以將應(yīng)用打包成一個(gè)可執(zhí)行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
spring.application.name=rabbitmq-direct-providerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
mq.config.exchange=log.direct
mq.config.queue.info.routing.key=log.info.routing.key
mq.config.queue.error=log.error
?
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的RaDirect交换器-搭建环境的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ原理讲解
- 下一篇: Direct交换器-编写消费者