首頁 > 軟體

SpringCloud 分散式微服務架構操作步驟

2022-07-12 22:00:52

前言

這篇筆記文章我還是沒有接上之前的java,因為我中間偷懶了,寫不動了。打算先把這篇安排下,然後再把之前的spring和springboot缺失的筆記補一下。至於啥時候補全,我也沒有定論。

寫部落格的真正目的就是做個筆記,以後自己忘記的知識點自己回顧一下。至於其他網站的盜文,我都無所謂了。畢竟網路文章博文這些其實還是沒有什麼保護的,又不是軟體著作權。

一直在看學習視訊,一直在b站學習。雖然自己菜啊,但是還是要努力啊!不然在這個社會我怕餓死。

那就從SpringCloud開始,還沒有補充前面的spring和springboot,但是之後一定會補全的。

SpringCloud是一種微服務的框架,利用它我們可以去做分散式服務開發。
至於具體的,我們現在開始介紹。

SpringCloud微服務

單體架構和微服務分散式架構

單體架構分析

在這之前我們所有的開發都是按照單體架構開發的。什麼是單體架構,其實就是所有的功能都放在一個專案中。然後部署的時候嗎,就去打包為整體的一個包進行部署。

像之前黑馬的單體架構基於Springboot和mybatisplus實現的瑞吉外賣這樣子就是單體架構。

這裡麵包含一些實體類,基本的設定類,以及一些公共·的資料處理的封裝的進行處理的類,還有擴充套件的實體類,其中主要的比較典型的就是三層架構,==資料存取層,業務邏輯層,表現層,這是mvc三層架構的基本設計理念。非常重要。在我們剛接觸到這樣的設計模式的時候,已經覺得這樣的設計模式已經非常秒了。從小白過渡到設計模式的時候。

加上Springboot這個強大的框架,我們可以簡化非常多的操作,而且可以某些操作上做的比較優雅。

我們認為在使用spring後可以極大的降低專案開發中程式碼的·1耦合度,但是其實這樣專案的功能龐大後之間的耦合度還是很高。

當然這樣開發部署的話成本肯定是成本低的。

但是單體架構帶來的缺點是什麼。說幾點。

首先一定是在專案整體開發所用的程式語言,一定是隻能用一種,整個專案的所有功能的開發只能用一種語言編寫。
還有耦合度帶來的問題啊,耦合度高的話,系統中只要一個模組出現問題,系統就很容易癱瘓。
還有專案的部署上線,需要功能開發完畢後才可以上線。造成的問題就是可能需要等待,無法及時滿足需求。
等等。這些在瞭解到分散式微服務後就可以瞭解到如何解決這些問題的。

微服務分散式架構分析

分散式架構的微服務有很多。


也就是說微服務並不是springcloud這一種。微服務的理念就是實現拆分功能的開發。將具體的功能分離出來。這樣帶來的好處就是你開發你的功能,我開發我的功能,互不影響。降低了偶爾度。而且在後面我們學到叢集這些等等後,就會理解到在優化升級的時候所帶來的的好處。比較常用的詞就是單一職責。

需要了解一下

這些我們在後面的學習中就會得到理解。

服務拆分和遠端呼叫

服務拆分 案例需求準備

現在我們提出一個簡單的需求。我們在一張訂單表中通過訂單的id 查詢到訂單的資料還有對應使用者的資料。
這樣的需求的話,我們需要在訂單的表的每個id對應一個使用者id,這樣我們才能做到表資料關聯。

tb_user 建表sql如下

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, '柳巖', '湖南省衡陽市');
INSERT INTO `tb_user` VALUES (2, '文二狗', '陝西省西安市');
INSERT INTO `tb_user` VALUES (3, '華沉魚', '湖北省十堰市');
INSERT INTO `tb_user` VALUES (4, '張必沉', '天津市');
INSERT INTO `tb_user` VALUES (5, '鄭爽爽', '遼寧省瀋陽市大東區');
INSERT INTO `tb_user` VALUES (6, '範兵兵', '山東省青島市');

SET FOREIGN_KEY_CHECKS = 1;

tb_brand 建表sql 如下

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '訂單id',
  `user_id` bigint(20) NOT NULL COMMENT '使用者id',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名稱',
  `price` bigint(20) NOT NULL COMMENT '商品價格',
  `num` int(10) NULL DEFAULT 0 COMMENT '商品數量',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tb_order
-- ----------------------------
INSERT INTO `tb_order` VALUES (101, 1, 'Apple 蘋果 iPhone 12 ', 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新國標電動車', 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, '駱駝(CAMEL)休閒運動鞋女', 43900, 1);
INSERT INTO `tb_order` VALUES (104, 4, '小米10 雙模5G 驍龍865', 359900, 1);
INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 雙模5G 視訊雙防抖', 299900, 1);
INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷靜星II ', 544900, 1);
INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人體工學電腦椅子', 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休閒男鞋', 31900, 1);

SET FOREIGN_KEY_CHECKS = 1;

從訂單表中獲取到訂單id然後返回訂單資料物件,然後獲取到user_id,然後將user_id傳入對user表的請求路徑中,這樣我們就可以獲取到user的封裝資料。這裡我們需要再加一個物件屬性。

這樣我們可以就可以對user資料進行封裝,在查詢結構中就會有這個物件資料。

這是我們準備的兩張表,當然這只是一個簡單的例子,我們後面要用這個例子做測試。

我們需要建立專案,專案下分模組來進行設計。因為這是一個人做,我們在一個專案下,分模組來進行分散式的這種操作模擬。

一個父模組,兩個子模組

先看父模組的pom,不過在這之前我們特別注意看一下這裡。

我們idea這裡的maven設定。不過我每次都得改。

一定要改到自己的maven設定裡面

從這裡看專案初步是OK的。

這是父maven的pom

現在我們新增必要依賴,首先將這個專案變成一個springboot專案

這就是Spring Boot的父級依賴,加入之後專案就變成了Spring Boot專案。spring-boot-starter-parent是一個特殊的starter,它用來提供相關的maven預設依賴。之後再引入。其他的依賴時,可以不用指定version標籤。

我們可以給專案maven指定jdk版本和編碼,一定要注意加的位置。

還有我們做的是一個springCloud微服務啊,我們需要準備這個環境

這裡特別注意springboot和springcloud的版本相容性,否則無法執行。

需要對應到版本。所以springCloud匯入這個依賴。

我們可以放到這個標籤下

複習一下它有什麼用處

Maven 可以通過 dependencyManagement 元素對依賴進行管理,它具有以下 2 大特性:
在該元素下宣告的依賴不會實際引入到模組中,只有在 dependencies 元素下同樣宣告了該依賴,才會引入到模組中。
該元素能夠約束 dependencies 下依賴的使用,即 dependencies 宣告的依賴若未指定版本,則使用 dependencyManagement 中指定的版本,否則將覆蓋 dependencyManagement 中的版本。
我們看到,這裡多了一個import,它的意思是將spring-boot-dependencies 中dependencyManagement的dependencies,全部引入到當前工程的dependencyManagement中

另外還有mysql的連線驅動,mybatis整合springboot框架分別匯入進來。

還有一個我們用到的工具

lombok外掛是為了方便實體類bean快速生成get set方法,從而不用手動新增

為什麼我們要這樣分開寫,複習一下
dependencies即使在子專案中不寫該依賴項,那麼子專案仍然會從父專案中繼承該依賴項(全部繼承)而我們的DepencyManagement是子工程依賴模組可選擇的。

至此父級maven工程依賴如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>cloud01</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>order-service</module>
        <module>user-service</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.29</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.2.2</version>
            </dependency>
        </dependencies>


    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


</project>

來看子級別pom

現在我們匯入必要依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud01</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order-server</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

    </dependencies>

</project>

還有一個打包外掛我們暫且可以不用
兩個子工程都需要這樣匯入

現在我們建立三成架構的目錄和類

新增設定資訊

同樣userservice

設定yml

這樣做好以後我們去做啟動類

遠端呼叫初步

我們還沒有寫啟動類,
user-service

我門需要是用RestTemplate實現服務呼叫。按照查詢的需求,我門需要在order-service這裡進行一個查詢,我門需要根據請求提交id引數查詢出來order的資料,然後根據order資料表裡面id對應的使用者id查詢出來使用者的資料,然後進行一個統一的封裝。這說明order-sertvice需要呼叫user-service。

我們來看order-sertvice的啟動類

我們除了寫出一個啟動類的規則後,還new出了RestTemplate的bean。這個bean在哪裡使用呢?

