Nacos配置中心使用整理


  在系統開發過程中,開發者通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成。配置變更是調整系統運行時的行為的有效手段。

 

  如果微服務架構中沒有使用統一配置中心時,所存在的問題:

  • 配置文件分散在各個項目里,不方便維護

  • 配置內容安全與權限

  • 更新配置后,項目需要重啟

 

  nacos配置中心:系統配置的集中管理(編輯、存儲、分發)、動態更新不重啟回滾配置(變更管理、歷史版本管理、變更審計)等所有與配置相關的活動

 

    

 

 

    

 

  NacosSpring Cloud的整合:

 

  1.在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默認為所屬工程配置spring.application.name 的值(即:nacos-provider),也可以通過配置項 spring.cloud.nacos.config.prefix來配置;

  • spring.profile.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot文檔注意:當 spring.profile.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}

  • file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 propertiesyaml 類型;默認為 properties ;

  

 

   

  即 dataId 為 配置所屬工程的spring.application.name的值 + "." + properties/yml;

 

  官方文檔:

  https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

  https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

   

  2.配置內容:

  項目中易變的內容

 

  • 從配置中心讀取配置

  添加依賴:

 <dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
	<version>2.1.2.RELEASE</version>
</dependency>

  版本說明 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

  

  bootstrap.yml中配置 Nacos server 的地址和應用名

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #Nacos配置中心地址
        file-extension: yaml #文件拓展格式

  

  注意:bootstrap.yml添加了spring.application.name,在appliation.yml不需要再添加;

  之所以需要配置 spring.application.name ,是因為它是構成 Nacos 配置管理 dataId字段的一部分。在springboot工程中,bootstrap.properties的加載優先級更高

  

@RefreshScope
@RestController
public class ProviderController {

    @Value("${DevConfig}")
    private String devConfig;

    @GetMapping("invoke")
    public String invoke() {
        return LocalTime.now() + " invoke,devConfig:" + devConfig;
    }
}

 

  調用結果:

  

 

  • 名稱空間切換環境

  在實際開發中,通常有多套不同的環境(默認只有public),那么這個時候可以根據指定的環境來創建不同的 namespce,例如,開發、測試和生產三個不同的環境,那么使用一套 nacos 集群可以分別建以下三個不同的 namespace。以此來實現多環境的隔離;

 

  

 

  可以發現有四個名稱空間:public(默認)以及我們自己添加的3個名稱空間(prod、dev、test),可以點擊查看每個名稱空間下的配置文件,當然現在只有public下有一個配置;

  默認情況下,項目會到public下找 服務名.properties文件;

  接下來,在dev名稱空間中也添加一個nacos-provider.properties配置。這時有兩種方式:

  1. 切換到dev名稱空間,添加一個新的配置文件。缺點:每個環境都要重復配置類似的項目

  2. 直接通過clone方式添加配置,並修改即可(推薦)

  

 

   編輯

    

 

  在服務提供方nacos-provider中切換命名空間,修改bootstrap.yml添加如下配置

spring:
  cloud:
    nacos:
      config:
        namespace: 288ad42c-c8e0-4b92-b8df-7d7883ad8507

  

   namespace的值為:

  

 

   重啟服務,調用結果:

  

 

  • 回滾配置

  

 

 

  

 

 

  • 加載多配置文件

  偶爾情況下需要加載多個配置文件。假如現在dev名稱空間下有三個配置文件:nacos-provider.properties、redis.properties、jdbc.properties

 

  

 

  

 

    

  

 

  nacos-provider.properties默認加載,怎么加載另外兩個配置文件?

  在bootstrap.yml文件中添加如下配置:

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        extension-configs:
          - refresh: true
            data-id: redis.properties
          - refresh: true
            data-id: jdbc.properties

 

  修改上面的代碼:

@RefreshScope
@RestController
public class ProviderController {

    @Value("${DevConfig}")
    private String devConfig;

    @Value("${jdbc.url}")
    private String jdbcUrl;

    @Value("${redis.url}")
    private String redisUrl;

    @GetMapping("invoke")
    public String invoke() {
        return LocalTime.now() + " invoke,devConfig:" + devConfig +
                ",jdbcUrl:" + jdbcUrl + ",redisUrl:" + redisUrl;
    }
}

  

  

 

  • 配置的分組

  在實際開發中,除了不同的環境外。不同的微服務或者業務功能,可能有不同的redis及mysql數據庫,也就說每個微服務項目可能會有相應的開發環境,測試環境,預發環境,生產環境等;

  區分不同的環境我們使用名稱空間(namespace),區分不同的微服務或功能,使用分組(group)

  也可以反過來使用,名稱空間和分組只是為了更好的區分配置,提供的兩個維度而已;

  

  新增一個redis.properties,所屬分組為nacos-provider:

  

  

  現在開發環境中有兩個redis.propertis配置文件,一個是默認分組(DEFAULT_GROUP),一個是provider組

  默認情況下從DEFAULT_GROUP分組中讀取redis.properties,如果要切換到nacos-provider分組下的redis.properties,需要修改如下配置:

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        extension-configs:
          - refresh: true
            group: nacos-provider
            data-id: redis.properties
          - refresh: true
            data-id: jdbc.properties    

  

 

  • Nacos配置持久化

  注:Nacos如果不修改配置,Nacos作為配置中心保存的配置數據是保存在內存的,也就是當Nacos服務重啟后,之前保存的數據就會清空的;

  如何將配置數據進行持久化?

  需要配置使用的數據源;

 

  參考:[https://nacos.io/zh-cn/docs/deployment.html]

  

   參考:[https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html]

 

   

 

 

   sql語句:[https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql]

   application.properties:[https://github.com/alibaba/nacos/blob/master/distribution/conf/application.properties] 

   

 

 

   修改完配置后,重啟Nacos服務,Nacos的數據就可以持久化了;

   

 

    

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM