SpringCloudAlibaba項目之Nacos-config配置中心


SpringCloudAlibaba隨筆目錄

一、SpringCloudAlibaba項目之父工程搭建

二、SpringCloudAlibaba項目之Nacos搭建及服務注冊

三、SpringCloudAlibaba項目之生產者與消費者

四、SpringCloudAlibaba項目之Ribbon負載均衡

五、SpringCloudAlibaba項目之OpenFeign遠程調用

六、SpringCloudAlibaba項目之Nacos-config配置中心

七、SpringCloudAlibaba項目之Sentinel流量控制

八、SpringCloudAlibaba項目之Seata分布式事務

九、SpringCloudAlibaba項目之GateWay網關

十、SpringCloudAlibaba項目之SkyWalking鏈路

 

SpringCloudAlibaba項目之Nacos-config配置中心

1、服務配置中心介紹

  首先我們來看一下,微服務架構下關於配置文件的一些問題:

  1、配置文件相對分散。在一個微服務架構下,配置文件會隨着微服務的增多變的越來越多,而且分散在各個微服務中,不好統一配置和管理。

  2、配置文件無法區分環境。微服務項目可能會有多個環境,例如:測試環境、預發布環境、生產環境。每一個環境所使用的配置理論上都是不同的,一旦需要修改,就需要我們去各個微服務下手動維護,這比較困難。

  3、配置文件無法實時更新。我們修改了配置文件之后,必須重新啟動微服務才能使配置生效,這對一個正在運行的項目來說是非常不友好的。

  基於上面這些問題,我們就需要配置中心的加入來解決這些問題。配置中心的思路是:

  • 首先把項目中各種配置全部都放到一個集中的地方進行統一管理,並提供一套標准的接口。
  • 當各個服務需要獲取配置的時候,就來配置中心的接口拉取自己的配置。
  • 當配置中心中的各種參數有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態更新。

  在業界常見的服務配置中心,有下面這些:

  Apollo

Apollo是由攜程開源的分布式配置中心。特點有很多,比如:配置更新之后可以實時生效,支持灰度發布功能,並且能對所有的配置進行版本管理、操作審計等功能,提供開放平台API。並且資料也寫的很詳細。

  Disconf

Disconf是由百度開源的分布式配置中心。它是基於Zookeeper來實現配置變更后實時通知和生效的。

  SpringCloud Config

這是Spring Cloud中帶的配置中心組件。它和Spring是無縫集成,使用起來非常方便,並且它的配置存儲支持Git。不過它沒有可視化的操作界面,配置的生效也不是實時的,需要重啟或去刷新。

  Nacos

這是SpingCloud alibaba技術棧中的一個組件,前面我們已經使用它做過服務注冊中心。其實它也集成了服務配置的功能,我們可以直接使用它作為服務配置中心。
 

 

2、Nacos-config簡介

  Nacos 是阿里巴巴開源的一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。
  Nacos Config就是一個類似於SpringCloud Config的配置中心。

使用nacos作為配置中心,其實就是將nacos當做一個服務端,將各個微服務看成是客戶端,我們將各個微服務的配置文件統一存放在nacos上,然后各個微服務從nacos上拉取配置即可。

官方文檔:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

Nacos 提供用於存儲配置和其他元數據的 key/value 存儲,為分布式系統中的外部化配置提供服務器端和客戶端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。

3、Client讀取配置

 Nacos 服務端初始化

1、啟動Nacos Server。啟動方式可見 Nacos 官網

2、啟動好Nacos之后,在Nacos添加如下的配置:

Data ID:    service-nacosconfig.properties

Group  :    DEFAULT_GROUP

配置格式:    Properties

配置內容:   user.name=service-nacosconfig-properties
            user.age=90

 注意:注意dataid是以 properties(默認的文件擴展名方式)為擴展名。

客戶端使用方式

pom.xml文件添加依賴

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

創建一個標准的 Spring Boot 應用

@SpringBootApplication
@EnableDiscoveryClient//可加可不加,依版本而定,從Spring Cloud Edgware開始,@EnableDiscoveryClient可省略。只需加上相關依賴,並進行相應配置,即可將微服務注冊到服務發現組件上。
public class ServiceNacosconfigApplication {
    public static void main(String[] args) {
        //SpringApplication.run(ServiceNacosconfigApplication.class, args);
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceNacosconfigApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :"+userName+"; age: "+userAge);
    }
}

在運行此 Example 之前, 必須使用 bootstrap.properties 配置文件來配置Nacos Server 地址,例如:

bootstrap.properties

# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息,如果不加可能讀取到的是電腦系統的用戶名和密碼
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 設置配置中心服務端地址,必須使用 bootstrap.properties 配置文件來配置Nacos Server 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,請不要填寫這個值,直接留空即可
# spring.cloud.nacos.config.namespace=

注意:注意當你使用域名的方式來訪問 Nacos 時,spring.cloud.nacos.config.server-addr 配置的方式為 域名:port。 例如 Nacos 的域名為abc.com.nacos,監聽的端口為 80,則 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。

application.properties

# 應用名稱
#會自動根據服務名拉取dataid對應的配置文件,如果服務名和dataid不一致,就需要手動指定dataid
spring.application.name=service-nacosconfig
# 應用服務 WEB 訪問端口
server.port=8070
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public

注意:bootstrap.properties配置文件要比application.properties文件先加載,但是兩種文件是可以共同存在的,只是加載的優先級不同而已。