getForObject對應的就是get請求,User.class表示將返回的資料封裝到User物件裡面。

order-service的埠地址指定過。在yml檔案裡面。

注意現在還沒有用到Springcloud的東西,我們目前是模擬實現遠端呼叫。只不過現在和之前相比是將功能模組分開,而且啟動的不在是單獨的一個服務。

我們需要將兩個服務都啟動起來。

在postman中傳送請求

資料測試是沒有問題的。但是似乎上面的地址請求顯得十分笨拙。還有這裡其實並沒有實現真的遠端呼叫。只是模組之前的不同服務的之間的呼叫。還有就是服務的健康資訊1我們在呼叫的時候不得而知,如果對應呼叫的服務有問題我們在呼叫前也是無法得知的。如何對服務進行一個更好的管理,我們繼續往下看。

Eureka註冊中心

服務註冊與負載均衡

服務註冊

說明一下這個是幹嘛用的

Eureka 是 Netflix 出品的用於實現服務註冊和發現的工具,Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模組來實現服務註冊和發現
Eureka採用C-S的設計架構,包含Eureka Server 和Eureka Client兩個元件

它的原理就是基於服務提供者和服務消費者。像我們的orderservice需要去存取userservice,那麼userservice就是服務提供者,orderservice就是。服務消費者。

服務啟動後向Eureka註冊,Eureka Server會將註冊資訊向其他Eureka Server進行同步,當服務消費者要呼叫服務提供者,則向服務註冊中心獲取服務提供者地址,然後會將服務提供者地址快取在本地,下次再呼叫時,則直接從本地快取中取,完成一次呼叫。

在預設設定中EurekaServer服務在一定時間(預設為90秒)沒接受到某個服務的心跳連線後,EurekaServer會登出該服務。但是會存在當網路分割區發生故障,導致該時間內沒有心跳連線,但該服務本身還是健康執行的情況。Eureka通過“自我保護模式”來解決這個問題。
在自我保護模式中,Eureka Server會保護服務登入檔中的資訊,不再登出任何服務範例。

我們可以對服務建立多個節點,如果有的節點掛掉以後,就可以去啟用另外可用的服務。

當然這個是基於springcloud的。所以我們需要匯入相關的依賴。

在這之前啊,我們需要將eureka伺服器端建立出來

我們再建立一個模組

開啟這個pom檔案新增必要依賴

然後建立啟動類

一定要注意啟動類要放在java目錄的包下面,所以最好建立包後,將這個啟動類放到下面,不要直接放在java目錄下。

這裡我們做的就是伺服器端。

即熱是服務,那麼我們還是要設定一下,比如埠等等,所以需要在resource下面建立一個yml檔案。

一定要注意yml檔案中欄位的層級關係,這是非常嚴格的。

設定完這個後,我們需要設定使用者端。
首先還是需要引入依賴。

useservice 和orderservice都需要匯入。

另外需要設定伺服器端的地址

同樣是都需要設定。
初步的話其實還有一定就是這裡

我們需要指定一下服務名稱。先這樣設定一下,然後去啟動

三者都啟動

現在需要去存取一個地址

注意埠10086後不需要加eureka

我們現在需要去檢視服務是否註冊成功,或者說eureka伺服器端是否將userservice 和orderservice加入範例。

這樣就成功了。

然後我們就可以開啟去使用它了。
這裡我們可以修改一下這裡

但是在這之前,我們需要做一個負載均衡的指定,否則是無法解析服務地址。

然後這樣

這樣我們再次啟動,就可以去存取了。

Ribbon負載均衡

上面我們用到了負載策略

負載均衡是高可用網路基礎架構的關鍵元件,通常用於將工作負載分佈到多個伺服器來提高網站、應用、資料庫或其他服務的效能和可靠性。
注:圖片資料來自知乎
什麼是負載均衡
從這裡可以去看負載均衡策略
沒有負載均衡的服務架構

有負載均衡的服務架構

我們這樣的特點可以去用多範例部署的特點。

定要記得修改埠

將這個服務啟動起來

然後我們去eureka註冊中心看看有沒有範例

可以看到userservice一共有兩個範例物件了。
這樣建立多範例的好處就是如果一個範例存在問題的話就可以換另一個。我們這裡就模擬了多範例部署。

還有我們需要去觀察一下這個負載均衡策略,其實預設是輪詢的負載均衡策略。

