使用RabbitMQ实现松耦合设计
生活随笔
收集整理的這篇文章主要介紹了
使用RabbitMQ实现松耦合设计
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們把三種交換器講解完畢了,我們再來看一下,如果使用RabbitMQ,實(shí)現(xiàn)松耦合設(shè)計(jì),要講松耦合,我們得先回到就是為什么要使用RabbitMQ,解決什么問題,在這章節(jié)當(dāng)中呢,分別給大家介紹了一下,我們用消息隊(duì)列對我們系統(tǒng)的一個(gè)優(yōu)點(diǎn),比如像同步變異步,還有解耦,這個(gè)解耦所展示的含義是什么呢,我如果對當(dāng)前操作的服務(wù)增加了,你看我訂單服務(wù)原來操作短信服務(wù),Email服務(wù),Push服務(wù),那現(xiàn)在我又新建一個(gè)微信服務(wù),如果我們沒有MQ系統(tǒng),我們的消息隊(duì)列接入的話,回到我們傳統(tǒng)的模型下,如果我這一塊加了一個(gè)微信服務(wù),那么也就意味著我現(xiàn)在,我的訂單服務(wù)必須要代碼修改,我原來在訂單服務(wù)當(dāng)中,調(diào)用短信服務(wù)的接口,調(diào)用Email服務(wù)的接口,調(diào)用APP-Push服務(wù)的接口,現(xiàn)在我又加了一個(gè)微信服務(wù),這塊肯定也好去調(diào)用微信服務(wù)的接口,那這樣就不符合我們開閉的原則了,應(yīng)該還知道吧,對于添加代碼是開放的,但是對于修改代碼是關(guān)閉的,你不能去修改這里的東西,修改肯定會(huì)影響我們的健壯性的,對修改的部分做重新測試,所以說呢,我們現(xiàn)在要做的是,通過MQ系統(tǒng),去實(shí)現(xiàn)解耦和松耦合的設(shè)計(jì),MQ系統(tǒng)接入以后,我們訂單服務(wù)的消息,然后通過MQ系統(tǒng),再將消息發(fā)送給不同的服務(wù)平臺(tái),那么有新的服務(wù)介入了,只要讓微信服務(wù)去訂閱MQ里的消息就可以了,那么對于我訂單服務(wù)來講,沒有任何的代碼修改,這就是解耦上的一個(gè)設(shè)計(jì)思路
來說一下解耦的實(shí)現(xiàn),在這里我們還是以上一個(gè)案例,在這里我們要說明一下,一定要注意,對于服務(wù)與服務(wù)之間的解耦,其實(shí)跟你用什么交換器沒有關(guān)系,關(guān)鍵是你要入MQ系統(tǒng),才能夠解耦,明白我的意思吧,不要認(rèn)為案例是拿fanout交換器去寫的,現(xiàn)在我想要來解耦的話,是不是得非用fanout,不是,direct,topic都可以實(shí)現(xiàn)解耦,它是都是MQ里面的交換器,所以只要你在服務(wù)和服務(wù)之間使用MQ系統(tǒng),或者消息隊(duì)列,你就可以實(shí)現(xiàn)松耦合的設(shè)計(jì),我只是做一個(gè)代碼的實(shí)現(xiàn)而已,先看這個(gè)圖,這個(gè)需求,我原來有短信服務(wù),有Push服務(wù),現(xiàn)在我是不是加了一個(gè)紅包服務(wù),那么也就意味著,現(xiàn)在我要在我的消息隊(duì)列當(dāng)中,讓紅包服務(wù)來訂閱我MQ當(dāng)中的消息,那我這里是不是得加一個(gè)隊(duì)列,紅包會(huì)去訂閱這個(gè)隊(duì)列
你看我們這個(gè)圖是不是只要改Consumer就可以了,還需要?jiǎng)覲rovider嗎,不用的,回到我們的Consumer當(dāng)中,首先我們的配置文件需要改一下,圖中已經(jīng)畫的很清楚了,所以我這里還要給另一個(gè)隊(duì)列起一個(gè)名mq.config.queue.red=red我們就叫read得了,我們現(xiàn)在給隊(duì)列起個(gè)名稱,然后接下來我們是不是要添加服務(wù),叫RedReceiver,然后在這個(gè)服務(wù)當(dāng)中,我們要改的第一個(gè)是隊(duì)列的名稱,value="${mq.config.queue.red}",讀我們properties文件里的這個(gè)配置mq.config.queue.red=red然后回過來,在這里fanout也不要?jiǎng)?#64;RabbitListener(bindings=@QueueBinding(value=@Queue(value="${mq.config.queue.red}",autoDelete="true"),exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT))
)打印這里我們是不是得修改一下,接到消息以后,給用戶發(fā)送10元紅包@RabbitHandler
public void process(String msg){System.out.println("給用戶發(fā)送10元紅包........receiver: "+msg);
}所以在整個(gè)編程過程當(dāng)中,我并沒有修改Provider的代碼,我只是在Consumer添加了代碼了,并沒有去修改其他的class,這個(gè)是搭建環(huán)境,第一個(gè)修改配置文件,第二個(gè)添加RedReceiver,然后接下來我們來測試一下,我們先把Consumer啟動(dòng),啟動(dòng)沒有問題,我們接下來再去運(yùn)行Provider,向他發(fā)送消息,觀察控制臺(tái),我們可以看到,給用戶發(fā)送10元紅包的RedReceiver,也運(yùn)行了,他已經(jīng)收到這個(gè)消息了,也是Hello RabbitMQ,我們只要對添加的新服務(wù),去消息隊(duì)列訂閱我們的消息就可以,所以這是一個(gè)典型的松耦合的設(shè)計(jì),對于添加代碼是開放的,對于修改代碼是關(guān)閉的,我們主要是添加一個(gè)紅包服務(wù),來給大家講解一下,服務(wù)與服務(wù)之間用RabbitMQ以后,所帶來一個(gè)松耦合的一個(gè)設(shè)計(jì),這是非常靈活的
spring.application.name=rabbitmq-fanout-consumerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guestmq.config.exchange=order.fanout
mq.config.queue.sms=order.sms
mq.config.queue.push=order.pushmq.config.queue.red=red
package com.learn;import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** 消息接收者* @author Administrator* @RabbitListener bindings:綁定隊(duì)列* @QueueBinding value:綁定隊(duì)列的名稱* exchange:配置交換器* key:路由鍵* * @Queue value:配置隊(duì)列名稱* autoDelete:是否是一個(gè)可刪除的臨時(shí)隊(duì)列* * @Exchange value:為交換器起個(gè)名稱* type:指定具體的交換器類型*/
@Component
@RabbitListener(bindings=@QueueBinding(value=@Queue(value="${mq.config.queue.red}",autoDelete="true"),exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)))
public class RedReceiver {/*** 接收消息的方法。采用消息隊(duì)列監(jiān)聽機(jī)制* @param msg*/@RabbitHandlerpublic void process(String msg){System.out.println("給用戶發(fā)送10元紅包........receiver: "+msg);}
}
?
總結(jié)
以上是生活随笔為你收集整理的使用RabbitMQ实现松耦合设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS查看 占用 内存 最多的 进
- 下一篇: RabbitMQ消息持久化处理