• 當前位置:首頁 > IT技術 > 其他 > 正文

    (企業案例)Nacos Config 進階使用
    2022-09-06 22:48:43


    文章目錄

    一、SpringBoot 使用 Nacos Config 實現多環境切換
    1. 現象

    在日常開發過程中,對于同一個服務或者項目工程在不同的環境所需要的配置是不同的。如訪問數據庫、redis或者MQ其他中間件,往往需要進行環境隔離,如果每次部署都需要去修改配置文件的話,是十分不方面的。在微服務場景下,這個問題尤為突出,因為代碼工程的數量是傳統單項目的幾十倍。需要建筑一些組件,在不修改配置穩健的前提下動態的切換運行環境。Nacos Config提供了類似的解決方案。

    (企業案例)Nacos Config 進階使用_redis

    2. 引入依賴

    在pom文件中添加Nacos Config的依賴包,注意版本

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--服務注冊發現-->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    </dependencies>
    <dependencyManagement>
    <dependencies>
    <!--spring-cloud-alibaba 版本控制-->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
    3. 添加bootstrap.yaml配置文件
    spring:
    cloud:
    nacos:
    server-addr: localhost:8848 # nacos服務地址
    config:
    file-extension: yaml # 表示支持擴展的文件名
    application:
    name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置
    profiles:
    active: prod # 表示我需要向配置中心索要生產環境的配置
    4. 配置對應關系圖

    在Nacos Config 配置管理中新增配置如圖以及其對應關系如下:

    (企業案例)Nacos Config 進階使用_自動刷新_02

    5. 文件格式簡述

    索要文件的格式為${application.name}-spring。profiles.active.{file-extension}
    體現在nacos中,對應尚曼的格式Data id得知應該是nacos-config-prod.yaml

    6. 啟動nacos

    官網:
    ???https://nacos.io/zh-cn/docs/quick-start.html??

    # 啟動命令(standalone代表著單機模式運行,非集群模式):
    # linux
    sh startup.sh -m standalone

    # Windows

    (企業案例)Nacos Config 進階使用_配置文件_03


    ??http://localhost:8848/nacos/?? 賬號/密碼:nacos/nacos

    (企業案例)Nacos Config 進階使用_配置文件_04

    7. 添加生產配置

    標簽


    說明

    Data ID

    nacos-config-prod.yaml

    Group

    DEFAULT_GROUP

    默認,可以自定義

    描述

    簡述生產環境配置

    配置格式

    yaml

    文件擴展名選擇

    配置內容

    nacosProd: Production environment configuration

    和配置yml文件格式語法一樣

    (企業案例)Nacos Config 進階使用_自動刷新_05


    (企業案例)Nacos Config 進階使用_redis_06

    (企業案例)Nacos Config 進階使用_spring_07

    8. 添加測試controller
    package com.gblfy.alibab.nacosconfig.controller;

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RefreshScope
    public class NacosConfigController {


    @Value("${nacosProd}")
    private String nacosProd;

    @GetMapping("/nacosProd")
    public String getNacosProd() {
    return nacosProd;
    }

    }
    9. 啟動Springboot工程并觀察到如下日志則為成功

    (企業案例)Nacos Config 進階使用_redis_08

    10. 瀏覽器驗證

    打開瀏覽器訪問??http://localhost:8080/nacosProd??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_配置文件_09

    11. 調整激活環境

    修改bootstrap.yaml文件中激活環境調整為test環境??spring.profiles.active.test??

    spring:
    cloud:
    nacos:
    server-addr: localhost:8848 # nacos服務地址
    config:
    file-extension: yaml # 表示支持擴展的文件名
    application:
    name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置
    profiles:
    active: test # 表示我需要向配置中心索要生產環境的配置
    12. 新建test環境配置

    在nacos中新建data_id為nacos-config-test.yaml,并添加相同的配置參數,把環境參數的內容調整為test測試環境的

    (企業案例)Nacos Config 進階使用_配置文件_10

    13. test配置關系圖

    (企業案例)Nacos Config 進階使用_spring_11

    14. 測試方法

    添加test測試環境方法,把剛才生產的方法注釋掉,因為咱們現在激活的是test測試環境的配置

    ("${nacosProd}")
    // private String nacosProd;
    //
    // @GetMapping("/nacosProd")
    // public String getNacosProd() {
    // return nacosProd;
    // }

    @Value("${nacosTest}")
    private String nacosTest;

    @GetMapping("/nacosTest")
    public String getNacosTest() {
    return nacosTest;
    }
    15. 重啟springboot服務,監控控制臺輸出

    (企業案例)Nacos Config 進階使用_redis_12

    16. 瀏覽器驗證

    打開瀏覽器訪問??http://localhost:8080/nacosTest??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_redis_13

    17. 配置修改實時生效

    在修改nacos中修改配置實時生效測試

    修改前配置:

    (企業案例)Nacos Config 進階使用_spring_14


    修改后配置:

    (企業案例)Nacos Config 進階使用_自動刷新_15


    發布規則

    (企業案例)Nacos Config 進階使用_自動刷新_16


    不停止項目服務,打開瀏覽器訪問??http://localhost:8080/nacosTest??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_自動刷新_17


    其他環境同上這里就不一一驗證了。

    18. 不同環境配置動態切換如何實現?

    這里演示修改配置文件,到正式環境,激活那個環境配置是在命令腳本中配置好的
    會采用下面這種方式激活環境配置,這個命令配置環境的優先級比項目中的配置文件中的優先級高

    java -jar xxx.jar -Dspring.profiles.active=test
    二、如何解決不同環境相同配置的問題

    (企業案例)Nacos Config 進階使用_自動刷新_18

    2.1. 現象

    在實際的開發過程中,我們的工程項目所用到的配置參數大多數并不需要根據不同的環境進行區分,生產、測試、開發環境所用到的參數值是相同的。如何解決同一服務在多環境中,引用相同配置的問題呢?Nacos Config也提供了相應的解決方案。

    (企業案例)Nacos Config 進階使用_spring_19

    2.2. 添加配置

    在Nacos Config中添加配置,data_id為nacos-config.yaml,如圖所示:

    (企業案例)Nacos Config 進階使用_配置文件_20

    2.3. 增加測試方法

    在NacosConfigController類中添加讀取項目中共有相同配置的方法進行測試

    //    @Value("${nacosProd}")
    // private String nacosProd;
    //
    // @GetMapping("/nacosProd")
    // public String getNacosProd() {
    // return nacosProd;
    // }

    @Value("${nacosTest}")
    private String nacosTest;

    @GetMapping("/nacosTest")
    public String getNacosTest() {
    return nacosTest;
    }
    @Value("${nacosCommon}")
    private String nacosCommon;

    @GetMapping("/nacosCommon")
    public String getNacosCommon() {
    return nacosCommon;
    }
    2.4. 重新啟動項目,觀察控制臺

    (企業案例)Nacos Config 進階使用_redis_21

    2.5. 瀏覽器驗證

    打開瀏覽器訪問??http://localhost:8080/nacosTest??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_配置文件_22

    打開瀏覽器訪問??http://localhost:8080/nacosCommon??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_spring_23

    從上面測試可以看出,訪問test環境獨有的配置可以正常訪問。訪問項目中共有相同的配置也正常。
    此時,我們已經在nacos中配置了3個配置文件,nacos-config-prod.yaml、nacos-config-test.yaml和nacos-config.yaml

    (企業案例)Nacos Config 進階使用_spring_24

    三、如果同一個配置項在三個配置文件中都存在且值不同,最終項目讀取是哪個呢?
    3.1. 驗證思路

    (企業案例)Nacos Config 進階使用_redis_25


    驗證這個其實很簡單,只需要在環境獨有的配置中配置共有相同配置文件中相同的配置標簽讓他值不一樣,瀏覽器訪問不就知道了,對吧?

    這樣,演示在??nacos-config-test.yaml??文件中配置nacos-config.yaml文件中nacosCommon標簽,給他賦予不同的值進行測試。

    3.2. 添加相同配置

    nacos-config.yaml文件中原配置:

    (企業案例)Nacos Config 進階使用_redis_26


    在??nacos-config-test.yaml??文件中配置nacosCommon標簽值為

    添加相同配置

    在測試配置中添加與公用配置一樣的標簽屬性值不同,觀察誰的配置生效即可

    nacosTest: Test environment configuration v2
    nacosCommon: Common Environment Configuration 測試配置文件中,配置相同屬性值不同的測試案例

    (企業案例)Nacos Config 進階使用_redis_27


    規則發布

    (企業案例)Nacos Config 進階使用_redis_28

    3.3. 瀏覽器驗證

    打開瀏覽器訪問??http://localhost:8080/nacosCommon??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_redis_29


    實際讀取的配置信息是從??nacos-config-test.yaml??文件中讀取的。

    結論:如果配置了spring.profiles.active,則優先獲取nacos-config-{spring.profiles.active}.yaml中的值。

    四、不同微服務之間相同配置如何共享

    (企業案例)Nacos Config 進階使用_spring_30


    (企業案例)Nacos Config 進階使用_自動刷新_31

    4.1. 解決方案簡述

    像這種共有中間件的配置信息企業會采用單獨的配置文件來維護,Nacos Config為我們提供了二種配置方式來解決此類場景的問題,分別是extension-configs和shard-configs配置方式。

    4.2. 通過shard-configs配置方式

    在nacos中新建redis.yaml,添加配置信息,reidsip:127.0.0.1,然后,配置信息發布生效

    (企業案例)Nacos Config 進階使用_配置文件_32


    修改項目的bootstrap.yaml的配置文件,添加配置spring.cloud.nacos.config.shared-configs[0]

    spring:
    cloud:
    nacos:
    server-addr: localhost:8848 # nacos服務地址
    config:
    file-extension: yaml # 表示支持擴展的文件名
    shared-configs[0]:
    data_id: redis.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    #group: # 可以不寫 默認DEFAULT_GROUP
    application:
    name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置
    profiles:
    active: test # 表示我需要向配置中心索要生產環境的配置

    (企業案例)Nacos Config 進階使用_spring_33

    (企業案例)Nacos Config 進階使用_配置文件_34


    添加測試方法

    ("${redisip}")
    private String redisip;

    @GetMapping("/redisip")
    public String getredisip() {
    return redisip;
    }

    打開瀏覽器訪問??http://localhost:8080/redisip??驗證測試結果結果如圖:

    http://localhost:8080/redisip

    (企業案例)Nacos Config 進階使用_配置文件_35

    4.3. 如何添加多個shared-configs配置呢?

    在nacos中新建mq.yaml,添加配置信息mqip: 127.0.0.2

    (企業案例)Nacos Config 進階使用_spring_36


    修改項目的bootstrap.yaml問阿金,并添加shared-configs[1]:配置,具體配置線如下:

    spring:
    cloud:
    nacos:
    server-addr: localhost:8848 # nacos服務地址
    config:
    file-extension: yaml # 表示支持擴展的文件名
    shared-configs[0]:
    data_id: redis.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    #group: # 可以不寫 默認DEFAULT_GROUP
    shared-configs[1]:
    data_id: mq.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    #group: # 可以不寫 默認DEFAULT_GROUP
    application:
    name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置
    profiles:
    active: test # 表示我需要向配置中心索要生產環境的配置

    新增一個獲取mq信息的url以及方法

    package com.gblfy.alibab.nacosconfig.controller;

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RefreshScope
    public class NacosConfigController {


    // @Value("${nacosProd}")
    // private String nacosProd;
    //
    // @GetMapping("/nacosProd")
    // public String getNacosProd() {
    // return nacosProd;
    // }

    @Value("${nacosTest}")
    private String nacosTest;

    @GetMapping("/nacosTest")
    public String getNacosTest() {
    return nacosTest;
    }
    @Value("${nacosCommon}")
    private String nacosCommon;

    @GetMapping("/nacosCommon")
    public String getNacosCommon() {
    return nacosCommon;
    }
    @Value("${redisip}")
    private String redisip;

    @GetMapping("/redisip")
    public String getredisip() {
    return redisip;
    }
    @Value("${mqip}")
    private String mqip;

    @GetMapping("/mqip")
    public String getmqip() {
    return mqip;
    }

    }

    打開瀏覽器訪問??http://localhost:8080/mqip??驗證測試結果結果如圖:

    (企業案例)Nacos Config 進階使用_配置文件_37

    4.4. 通過extension-configs方式

    修改bootstrap.yaml文件,刪除shared-configs相關配置,增加extension-configs[0]和extension-configs[1]的配置如下:

    spring:
    cloud:
    nacos:
    server-addr: localhost:8848 # nacos服務地址
    config:
    file-extension: yaml # 表示支持擴展的文件名
    extension-configs[0]: # shared-configs是一個列表 List<Config> sharedConfigs
    data_id: redis.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    extension-configs[1]: # shared-configs是一個列表 List<Config> sharedConfigs
    data_id: mq.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    #group: # 可以不寫 默認DEFAULT_GROUP
    application:
    name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置
    profiles:
    active: test # 表示我需要向配置中心索要生產環境的配置

    重新啟動項目,分別訪問??http://localhost:8080/redisip???和??http://localhost:8080/mqip??驗證是否可以正常讀取redis.yaml和mq.yaml的配置信息

    (企業案例)Nacos Config 進階使用_spring_38


    (企業案例)Nacos Config 進階使用_redis_39

    4.5. 配置實時刷新測試驗證

    在nacos中修改redis.yaml和mq.yaml的信息,不重啟項目,直接訪問瀏覽器,驗證配置是否生效

    redis.yaml原配置:

    (企業案例)Nacos Config 進階使用_redis_40


    mq.yaml修改后配置:

    (企業案例)Nacos Config 進階使用_配置文件_41

    mq.yaml原配置:

    (企業案例)Nacos Config 進階使用_redis_42


    mq.yaml修改后配置:

    (企業案例)Nacos Config 進階使用_自動刷新_43

    訪問??http://localhost:8080/redisip???和??http://localhost:8080/mqip??驗證

    (企業案例)Nacos Config 進階使用_spring_44


    (企業案例)Nacos Config 進階使用_自動刷新_45

    (企業案例)Nacos Config 進階使用_配置文件_46

    五、多個shard-configs的文件中存在相同的配置
    5.1. 思考1

    如果多個shard-configs的文件中存在相同的配置,最終會以那個配置文件中的值為準?

    5.2. 分析驗證思路

    這樣場景例如:在redis.yaml和mq.yaml配置文件中有一個相同的配置屬性但是值不一樣,然后在項目中存在多個shard-configs的文件,到底優先獲取誰的配置問價心中的信息呢?對吧

    5.3. 驗證流程
    • 1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一個屬性為port的屬性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
    • 2.在項目中的bootstrap.yaml中配置多個shard-configs
    • 3.在測試類中添加測試方法
    • 4.瀏覽器驗證
    • 5.得出結論
    5.4. 流程實戰
    • 1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一個屬性為port的屬性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
    • (企業案例)Nacos Config 進階使用_自動刷新_47

    (企業案例)Nacos Config 進階使用_配置文件_48

    • 2.在項目中的bootstrap.yaml中配置多個shard-configs
    spring:
    cloud:
    nacos:
    server-addr: localhost:8848 # nacos服務地址
    config:
    file-extension: yaml # 表示支持擴展的文件名
    extension-configs[0]: # shared-configs是一個列表 List<Config> sharedConfigs
    data_id: redis.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    extension-configs[1]: # shared-configs是一個列表 List<Config> sharedConfigs
    data_id: mq.yaml
    refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新
    #group: # 可以不寫 默認DEFAULT_GROUP
    application:
    name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置
    profiles:
    active: test # 表示我需要向配置中心索要生產環境的配置
    • 3.在測試類中添加測試方法
    ("/port")
    public String getport() {
    return port;
    }
    六、配置文件優先級
    6.1. springboot

    提示springboot配置文件優先級
    (bootstrap.ptoterties > bootstrap.yaml > application.ptoterties > bootstrap.yaml)

    6.2. nacos

    如果同時在extension-configs和shard-configs存在相同的配置,最終會以那個文件中的值為準?
    總結下configdemo.yaml、configdemo-test.yaml、和shard-configs、extension-configs讀取優先級

    true
    - data-id: shareconfig3.yml
    group: share4_group
    refresh: true
    shared-configs:
    - data-id: shareconfig1.yml
    refresh: true
    - data-id: shareconfig2.yml
    refresh: true

    spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,優先級越高,因此會走group=share4_group的配置。
    spring.cloud.nacos.config.shared-configs[n].data-id默認跟上面一樣的邏輯。

    不同方式配置加載優先級
    Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置。

    A: 通過 spring.cloud.nacos.config.shared-configs[n].data-id 支持多個共享 Data Id 的配置
    B: 通過 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多個擴展 Data Id 的配置
    C: 通過內部相關規則(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自動生成相關的 Data Id 配置

    當三種方式共同使用時,他們的一個優先級關系是:A < B < C


    本文摘自 :https://blog.51cto.com/g

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码