Stories

Detail Return Return

【Spring開發】SpringCloud服務端基礎框架第5篇:SpringCloud01,1.認識微服務【附代碼文檔】 - 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 -->

📚📚倉庫code.zip 👉直接-->:   https://gitlab.com/yiqing112/backend/-/blob/main/Spring/Sprin...    🍅🍅

<!-- end:bj1 -->

✨ 本教程項目亮點

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

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

SpringCloud01

1.認識微服務

隨着互聯網行業的發展,對服務的要求也越來越高,服務架構也從單體架構逐漸演變為現在流行的微服務架構。這些架構之間有怎樣的差別呢?

1.0.學習目標

瞭解微服務架構的優缺點

1.1.單體架構

單體架構:將業務的所有功能集中在一個項目中開發,打成一個包部署。

單體架構的優缺點如下:

優點:

  • 架構簡單
  • 部署成本低

缺點:

  • 耦合度高(維護困難、升級困難)

1.2.分佈式架構

分佈式架構:根據業務功能對系統做拆分,每個業務功能模塊作為獨立項目開發,稱為一個服務。

分佈式架構的優缺點:

優點:

  • 降低服務耦合
  • 有利於服務升級和拓展

缺點:

  • 服務調用關係錯綜複雜

MyBatis 官方文檔

分佈式架構雖然降低了服務耦合,但是服務拆分時也有很多問題需要思考:

  • 服務拆分的粒度如何界定?
  • 服務之間如何調用?
  • 服務的調用關係如何管理?

人們需要制定一套行之有效的標準來約束分佈式架構。

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.總結

  • 單體架構:簡單方便,高度耦合,擴展性差,適合小型項目。例如:學生管理系統
  • 分佈式架構:鬆耦合,擴展性好,但架構複雜,難度大。適合大型互聯網項目,例如:京東、淘寶

Spring WebFlux 文檔

  • 微服務:一種良好的分佈式架構方案

    ①優點:拆分粒度更小、服務更獨立、耦合度更低

    ②缺點:架構非常複雜,運維、監控、部署難度提高

  • SpringCloud是微服務架構的一站式解決方案,集成了各種優秀微服務功能組件

2.服務拆分和遠程調用

任何分佈式架構都離不開服務的拆分,微服務也是一樣。

2.1.服務拆分原則

這裏我總結了微服務拆分時的幾個原則:

  • 不同微服務,不要重複開發相同業務
  • 微服務數據獨立,不要訪問其它微服務的數據庫
  • 微服務可以將自己的業務暴露為接口,供其它微服務調用

2.2.服務拆分示例

以課前資料中的微服務cloud-demo為例,其結構如下:

cloud-demo:父工程,管理依賴

  • order-service:訂order單微服務,負責訂order單相關業務
  • user-service:用户微服務,負責用户相關業務

要求:

  • 訂order單微服務和用户微服務都必須有各自的數據庫,相互獨立
  • 訂order單服務和用户服務都對外暴露Restful的接口
  • 訂order單服務如果需要查詢用户信息,只能調用用户服務的Restful接口,不能查詢用户數據庫

Quarkus 文檔

2.2.1.導入Sql語句

首先,將課前資料提供的cloud-order.sqlcloud-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查詢用户的接口:

查詢的結果如圖:

Baeldung Java 教程

2.3.1.案例需求:

修改order-service中的根據id查詢訂order單業務,要求在查詢訂order單的同時,根據訂order單中包含的userId查詢出用户信息,一起返回。

Spring Boot 官方文檔

因此, 需要在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部署了多個實例,如圖:

![](/img/bVdh4pu)



大家思考幾個問題:

- order-service在發起遠程調用的時候,該如何得知user-service實例的ip地址和端口?
- 有多個user-service實例地址,order-service調用時該如何選擇?
- order-service如何得知某個user-service實例是否依然健康,是不是已經宕機?



## 3.1.Eureka的結構和作用

這些問題都需要利用SpringCloud中的註冊中心來解決,其中最廣為人知的註冊中心就是Eureka,其結構如下:

![](/img/bVdh4pw)



回答之前的各個問題。

問題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端



因此,接下來 動手實踐的步驟包括:

![](/img/bVdh4pt)



## 3.2.搭建eureka-server

首先大家註冊中心服務端:eureka-server,這必須是一個獨立的微服務

### 3.2.1.創建eureka-server服務

在cloud-demo父工程下,創建一個子模塊:

![](/img/bVdmoMG)

填寫模塊信息:

![](/img/bVdmoMH)



然後填寫服務信息:

![](/img/bVdmoMI)



### 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

Spring Test 文檔

eureka:
client:

service-url: 
  defaultZone: http://127.0.0.1:10086/eureka



### 3.2.5.啓動服務

啓動微服務,然後在瀏覽器訪問:http://127.0.0.1:10086

看到下面結果應該是成功了:

![](/img/bVdh4ps)







## 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地址:

Add a new Comments

Some HTML is okay.