我們可以去測試,多存取幾次userservice,而現在userservice有兩個範例,我們在postman測試工具做出測試,發出請求,看看具體呼叫的哪個範例。

注意現在需要改一個東西,就是上面有一個錯誤的地方。有關紀錄檔的。

logging.level設定紀錄檔級別,後面跟生效的區域,比如root表示整個專案,也可以設定為某個包下,也可以具體到某個類名(紀錄檔級別的值不區分大小寫)這裡需要注意,上面的包名沒有寫對。

然後開始測試,首先將控制檯的輸出全部清除掉。

我這裡從1到6一共存取6次。

然後來看控制檯的紀錄檔輸出,可見這是輪詢的方式

指定負載均衡規則

預設的是輪詢,我們可以自己去指定一個規則

所以就從這裡來重新指定規則

我們在orderservice的啟動類裡面寫,當然這個是程式碼的方式。並且,我們需要將它做成一個bean。

我們這樣定義是選擇了隨機的原則,代表隨機選擇一個伺服器。
然後我們去重新啟動測試

測試成功

如果採用組態檔的方式

兩者設定不同之處在於作用範圍。程式碼設定的話就是會在全部服務中起作用,而組態檔設定的話就只會在指定的服務起作用。

還有一個就是關於啟動問題的知識點,預設是懶載入。

我們這樣去設定

Nocas 註冊中心

環境設定啟動服務註冊

Nacos是阿里巴巴的一個產品,說實話,這個註冊中心是真的好用。下面我們開始介紹。

首先我們需要安裝這個服務,服務區官網下載就可以了。

官網 可以選擇點進去github下載服務。
目錄結構

然後進去bin目錄裡面,進行執行開啟服務
如何開啟服務,開啟手冊。

在快速開始這裡,我們可以進行執行命令。

將這個命令執行後就可以開啟這個服務了

然後我們去idea裡面設定相關的東西
然後在裡面設定相關的依賴,設定依賴的話就需要註釋掉eureka的依賴。
如果沒有在父工程新增阿里巴巴的依賴的話,我們需要進行新增依賴。

將這個依賴匯入到父工程裡面。

然後在子工程中將原來的eureka的依賴註釋掉
在pom檔案當中設定的就是使用者端依賴。因為伺服器端是已經下載安裝的。
我們需要將伺服器端的service和使用者端的sevice都設定依賴。

然後我們進行設定yml檔案進行設定
然後將eureka的設定註釋掉

然後我們將這幾個服務啟動。我們現在就不需要去啟動eureka了。

我們存取nacos的服務列表

管理頁面存取地址
進入到服務列表,我們可以看到服務列表檢視註冊情況

至此註冊成功。而且我們可以看到這裡userservice一共有兩個範例。

這裡我們可以看到具體的一些資訊,包括埠號,已經健康狀態,後面可以進行一些操作,包括服務上線下線的操作。

我們可以進去到服務列表具體範例的詳情,可以檢視到一些具體的資訊。

Nacos 分級儲存模型與叢集

這裡引入了一個新的概念。叢集的概念。

這裡先不用去關注叢集的具體的概念,但是在結合分散式服務的話,叢集可以幫助我們解決服務的跨區域的問題。跨區域部署伺服器。
按照上圖所示叢集部署的話,可以部署在不同的地域。杭州,上海等等。然後我們通過nacos進行叢集管理。包括相關的範例部署等等。

我們可以去模擬設定叢集

這裡我們指定了一個叢集,表示部署在此地。我們可以對這些服務都指定相關的服務叢集

好,現在再次啟動重新服務

我們可以看到一共有兩個叢集,這樣我們就指派成功了。

負載均衡

在nacos 也可以進行加權負載均衡

我們一共有兩個usersrvice的服務,我們可以去指定其中的一個權值,權值越低被存取呼叫的機率越1低,權值為0的話就不會被存取了。我們可以測試。

我們可以用postman進行存取測試。

用postman進行測試

可以看到多次存取都沒有存取到權值為0的服務範例,這樣其實就實現了一個權值的負載均衡策略。
當然你可以指定其他的值。

namespace 環境隔離

其實還有可以進行環境隔離的操作。
現在nacos操作平臺進行生成新的名稱空間。

