🏆🏆🏆教程全知識點簡介: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 -->
📚📚倉庫code.zip 👉直接-->: https://gitlab.com/yiqing112/backend/-/blob/main/Spring/Sprin... 🍅🍅
<!-- end:bj1 -->
✨ 本教程項目亮點
🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考
🎯🎯🎯全教程總章節
🚀🚀🚀本篇主要內容
SpringCloud01
1.認識微服務
隨着互聯網行業的發展,對服務的要求也越來越高,服務架構也從單體架構逐漸演變為現在流行的微服務架構。這些架構之間有怎樣的差別呢?
1.0.學習目標
瞭解微服務架構的優缺點
1.1.單體架構
單體架構:將業務的所有功能集中在一個項目中開發,打成一個包部署。
單體架構的優缺點如下:
優點:
- 架構簡單
- 部署成本低
缺點:
- 耦合度高(維護困難、升級困難)
1.2.分佈式架構
分佈式架構:根據業務功能對系統做拆分,每個業務功能模塊作為獨立項目開發,稱為一個服務。
分佈式架構的優缺點:
優點:
- 降低服務耦合
- 有利於服務升級和拓展
缺點:
- 服務調用關係錯綜複雜
分佈式架構雖然降低了服務耦合,但是服務拆分時也有很多問題需要思考:
- 服務拆分的粒度如何界定?
- 服務之間如何調用?
- 服務的調用關係如何管理?
人們需要制定一套行之有效的標準來約束分佈式架構。
1.3.微服務
微服務的架構特徵:
- 單一職責:微服務拆分粒度更小,每一個服務都對應唯一的業務能力,做到單一職責
- 自治:團隊獨立、技術獨立、數據獨立,獨立部署和交付
- 面向服務:服務提供統一標準的接口,與語言和技術無關
- 隔離性強:服務調用做好隔離、容錯、降級,避免出現級聯問題
微服務的上述特性其實是在給分佈式架構制定一個標準,進一步降低服務之間的耦合度,提供服務的獨立性和靈活性。做到高內聚,低耦合。
因此,可以認為微服務是一種經過良好架構設計的分佈式架構方案 。
但方案該怎麼落地?選用什麼樣的技術棧?全球的互聯網公司都在積極嘗試自己的微服務落地方案。
其中在Java領域最引人注目的就是SpringCloud提供的方案了。
1.4.SpringCloud
SpringCloud是目前國內使用最廣泛的微服務框架。官網地址:https://spring.io/projects/spring-cloud。
SpringCloud集成了各種微服務功能組件,並基於SpringBoot實現了這些組件的自動裝配,從而提供了良好的開箱即用體驗。
其中常見的組件包括:
另外,SpringCloud底層是依賴於SpringBoot的,並且有版本的兼容關係,如下:
課堂學習的版本是 Hoxton.SR10,因此對應的SpringBoot版本是2.3.x版本。
1.5.總結
- 單體架構:簡單方便,高度耦合,擴展性差,適合小型項目。例如:學生管理系統
- 分佈式架構:鬆耦合,擴展性好,但架構複雜,難度大。適合大型互聯網項目,例如:京東、淘寶
-
微服務:一種良好的分佈式架構方案
①優點:拆分粒度更小、服務更獨立、耦合度更低
②缺點:架構非常複雜,運維、監控、部署難度提高
- SpringCloud是微服務架構的一站式解決方案,集成了各種優秀微服務功能組件
2.服務拆分和遠程調用
任何分佈式架構都離不開服務的拆分,微服務也是一樣。
2.1.服務拆分原則
這裏我總結了微服務拆分時的幾個原則:
- 不同微服務,不要重複開發相同業務
- 微服務數據獨立,不要訪問其它微服務的數據庫
- 微服務可以將自己的業務暴露為接口,供其它微服務調用
2.2.服務拆分示例
以課前資料中的微服務cloud-demo為例,其結構如下:
cloud-demo:父工程,管理依賴
- order-service:訂order單微服務,負責訂order單相關業務
- user-service:用户微服務,負責用户相關業務
要求:
- 訂order單微服務和用户微服務都必須有各自的數據庫,相互獨立
- 訂order單服務和用户服務都對外暴露Restful的接口
- 訂order單服務如果需要查詢用户信息,只能調用用户服務的Restful接口,不能查詢用户數據庫
2.2.1.導入Sql語句
首先,將課前資料提供的cloud-order.sql和cloud-user.sql導入到mysql中:
cloud-user表中初始數據如下:
cloud-order表中初始數據如下:
cloud-order表中持有cloud-user表中的id字段。
2.2.2.導入demo工程
用IDEA導入課前資料提供的Demo:
項目結構如下:
導入後,會在IDEA右下角出現彈窗:
點擊彈窗,然後按下圖選擇:
會出現這樣的菜單:
配置下項目使用的JDK:
2.3.實現遠程調用案例
在order-service服務中,有一個根據id查詢訂order單的接口:
根據id查詢訂order單,返回值是Order對象,如圖:
其中的user為null
在user-service中有一個根據id查詢用户的接口:
查詢的結果如圖:
2.3.1.案例需求:
修改order-service中的根據id查詢訂order單業務,要求在查詢訂order單的同時,根據訂order單中包含的userId查詢出用户信息,一起返回。
因此, 需要在order-service中 向user-service發起一個http的請求,調用http://localhost:8081/user/{userId}這個接口。
大概的步驟是這樣的:
- 註冊一個RestTemplate的實例到Spring容器
- 修改order-service服務中的OrderService類中的queryOrderById方法,根據Order對象中的userId查詢User
- 將查詢的User填充到Order對象,一起返回
2.3.2.註冊RestTemplate
首先, 在order-service服務中的OrderApplication啓動類中,註冊RestTemplate實例:
package cn.itcast.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
retu
# 3.Eureka註冊中心
假如 的服務提供者user-service部署了多個實例,如圖:

