Springboot整合RabbitMQ消息中間件的使用
1、RabbitMQ概述
RabbitMQ是shiyongERLANG語言編寫的,實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。
常見的消息中間件:KAFKA、RabbitMQ、ActiveMQ、RocketMQ(可以處理分布式事務(wù))
1.1、什么是RabbitMQ?
【1、通過案例理解RabbitMQ】
你想和遠(yuǎn)方的好友實(shí)現(xiàn)通信,這個(gè)時(shí)候你給好友寫封信,我們將寫好的信封裝成一個(gè)信封,將信放到郵箱中,郵差就會(huì)在規(guī)定的時(shí)間將這封信送到遠(yuǎn)方好友的手中。
寄件人是A系統(tǒng),遠(yuǎn)方好友是B系統(tǒng),RabbitMQ就是郵箱,郵差就是信道。A系統(tǒng)和B系統(tǒng)可以通過RabbitMQ實(shí)現(xiàn)通信。
【2、為什么要使用RabbitMQ? 】
1、RabbitMQ實(shí)現(xiàn)了AMQP標(biāo)準(zhǔn)的消息服務(wù)器
2、可靠性,RabbitMQ的持久化支持,保證了消息的穩(wěn)定性;
3、RabbitMQ使用了Erlang開發(fā)語言,高并發(fā)、高可用、集群部署簡(jiǎn)單等特性;
【3、RabbitMQ能做什么?】
1、業(yè)務(wù)解耦:下訂單、扣減庫存、生成訂單、發(fā)紅包、發(fā)短信、異步操作、日志處理、跨平臺(tái)通信等。
2、流量消峰:控制請(qǐng)求量。
3、路由靈活:RabbitMQ有豐富的Exchange(交換器),通過關(guān)鍵字Routingkey判斷消息的具體隊(duì)列(Queue)。
1.2、RabbitMQ消息發(fā)送原理
1、生產(chǎn)者生產(chǎn)消息,發(fā)送給服務(wù)器端的Exchange交換器。
2、Exchange收到消息,根據(jù)用戶發(fā)送的RoutingKey,將消息轉(zhuǎn)發(fā)給匹配的Queue1或Queue2。
3、Queue1或Queue2收到消息后,將消息發(fā)送給訂閱者(消費(fèi)者1或消費(fèi)者2)。
4、消費(fèi)者收到消息,發(fā)送ACK給隊(duì)列確認(rèn)收到消息。
5、消費(fèi)者收到ACK確認(rèn)消息,然后刪除隊(duì)列中緩存的對(duì)應(yīng)消息。
1.3、RabbitMQ在項(xiàng)目中的應(yīng)用
A系統(tǒng)和B系統(tǒng)之間如果不是使用同一架構(gòu)或者語言編寫的,這個(gè)時(shí)候可以通過RabbitMQ進(jìn)行通信。
如A系統(tǒng)可以發(fā)送JSON類型的數(shù)據(jù),B系統(tǒng)獲取數(shù)據(jù)的時(shí)候可以解析JSON,達(dá)到跨系統(tǒng)交互。
2、Springboot整合RabbitMQ
2.1、配置工程包信息
核心包:spring-cloud-starter-bus-amqp
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.17</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.txc</groupId> <artifactId>springbootrabbitmqdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springbootrabbitmqdemo</name> <description>springbootrabbitmqdemo</description> <properties> <java.version>1.8</java.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.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
2.2、在application.yml文件中配置連接信息
spring: rabbitmq: addresses: localhost #IP地址 username: guest #用戶名 password: guest #密碼 dynamic: true #默認(rèn)創(chuàng)建一個(gè)AmqpAdmin的Bean 默認(rèn):true
2.3、在工程中創(chuàng)建RabbitMQ消息接收程序
@RabbitListener(queuesToDeclare = @Queue("myQueue "))作用:
1、讓監(jiān)聽關(guān)聯(lián)到myQueue隊(duì)列中
2、queuesToDeclare能夠?qū)崿F(xiàn)當(dāng)myQueue隊(duì)列不存在的時(shí)候,自動(dòng)創(chuàng)建
3、queuesToDeclare:后面的參數(shù)需要的是數(shù)組類型使用@Queue創(chuàng)建
@Configuration public class RabbitMQReceive { @RabbitListener(queuesToDeclare = @Queue("myQueue")) public void process(String message){ System.out.println("======消費(fèi)消息====="+message); } }
2.4、在工程中創(chuàng)建RabbitMQ消息發(fā)送程序
創(chuàng)建控制層,模擬向RabbitMQ消息中間件發(fā)送消息。
通過convertAndSend向RabbitMQ發(fā)送消息。
@Controller public class TestRabbitMQController { @Resource private AmqpTemplate amqpTemplate; @RequestMapping("/sendMessageToQueue") @ResponseBody public void sendMessageToQueue(){ amqpTemplate.convertAndSend("myQueue","{'code':'200','msg':'你想發(fā)的消息。'}"); } }
2.5、測(cè)試結(jié)果
訪問地址:http://localhost:8080/sendMessageToQueue
3、創(chuàng)建Exchange(交換器)綁定Queue
3.1、Exchange交換器的使用場(chǎng)景
我們要實(shí)現(xiàn)如果是華為的訂單就發(fā)送到huaweiQueue隊(duì)列中,如果是聯(lián)想的訂單就發(fā)送到lenovoQueue隊(duì)列中。
主要就是通過RoutingKey(huaweiKey、lenovoKey)來實(shí)現(xiàn)。
3.2、在工程中創(chuàng)建RabbitMQ接收器
通過@RabbitListener實(shí)現(xiàn)創(chuàng)建huaweiQueue隊(duì)列和computerExchange交換器,并通過huaweiKey實(shí)現(xiàn)隊(duì)列和交換器綁定。
在不指定交換器類型的情況下,默認(rèn)的交換器類型是direct
@RabbitListener(bindings = @QueueBinding( exchange = @Exchange("computerExchange"), key = "huaweiKey", value = @Queue("huaweiQueue") )) public void process1(String message){ System.out.println("======消費(fèi)消息====="+message); }
3.3、在工程中創(chuàng)建RabbitmQ消息發(fā)送程序
convertAndSend參數(shù)說明:convertAndSend(“交換器名稱”,”綁定key”,”需要發(fā)送的消息”);
@RequestMapping("/sendMessageToExchange") @ResponseBody public void sendMessageToExchange(){ amqpTemplate.convertAndSend("computerExchange","huaweiKey","{'code':'200','msg':'測(cè)試Exchange和Queue綁定'}"); }
3.4、測(cè)試結(jié)果
訪問地址:http://localhost:8080/sendMessageToExchange
到此這篇關(guān)于Springboot整合RabbitMQ消息中間件的使用的文章就介紹到這了,更多相關(guān)Springboot RabbitMQ消息中間件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java爬蟲Jsoup+httpclient獲取動(dòng)態(tài)生成的數(shù)據(jù)
這篇文章主要介紹了Java爬蟲Jsoup+httpclient獲取動(dòng)態(tài)生成的數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2017-05-05Mysql存儲(chǔ)java對(duì)象實(shí)例詳解
這篇文章主要介紹了Mysql存儲(chǔ)java對(duì)象實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11詳解Java中使用泛型實(shí)現(xiàn)快速排序算法的方法
這篇文章主要介紹了Java中使用泛型實(shí)現(xiàn)快速排序算法的方法,快速排序的平均時(shí)間復(fù)雜度為(n\log n),文中的方法立足于基礎(chǔ)而并沒有考慮優(yōu)化處理,需要的朋友可以參考下2016-05-05阿里的Easyexcel讀取Excel文件的方法(最新版本)
這篇文章主要介紹了阿里的Easyexcel讀取Excel文件(最新版本)的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12SpringBoot的application.yml不生效問題及解決
這篇文章主要介紹了SpringBoot的application.yml不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生信息管理系統(tǒng)代碼實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生信息管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04