我們的之前的名稱空間就是public型別,是一個保留空間。
我們可以自己去這裡建立空間,然後自己在程式碼設定中指定給那個服務設定相應的空間。

填寫保留空間的名字和描述就可以,Id可以自動生成。

我們給具體的服務設定名稱空間,就設定namespace,然後將id複製過去作為鍵的值。

名稱空間的作用就是相當於起到環境隔離的作用。
如果服務在不同的名稱空間,那麼這兩個服務就無法互相存取。

現在我們重新啟動userservice的一個範例,我們可以將,然後這個範例是必然不會和orderservive在同一個名稱空間。是不會存取到的。

我們測試orderservice能不能存取到userservice的伺服器端1。

可以看到是不能存取到的。

臨時範例和非臨時範例(存在依賴的修改更正)

臨時範例的服務在宕機後會從nacos的列表中被刪除掉,而非臨時範例不會被刪掉。

到這裡發現我之前匯入的依賴是不能這樣設定的。

前面的設定都可以支援

想要支援範例的設定管理的話需要匯入這個依賴

在自己需要的服務裡面匯入進來。我現在只在useservice這裡進行驗證臨時範例和非臨時範例的特點。

我現在的服務都重啟

注意看這裡,全部為false,然後現在為了對比做這樣的操作。
我將其中一個停掉。然後改為true

然後再啟動

你看這裡發生了什麼。為什麼會有兩個8082的埠的範例服務呢?原因是我們之前給它設定為非臨時範例,就算我們剛剛重啟了服務,但是它不會被刪除,現在我們關閉服務,看看設定為true的這個範例會不會被刪掉。

看吧已經刪掉,還有一點這裡的健康狀態和這個顏色我們之前的這個都變了。

對於臨時範例和非臨時範例的區別,nacos也做出了不同的檢測
臨時 範例:nacos會在超過15秒未收到心跳後將範例設定為不健康狀態;
超過30秒將範例刪除;
非臨時範例:nacos主動探知使用者端健康狀態,預設間隔為20秒;
健康檢查失敗後範例會被標記為不健康,不會被立即刪除。

統一設定管理與熱更新

我們先了解nacos是如何載入設定的

我們想要做的的是在nacos的管理介面進行設定,然後這個設定首先可以被載入,然後這樣的載入設定在我們釋出以後會自動生效,而不需要我們重啟伺服器,這樣的設定更新方法也叫做熱更新。

具體怎麼做呢?我們先去nacos的設定管理介面。在這裡我釋出了一個新的設定。

我們來看具體的詳情

這樣設定後然後釋出就可以了,當然這只是在nacos的設定列表進行的設定。我們還需要在idea裡面操作一些東西。

我們還需要引入一個依賴。nacos的設定管理依賴

這個設定依賴需要在你想要進行統一設定和熱部署操作的服務的pom中新增。

然後我們需要建立一個組態檔

這個組態檔的優先順序別高,nacos會先載入這個組態檔,然後會載入application.yml檔案,將著兩個組態檔的設定合併一起。
要記得在原來的組態檔中註釋掉一些可能重複的設定或者非必要的設定。

服務名,還有地址,叢集的話不需要,名稱空間的話,因為我的nacos新增的設定在public下面,所以我把之前指定的也註釋掉了。
在nacos管理設定列表設定的一些東西和這裡是對應的,所以一定要細心注意。

這樣的話我們如何知道設定生效,或者如何去驗證熱部署成功?

我們可以通過value讀取,將這個資料讀到Controller裡面,給這個值設定一個存取路徑。我們可以這樣去做。

這裡有個坑,就是如果你的nacos無法解析的話,就需要升級一下。升級到1.4.2.。
還有一點就是需要設定自動熱更新。

我現在的服務已經啟動,我們去存取。

你看這樣搜先載入到了。

現在我們在nacos設定管理那裡稍微改動一下。

釋出的時候會告訴你原始值和你修改的。
現在我們再去存取

這樣就驗證成功了。熱部署成功·。

還有一種屬性注入方式
我們需要去寫一個設定類

然後在Controller裡面這樣做

還有這種方法不需要去新增這個註解

需要注意的是,可能存在bean無法注入的問題。那麼我們可以去給他掃描。

------未完續更,等待

到此這篇關於SpringCloud 分散式微服務架構的文章就介紹到這了,更多相關SpringCloud微服務架構內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com