Stories

Detail Return Return

【Spring開發】SpringCloud服務端基礎框架第3篇:RabbitMQ,1.初識MQ【附代碼文檔】 - Stories Detail

🏆🏆🏆教程全知識點簡介:Docker實用篇 0.學習目標 1.初識Docker 1.2.Docker和虛擬機的區別 2.Docker的基本操作 2.1.鏡像操作 2.1.3.案例1-拉取、查看鏡像 2.1.5.練習 3.Dockerfile自定義鏡像 3.3.構建Java項目 3.4.小結 4.Docker-Compose 4.3.部署微服務集羣 4.3.1.compose文件 4.3.3.打包 設置docker鏡像源 關閉 禁止開機啓動防火牆 安裝 修改權限 補全命令 RabbitMQ 1.初識MQ 1.1.同步和異步通訊 1.2.技術對比: 2.快速入門 2.2.RabbitMQ消息模型 2.3.導入Demo工程 2.4.入門案例 2.4.1.publisher實現 3.1.3.測試 3.2.WorkQueue 3.2.1.消息發送 3.2.4.能者多勞 3.3.發佈/訂閲 3.4.Fanout 3.4.1.聲明隊列和交換機 3.5.Direct 3.6.Topic 3.6.1.説明 SpringCloud01 1.認識微服務 1.1.單體架構 2.服務拆分和遠程調用 2.1.服務拆分原則 2.3.實現遠程調用案例 2.3.1.案例需求: 2.3.2.註冊RestTemplate 3)啓動多個user-service實 4.Ribbon負載均衡 4.1.負載均衡原理 4.2.源碼跟蹤 1)LoadBalancerIntercepor 3)負載均衡策略IRule 5.Nacos註冊中心 5.1.認識和安裝Nacos 5.2.服務註冊到nacos 1)引入依賴 2)配置nacos地址 3)重啓 5.3.服務分級存儲模型 5.3.2.同集羣優先的負載均衡 5.4.權重配置 Nacos安裝指南 1.Windows安裝 1.1.下載安裝包 1.2.解壓 1.3.端口配置 1.4.啓動 1.5.訪問 2.Linux安裝 2.1.安裝JDK 3.Gateway服務網關 3.1.為什麼需要網關 3.3.斷言工廠

<!-- start:bj1 -->

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047224948    中查看

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047224948    中查看

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

RabbitMQ

1.初識MQ

1.1.同步和異步通訊

微服務間通訊有同步和異步兩種方式:

同步通訊:就像打電話,需要實時響應。

異步通訊:就像發郵件,不需要馬上回復。

兩種方式各有優劣,打電話可以立即得到響應,但是你卻不能跟多個人同時通話。發送郵件可以同時與多個人收發郵件,但是往往響應會有延遲。

1.1.1.同步通訊

之前學習的Feign調用就屬於同步方式,雖然調用可以實時得到結果,但存在下面的問題:

總結:

同步調用的優點:

  • 時效性較強,可以立即得到結果

同步調用的問題:

  • 耦合度高
  • 性能和吞吐能力下降
  • 有額外的資源消耗
  • 有級聯失敗問題

1.1.2.異步通訊

異步調用則可以避免上述問題:

以購買產品為例,用户支fu後需要調用訂order單服務完成訂order單狀態修改,調用物流服務,從倉庫分配響應的庫存並準備發貨。

在事件模式中,支fu服務是事件發佈者(publisher),在支fu完成後只需要發佈一個支fu成功的事件(event),事件中帶上訂order單id。

訂order單服務和物流服務是事件訂閲者(Consumer),訂閲支fu成功的事件,監聽到事件後完成自己業務即可。

為了解除事件發佈者與訂閲者之間的耦合,兩者並不是直接通信,而是有一箇中間人(Broker)。發佈者發佈事件到Broker,不關心誰來訂閲事件。訂閲者從Broker訂閲事件,不關心誰發來的消息。

MyBatis 官方文檔

Broker 是一個像數據總線一樣的東西,所有的服務要接收數據和發送數據都發到這個總線上,這個總線就像協議一樣,讓服務間的通訊變得標準和可控。

好處:

  • 吞吐量提升:無需等待訂閲者處理完成,響應更快速
  • 故障隔離:服務沒有直接調用,不存在級聯失敗問題
  • 調用間沒有阻塞,不會造成無效的資源佔用
  • 耦合度極低,每個服務都可以靈活插拔,可替換
  • 流量削峯:不管發佈事件的流量波動多大,都由Broker接收,訂閲者可以按照自己的速度去處理事件

