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