一般客戶端讀取的配置文件根據對應的服務名稱來的。

 啟動這個 Example,可以看到如下輸出結果:

4、其他擴展配置

基於 dataid 為 yaml 的文件擴展名配置方式

spring-cloud-starter-alibaba-nacos-config 對於 yaml 格式也是完美支持的。這個時候只需要完成以下兩步:

1、在應用的 bootstrap.properties 配置文件中顯示的聲明 dataid 文件擴展名。如下所示

bootstrap.properties
# Nacos客戶端,默認是properties的文件擴展名,顯示的聲明 dataid 文件擴展名
# 一旦修改成非properties格式,則必須通過file-extension進行設置
spring.cloud.nacos.config.file-extension=yaml

2、在 Nacos 的控制台新增一個dataid為yaml為擴展名的配置,如下所示:

Data ID:        service-nacosconfig.yaml

Group  :        DEFAULT_GROUP

配置格式:        YAML

配置內容:        user.name: service-nacosconfig-yaml
                user.age: 68

這兩步完成后,重啟測試程序,可以看到如下輸出結果:

 支持配置的動態更新

spring-cloud-starter-alibaba-nacos-config 也支持配置的動態更新,啟動 Spring Boot 應用測試的代碼如下:

@SpringBootApplication
@EnableDiscoveryClient//可加可不加,依版本而定,從Spring Cloud Edgware開始,@EnableDiscoveryClient可省略。只需加上相關依賴,並進行相應配置,即可將微服務注冊到服務發現組件上。
public class ServiceNacosconfigApplication {
    public static void main(String[] args) throws InterruptedException {
        //SpringApplication.run(ServiceNacosconfigApplication.class, args);
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceNacosconfigApplication.class, args);
        while(true) {
            //當動態配置刷新時,會更新到 Enviroment中,因此這里每隔一秒中從Enviroment中獲取配置
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

如下所示,當變更user.name和user.age時,應用程序中能夠獲取到最新的值:

提示:你可以通過配置 spring.cloud.nacos.config.refresh.enabled=false 來關閉動態刷新 

支持自定義擴展的 Data Id 配置

 Spring Cloud Alibaba Nacos Config 從 0.2.1 版本后,可支持自定義 Data Id 的配置。關於這部分詳細的設計可參考 這里。 一個完整的配置案例如下所示:

 

# 配置外部配置
# 1、Data Id 在默認的組 DEFAULT_GROUP,不支持配置的動態刷新
spring.cloud.nacos.config.extension-configs[0].data-id=service-config-common01.properties

# 2、Data Id 不在默認的組,不支持動態刷新
spring.cloud.nacos.config.extension-configs[1].data-id=service-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP

# 3、Data Id 既不在默認的組,也支持動態刷新
spring.cloud.nacos.config.extension-configs[2].data-id=service-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
#動態刷新
spring.cloud.nacos.config.extension-configs[2].refresh=true  

可以看到:

  • 通過 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式來支持多個 Data Id 的配置。

  • 通過 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定義 Data Id 所在的組,不明確配置的話,默認是 DEFAULT_GROUP。

  • 通過 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式來控制該 Data Id 在配置變更時,是否支持應用中可動態刷新, 感知到最新的配置值。默認是不支持的。

 提示:

  多個 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 文件擴展名沒有影響。

通過自定義擴展的 Data Id 配置,既可以解決多個應用間配置共享的問題,又可以支持一個應用有多個配置文件。

為了更加清晰的在多個應用間配置共享的 Data Id ,你可以通過以下的方式來配置:

# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
# 配置 Data Id 所在分組,缺省默認 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
# 配置Data Id 在配置變更時,是否動態刷新,缺省默認 false
spring.cloud.nacos.config.shared-configs[0].refresh=true

可以看到:

  • 通過 spring.cloud.nacos.config.shared-configs[n].data-id 來支持多個共享 Data Id 的配置。

  • 通過 spring.cloud.nacos.config.shared-configs[n].group 來配置自定義 Data Id 所在的組,不明確配置的話,默認是 DEFAULT_GROUP。

  • 通過 spring.cloud.nacos.config.shared-configs[n].refresh 來控制該Data Id在配置變更時,是否支持應用中動態刷新,默認false。

配置的優先級

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: 通過內部相關規則(應用名、應用名+ Profile )自動生成相關的 Data Id 配置

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

完全關閉Nacos-config配置

  通過設置 spring.cloud.nacos.config.enabled = false 來完全關閉 Spring Cloud Nacos Config

 5、@RefreshScope注解

  在 Spring Cloud 體系的項目中,配置中心主要用於提供分布式的配置管理,其中有一個重要的注解:@RefreshScope,如果代碼中需要動態刷新配置,在需要的類上加上該注解就行。

/**
 * 訂單服務
 */
@RestController
@RequestMapping("/order")
@RefreshScope //配置此類接口動態刷新
public class OrderController {

    @Resource
    private StockOpenFeignService stockOpenFeignService;

    @Value("${user.name}")
    public String username;

    /**
     * 新增訂單
     * @return
     */
    @RequestMapping("/addOrder")
    public String addOrder(){
        System.out.println("訂單新增成功");
        String id = "123456";
        //調用庫存扣減
        String result = stockOpenFeignService.subStock(id);
        return "訂單服務-訂單新增成功:" + result + " --username:" + username;
    }
}

 訪問地址:http://localhost:8070/order/addOrder

 


免責聲明!

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



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