缺點:

  • 架構複雜了,業務沒有明顯的流程線,不好管理
  • 需要依賴於Broker的可靠、安全、性能

好在現在開源軟件或雲平台上 Broker 的軟件是非常成熟的,比較常見的一種就是 今天要學習的MQ技術。

1.2.技術對比:

MQ,中文是消息隊列(MessageQueue),字面來看就是存放消息的隊列。也就是事件驅動架構中的Broker。

比較常見的MQ實現:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

幾種常見MQ的對比:

RabbitMQ ActiveMQ RocketMQ Kafka
公司/社區 Rabbit Apache 阿里 Apache
開發語言 Erlang Java Java Scala&Java
協議支持 AMQP,XMPP,SMTP,STOMP OpenWire,STOMP,REST,XMPP,AMQP 自定義協議 自定義協議
可用性 一般
單機吞吐量 一般 非常高
消息延遲 微秒級 毫秒級 毫秒級 毫秒以內
消息可靠性 一般 一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延遲:RabbitMQ、Kafka

2.快速入門

2.1.安裝RabbitMQ

安裝RabbitMQ,參考課前資料:

MQ的基本結構:

Disruptor 文檔

Logback 文檔

JDK 11 API 文檔

RabbitMQ中的一些角色:

  • publisher:生產者
  • consumer:消費者
  • exchange個:交換機,負責消息路由
  • queue:隊列,存儲消息
  • virtualHost:虛擬主機,隔離不同租户的exchange、queue、消息的隔離

2.2.RabbitMQ消息模型

RabbitMQ官方提供了5個不同的Demo示例,對應了不同的消息模型:

2.3.導入Demo工程

課前資料提供了一個Demo工程,mq-demo:

導入後可以看到結構如下:

包括三部分:

  • mq-demo:父工程,管理項目依賴
  • publisher:消息的發送者
  • consumer:消息的消費者

2.4.入門案例

簡單隊列模式的模型圖:

官方的HelloWorld是基於最基礎的消息隊列模型來實現的,只包括三個角色:

  • publisher:消息發佈者,將消息發送到隊列queue
  • queue:消息隊列,負責接受並緩存消息
  • consumer:訂閲隊列,處理隊列中的消息

2.4.1.publisher實現

思路:

  • 建立連接
  • 創建Channel
  • 聲明隊列
  • 發送消息
  • 關閉連接和channel

代碼實現:

Spring Boot 官方文檔

AssertJ 文檔

package cn.itcast.mq.helloworld;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立連接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.設置連接參數,分別是:主機名、端口號、vhost、用户名、 
        factory.setHost("192.168.150.101");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立連接
        Connection connection = factory.newConnection();

        // 2.創建通道Channel
        Channel channel = connection.createChannel();

        // 3.創建隊列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.發送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("發送消息成功:【" + message + "】");

        // 5.關閉通道和連接
        channel.close();
        connection.close();

    }
}

2.4.2.consumer實現

代碼思路:

  • 建立連接
  • 創建Channel
  • 聲明隊列
  • 訂閲消息

代碼實現:

package cn.itcast.mq.helloworld;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class ConsumerTest {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立連接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.設置連接參數,分別是:主機名、端口號、vhost、用户名、 
        factory.setHost("192.168.150.101");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立連接
        Connection connection = factory.newConnection();

        // 2.創建通道Channel
        Channel channel = connectio

# 3.SpringAMQP

SpringAMQP是基於RabbitMQ封裝的一套模板,並且還利用SpringBoot對其實現了自動裝配,使用起來非常方便。

SpringAmqp的官方地址:https://spring.io/projects/spring-amqp

![](/img/bVdmmsN)

![](/img/bVdmmsO)



SpringAMQP提供了三個功能:

- 自動聲明隊列、交換機及其綁定關係
- 基於註解的監聽器模式,異步接收消息
- 封裝了RabbitTemplate工具,用於發送消息 



## 3.1.Basic Queue 簡單隊列模型

在父工程mq-demo中引入依賴

<!--AMQP依賴,包含RabbitMQ-->
<dependency>

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>

</dependency>




### 3.1.1.消息發送

首先配置MQ地址,在publisher服務的application.yml中添加配置:

spring:
rabbitmq:

host: 192.168.150.101 # 主機名
port: 5672 # 端口
virtual-host: / # 虛擬主機
username: itcast # 用户名
password: 123321 #  



然後在publisher服務中編寫測試類SpringAmqpTest,並利用RabbitTemplate實現消息發送:

JDK 17 API 文檔

package cn.itcast.mq.spring;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.juni

Add a new Comments

Some HTML is okay.