天天看點

SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)

阿裡巴巴開源注冊配置中心

點選免費觀看教學視訊

在前面文章中我們學習了Nacos注冊中心注冊中心傳送門,接下來我們來學習配置中心。

Nacos配置中心

配置中心知名的有

Apllo

Spring Cloud Config

application.yml

裡邊配置的一些系統變量資料, 通常會再

Controller

裡邊用

@Value

取出使用, 但是你要是想改變他,就要重新改代碼,打包,部署,十分麻煩,我們需要讓配置檔案的值變得動起來,

Nacos

也采用了

Spring Cloud

原生注解

@RefreshScope

實作配置自動更新,

  1. 在需要添加配置中心的服務中添加mvn依賴
    <!-- SpringCloud Ailibaba Nacos Config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
               
  2. 修改

    bootstrap.yml

    配置檔案,這裡我以

    order-service

    應用為例,新增配置中心屬性,如下:
    server:
      port: 6010
    spring:
      application:
        name: order-service
      cloud:
        nacos:
          discovery:
            #必須配置ip位址
            server-addr: localhost:8848
            # 将自己的服務注冊到注冊中心
            register-enabled: true
          # 配置中心新增部分  
          config:
            server-addr: localhost:8848
            file-extension: yaml
      profiles:
        active: dev
    # 新加屬性,作為配置測試        
    merber:
      name: 訂單服務中的配置名稱
      age: 18  
               
    配置檔案加載的優先級(由高到低)

    bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

  3. OrderController

    類中添加

    @RefreshScope

    注解
    @RestController
    @RequestMapping("order")
    @RefreshScope //動态重新整理配置,重要
    public class OrderController {
    
        //Spring正常取值
        @Value("${merber.name:}")
        private String merberName;
        
        @Value("${merber.age:}")
        private Integer merberAge;
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("get")
        public String get(){
            String result = restTemplate.getForObject("http://course-service/course/list", String.class);
            return result + ",merberName:" + merberName + ",merberAge:" + merberAge;
        }
    }
               
  4. 給配置中心預設添加一個資料集 (Data Id)
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
  5. 配置中心命名規則
    • Data Id:

      Nacos Spring Cloud

      中,資料集(Data Id) 的配置完整格式如下:

      ${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

      ,通俗一點就是

      字首-環境-擴充名

      • prefix:預設為

        spring.application.name

        的值,也可以通過配置項

        spring.cloud.nacos.config.prefix

        來配置
        # 手動指定
        spring:
          cloud:
            nacos:
              config:
                prefix: order-service-config
          
        # 若不指定,預設采用應用名的方案
        spring:
          application:
            name: order-sevice #服務名
                   
      • active:是配置開發環境的值,一個程式不可能總是在開發環境,可能需要切換到測試環境,上線環境,他們的配置檔案都是不同的,是以為了友善環境切換,我們配置不同的開發環境文檔。比如以前我們在

        application.yml

        中有配置dev、test、prod,其中dev就是開發環境。。

        注意:當

        spring.profile.active

        為空時,對應的連接配接符

        -

        也将不存在,dataId的拼接格式變成

        ${prefix}.${file-extension}

        spring:
          profiles:
            active: dev #表示開發環境
        
                   
      • file-extension:最後我們需要指定配置檔案類型,預設是

        properties

        。我們可以自己指定檔案類型,比如配置:
        spring:
          cloud:
            nacos:
              config:
                file-extension: yaml #指定配置檔案類型為yaml檔案
                   
        Nacos為我們提供了:

        TEXT、JSON、XML、YAML、HTML、Properties

        幾種類型
      • 最終配置

        指定好配置檔案類型,我們最終在配置中心新增配置檔案就是:

        order-sevice-dev.yaml

    • Group
      ${spring.cloud.nacos.config.group}
      若未配置則取Nacos預設值:DEFAULT_GROUP
                 
  6. 啟動服務驗證
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
    再次重新整理浏覽器請求檢視
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
    到此配置中心接入完畢,課件代碼詳見:https://gitee.com/appdoc/it235.git,tag名:1.2.0
    SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)

命名空間

Nacos

引入了命名空間(

Namespace

)的概念來進行多環境配置和服務的管理及隔離,

Namespace

也是官方推薦的多環境支援方案。

例如,你可能有

dev,test和prod

三個不同的環境,那麼使用一套 nacos 叢集可以分别建以下三個不同的

namespace

。在沒有明确指定命名空間配置的情況下, 預設新增的所有配置都在public空間,Nacos控制台對不同的

Namespace

做了Tab欄分組展示,如下圖:

SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)
SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)

隔離開發,測試,生産環境可以添加命名空間,然後在

bootstrap.yml

配置檔案添加命名空間的id即可切換到對應的命名空間,使用對應空間下的配置檔案:

cloud:
    nacos:
      config:
        namespace: a65a17de-e8f3-4d00-8d87-91549aaa0f02 #對應建立的命名空間的UUID
           
SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)

也可以基于微服務來建立命名空間,用每一個微服務名來命名,達到隔離每一個微服務的目的,哪一個微服務需要配置直接去對應的微服務空間下找配置即可,使得項目更加結構化。

SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)

命名空間課件代碼詳見:https://gitee.com/appdoc/it235.git,tag名:1.3.0

SpringBoot2.X整合Nacos做配置中心(Spring Cloud Alibaba)

Data ID

Data ID 通常用于組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱辨別。Data ID 通常采用類 Java package的命名規則保證全局唯一性。此命名規則非強制。

大多數時候我們可能更加傾向于将不同的配置分開寫到不同的配置檔案中,将一個配置檔案按功能拆分成不同的檔案,然後在程式組合加載到一起組成一個完整的配置檔案。比如我想把 DB類 和 日志類 的配置拆分開寫到兩個配置中,nacos也是支援這種一個配置中心多個配置集這種寫法的。

  1. 我們在nacos中建立兩個

    Data ID

    分别是

    db.yaml

    log.yaml

    的檔案。
  2. 在配置檔案中分别加入部配置設定置内容
  3. 更改

    bootstrap.yml

    中的nacos配置為
    spring:
      cloud:
        nacos:
          config:
            extension-configs[0]:
              data-id: db.yaml
              group: DEFAULT_GROUP   # 預設為DEFAULT_GROUP
              refresh: true   # 是否動态重新整理,預設為false
            extension-configs[1]:
              data-id: log.yaml
              group: DEFAULT_GROUP
              refresh: true
               
    為了更加清晰的在多個應用間配置共享的 Data Id,官方推薦使用

    shared-configs

    ,配置如下:
    spring:
      cloud:
        nacos:
          config:
            shared-configs[0]:
              data-id: db.yaml
              group: DEFAULT_GROUP   # 預設為DEFAULT_GROUP
              refresh: true   # 是否動态重新整理,預設為false
            shared-configs[1]:
              data-id: log.yaml
              group: DEFAULT_GROUP
              refresh: true
               
  4. 思考:在這2個檔案中出現相同配置,nacos如何選取?

    多個 Data Id 同時配置時,他的優先級關系是

    spring.cloud.nacos.config.extension-configs[n].data-id

    其中 n 的值越大,優先級越高。

    注意:

    spring.cloud.nacos.config.extension-configs[n].data-id

    的值必須帶檔案擴充名,檔案擴充名既可支援

    properties

    ,又可以支援

    yaml/yml

    。 此時

    spring.cloud.nacos.config.file-extension

    的配置對自定義擴充配置的 Data Id 檔案擴充名沒有影響。
  5. 不同方式配置加載優先級

    Spring Cloud Alibaba Nacos Config

    目前提供了三種配置能力從 Nacos 拉取相關的配置。
    1. 通過

      spring.cloud.nacos.config.shared-configs[n].data-id

      支援多個共享 Data Id 的配置
    2. 通過

      spring.cloud.nacos.config.extension-configs[n].data-id

      的方式支援多個擴充 Data Id 的配置
    3. 通過内部相關規則(

      spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group

      )自動生成相關的 Data Id 配置
    當三種方式共同使用時,他們的一個優先級關系是:A < B < C
  6. 配置集拆分實踐

    以下配置集可以拆分為:db、log、mybatis 三塊

Group的使用

這是一個很靈活的配置項,并沒有固定的規定,可以用作多環境、多子產品、多版本之間區配置設定置,

namespace

因其TAB欄的設定就是用作環境隔離。

Group也能幹環境隔離這種事,但Group設計出來主要是做同一個環境中的不同服務分組,Group可以把不同的微服務劃分到同一個分組裡面去;預設所有的配置集都屬于: DEFAULT_ GROUP;

常見的分組場景(次元)

不同的應用或元件使用了相同的配置類型,比如:

  • database_url 配置和 MQ_topic 配置
  • 對内配置組,對外配置組

總結

  • dataid:配置檔案的名字,相當于主鍵的作用;
  • group: 不同的系統或微服務的配置檔案可以放在一個組裡。比如使用者系統和訂單系統的配置檔案都可以放在同個組中;
  • namespace: Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等;