動態

詳情 返回 返回

【Spring開發】SpringCloud服務端基礎框架第8篇:SpringCloud實用篇02,0.學習目標【附代碼文 - 動態 詳情

🏆🏆🏆教程全知識點簡介: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 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

SpringCloud實用篇02

0.學習目標

1.Nacos配置管理

Nacos除了可以做註冊中心,同樣可以做配置管理來使用。

1.1.統一配置管理

當微服務部署的實例越來越多,達到數十、數百時,逐個修改微服務配置就會讓人抓狂,而且很容易出錯。 需要一種統一配置管理方案,可以集中管理所有實例的配置。

Nacos一方面可以將配置集中管理,另一方可以在配置變更時,及時通知微服務,實現配置的熱更新。

1.1.1.在nacos中添加配置文件

如何在nacos中管理配置呢?

然後在彈出的表單中,填寫配置信息:

注意:項目的核心配置,需要熱更新的配置才有放到nacos管理的必要。基本不會變更的一些配置還是保存在微服務本地比較好。

1.1.2.從微服務拉取配置

微服務要拉取nacos中管理的配置,並且與本地的application.yml配置合併,才能完成項目啓動。

但如果尚未讀取application.yml,又如何得知nacos地址呢?

因此spring引入了一種新的配置文件:bootstrap.yaml文件,會在application.yml之前被讀取,流程如下:

1)引入nacos-config依賴

首先,在user-service服務中,引入nacos-config的客户端依賴:

<!--nacos配置管理依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2)添加bootstrap.yaml

然後,在user-service中添加一個bootstrap.yaml文件,內容如下:

Ant 手冊

RxJava 文檔

JDBC API 文檔

spring:
  application:
    name: userservice # 服務名稱
  profiles:
    active: dev #開發環境,這裏是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件後綴名

這裏會根據spring.cloud.nacos.server-addr獲取nacos地址,再根據

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作為文件id,來讀取配置。

本例中,就是去讀取userservice-dev.yaml

3)讀取nacos配置

在user-service中的UserController中添加業務邏輯,讀取pattern.dateformat配置:

完整代碼:

package cn.itcast.user.web;

import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
    // ...略
}

在頁面訪問,可以看到效果:

1.2.配置熱更新

最終的目的,是修改nacos中的配置後,微服務中無需重啓即可讓配置生效,也就是配置熱更新

要實現配置熱更新,可以使用兩種方式:

1.2.1.方式一

在@Value注入的變量所在類上添加註解@RefreshScope:

1.2.2.方式二

使用@ConfigurationProperties註解代替@Value註解。

在user-service服務中,添加一個類,讀取patterrn.dateformat屬性:

JDK 11 API 文檔

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@Conf

# 2.Feign遠程調用



先來看 以前利用RestTemplate發起遠程調用的代碼:

![](/img/bVdh4oP)

存在下面的問題:

•代碼可讀性差,編程體驗不統一

•參數複雜URL難以維護



Feign是一個聲明式的http客户端,官方地址:https://github.com/OpenFeign/feign

其作用就是幫助 優雅的實現http請求的發送,解決上面提到的問題。

![](/img/bVdmCCj)





## 2.1.Feign替代RestTemplate

Fegin的使用步驟如下:

### 1)引入依賴

 在order-service服務的pom文件中引入feign的依賴:

Disruptor 文檔

<dependency>

Tinylog 文檔

<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>

OkHttp 文檔

</dependency>




### 2)添加註解

在order-service的啓動類添加註解開啓Feign的功能:

![](/img/bVdmCCj)



### 3)編寫Feign的客户端

在order-service中新建一個接口,內容如下:

package cn.itcast.order.client;

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("userservice")
public interface UserClient {

JDK 17 API 文檔

@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);

}




這個客户端主要是基於SpringMVC的註解來聲明遠程調用的信息,比如:

- 服務名稱:userservice
- 請求方式:GET
- 請求路徑:/user/{id}
- 請求參數:Long id
- 返回值類型:User

這樣,Feign就可以幫助 發送http請求,無需自己使用RestTemplate來發送了。





### 4)測試

修改order-service中的OrderService類中的queryOrderById方法,使用Feign客户端代替RestTemplate:

![](/img/bVdh4oQ)

是不是看起來優雅多了。





### 5)總結

使用Feign的步驟:

① 引入依賴

② 添加@EnableFeignClients註解

③ 編寫FeignClient接口

④ 使用FeignClient中定義的方法代替RestTemplate



## 2.2.自定義配置

Feign可以支持很多的自定義配置,如下表所示:

| 類型                   | 作用             | 説明                                                   |
| ---------------------- | ---------------- | ------------------------------------------------------ |
| **feign.Logger.Level** | 修改日誌級別     | 包含四種不同的級別:NONE、BASIC、HEADERS、FULL         |
| feign.codec.Decoder    | 響應結果的解析器 | http遠程調用的結果做解析,例如解析json字符串為java對象 |
| feign.codec.Encoder    | 請求參數編碼     | 將請求參數編碼,便於通過http請求發送                   |
| feign. Contract        | 支持的註解格式   | 默認是SpringMVC的註解                                  |
| feign. Retryer         | 失敗重試機制     | 請求失敗的重試機制,默認是沒有,不過會使用Ribbon的重試 |

一般情況下,默認值就能滿足 使用,如果要自定義時,只需要創建自定義的@Bean覆蓋默認Bean即可。



下面以日誌為例來演示如何自定義配置。

### 2.2.1.配置文件方式

基於配置文件修改feign的日誌級別可以針對單個服務:

feign:
client:

config: 
  userservice: # 針對某個微服務的配置
    loggerLevel: FULL #  日誌級別 

也可以針對所有服務:

feign:
client:

config: 
  default: # 這裏用default就是全局配置,如果是寫服務名稱,則是針對某個微服務的配置
    loggerLevel: FULL #  日誌級別 



而日誌的級別分為四種:

- NONE:不記錄任何日誌信息,這是默認值。
- BASIC:僅記錄請求的方法,URL以及響應狀態碼和執行時間
- HEADERS:在BASIC的基礎上,額外記錄了請求和響應的頭信息
- FULL:記錄所有請求和響應的明細,包括頭信息、請求體、元數據。



### 2.2.2.Java代碼方式

也可以基於Java代碼來修改日誌級別,先聲明一個類,然後聲明一個Logger.Level的對象:

public class DefaultFeignConfiguration {

@Bean
public Logger.Level feignLogLevel(){
    return Logger.Level.BASIC; // 日誌級別為BASIC
}

}




如果要**全局生效**,將其放到啓動類的@EnableFeignClients這個註解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .cla


🚀✨ (未完待續)項目系列下一章

📚下一篇 將進入更精彩的環節!
🔔 記得收藏 & 關注,第一時間獲取更新!
🍅 一起見證整個系列逐步成型的全過程。

Add a new 評論

Some HTML is okay.