大家思考幾個問題:
- order-service在發起遠程調用的時候,該如何得知user-service實例的ip地址和端口?
- 有多個user-service實例地址,order-service調用時該如何選擇?
- order-service如何得知某個user-service實例是否依然健康,是不是已經宕機?
## 3.1.Eureka的結構和作用
這些問題都需要利用SpringCloud中的註冊中心來解決,其中最廣為人知的註冊中心就是Eureka,其結構如下:

回答之前的各個問題。
問題1:order-service如何得知user-service實例地址?
獲取地址信息的流程如下:
- user-service服務實例啓動後,將自己的信息註冊到eureka-server(Eureka服務端)。這個叫服務註冊
- eureka-server保存服務名稱到服務實例地址列表的映射關係
- order-service根據服務名稱,拉取實例地址列表。這個叫服務發現或服務拉取
問題2:order-service如何從多個user-service實例中選擇具體的實例?
- order-service從實例列表中利用負載均衡算法選中一個實例地址
- 向該實例地址發起遠程調用
問題3:order-service如何得知某個user-service實例是否依然健康,是不是已經宕機?
- user-service會每隔一段時間(默認30秒)向eureka-server發起請求,報告自己狀態,稱為心跳
- 當超過一定時間沒有發送心跳時,eureka-server會認為微服務實例故障,將該實例從服務列表中剔除
- order-service拉取服務時,就能將故障實例排除了
> 注意:一個微服務,既可以是服務提供者,又可以是服務消費者,因此eureka將服務註冊、服務發現等功能統一封裝到了eureka-client端
因此,接下來 動手實踐的步驟包括:

## 3.2.搭建eureka-server
首先大家註冊中心服務端:eureka-server,這必須是一個獨立的微服務
### 3.2.1.創建eureka-server服務
在cloud-demo父工程下,創建一個子模塊:

填寫模塊信息:

然後填寫服務信息:

### 3.2.2.引入eureka依賴
引入SpringCloud為eureka提供的starter依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
### 3.2.3.編寫啓動類
給eureka-server服務編寫一個啓動類,一定要添加一個@EnableEurekaServer註解,開啓eureka的註冊中心功能:
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
### 3.2.4.編寫配置文件
編寫一個application.yml文件,內容如下:
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
### 3.2.5.啓動服務
啓動微服務,然後在瀏覽器訪問:http://127.0.0.1:10086
看到下面結果應該是成功了:

## 3.3.服務註冊
下面, 將user-service註冊到eureka-server中去。
### 1)引入依賴
在user-service的pom文件中,引入下面的eureka-client依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
### 2)配置文件
在user-service中,修改application.yml文件,添加服務名稱、eureka地址: