🏆🏆🏆教程全知識點簡介: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訂閲事件,不關心誰發來的消息。
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的基本結構:
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
代碼實現:
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


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實現消息發送:
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