溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Nacos配置中心實(shí)際操作

發(fā)布時(shí)間:2021-06-26 14:35:06 來源:億速云 閱讀:309 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“Nacos配置中心實(shí)際操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Nacos配置中心實(shí)際操作”吧!

什么是Nacos

一個(gè)更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。

通俗解釋就是:Nacos是一個(gè)注冊中心&配置中心

關(guān)于Nacos注冊中心的功能,在Nacos注冊中心實(shí)戰(zhàn)篇中,阿鑒已經(jīng)給大家詳細(xì)介紹了,今天我們就來看看配置中心如何使用吧~

基本使用

在介紹Nacos注冊中心實(shí)戰(zhàn)時(shí),阿鑒已經(jīng)介紹并搭建好了Nacos集群,這里就直接使用當(dāng)時(shí)的Nacos集群了。

  1. 引入依賴

    my-goods項(xiàng)目引入config依賴

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


  2. 編輯配置

    spring:
    	application:
        name: my-goods
      cloud:
        nacos:
          config:
            server-addr: 192.168.2.11:8850
            username: nacos
            password: nacos


  3. 在nacos新建配置文件并編寫配置

    Nacos配置中心實(shí)際操作

    由于我們的配置中并未指定命名空間,所以默認(rèn)使用public命名空間

    Nacos配置中心實(shí)際操作

    Data ID: 在什么都沒有配置的情況下,Data ID為「服務(wù)名」或者「服務(wù)名.文件擴(kuò)展名」,也就是my-goods或者my-goods.properties(我們也沒有配置文件擴(kuò)展名,默認(rèn)為properties)

    Group: 默認(rèn)為DEFAULT_GROUP

    配置格式:即為文件格式,默認(rèn)為properties

    配置內(nèi)容:文件格式是properties, 配置內(nèi)容即為properties格式寫法

  4. 編寫代碼

    @RestController
    @RequestMapping("/goods")
    public class GoodsController {
    
        @Value("${goods}")
        public String goods;
    
        @GetMapping("/config")
        public String config(){
            return "this goods is " + goods;
        }
    }


  5. 啟動服務(wù)測試

    Nacos配置中心實(shí)際操作

    此時(shí)已經(jīng)讀取到遠(yuǎn)程的配置

動態(tài)配置

Nacos作為配置中心,將配置放在遠(yuǎn)端管理只是基礎(chǔ)能力,更重要的是還提供了方便快捷的動態(tài)刷新配置功能。

  1. 修改代碼

    要想使得配置具有自動刷新的能力,只需要在對應(yīng)的類加上@RefreshScope注解即可

    @RefreshScope
    @RestController
    @RequestMapping("/goods")
    public class GoodsController {
    
        @Value("${goods}")
        public String goods;
    
        @GetMapping("/config")
        public String config(){
            return "this goods is " + goods;
        }
    }


  2. 修改Nacos上的配置

    Nacos配置中心實(shí)際操作

    修改配置:apple -> banana

    Nacos配置中心實(shí)際操作

    發(fā)布完之后可以看到控制臺中出現(xiàn)監(jiān)聽到配置變更的輸出

    2021-05-09 22:45:13.103  INFO 5930 --- [168.1.11_8850] c.a.n.client.config.impl.ClientWorker    : [fixed-114.116.212.76_8850] [polling-resp] config changed. dataId=my-goods, group=DEFAULT_GROUP
    2021-05-09 22:45:13.104  INFO 5930 --- [168.1.11_8850] c.a.n.client.config.impl.ClientWorker    : get changedGroupKeys:[my-goods+DEFAULT_GROUP]


  3. 再次調(diào)用接口

    Nacos配置中心實(shí)際操作

    可以看到配置已經(jīng)發(fā)生了變更

進(jìn)階使用

增加服務(wù)環(huán)境

一般來說,在我們開發(fā)項(xiàng)目時(shí),都會區(qū)分環(huán)境,比如開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境,每個(gè)環(huán)境配置都會有些許不同,比如mysql配置。那我們就會在配置文件中增加以下配置:

spring:
  profiles:
    active: dev

此時(shí)Nacos將增加新的Data ID: 服務(wù)名-環(huán)境名.文件擴(kuò)展名

即為 my-goods-dev.properties

  1. 修改代碼

    @RefreshScope
    @RestController
    @RequestMapping("/goods")
    public class GoodsController {
    
        @Value("${goods}")
        public String goods;
    
        @Value("${price}")
        public String price;
    
        @GetMapping("/config")
        public String config(){
            return "this goods is " + goods + ", and price is " + price;
        }
    }


  2. 新增配置

    Nacos配置中心實(shí)際操作

    增加一個(gè)新的data id 為my-goods-dev.properties配置

    Nacos配置中心實(shí)際操作

  3. 重啟項(xiàng)目測試

    Nacos配置中心實(shí)際操作

優(yōu)先級問題

如果在my-goods-dev.properties配置中增加goods=lemon的配置,那么此時(shí)my-goods的和my-goods-dev.propertiesgoods配置哪個(gè)會生效呢?

  1. my-goods-dev.properties中增加goods=lemon的配置

    Nacos配置中心實(shí)際操作

  2. 直接測試,此時(shí)無須重啟項(xiàng)目

    Nacos配置中心實(shí)際操作

    從測試結(jié)果看出,Nacos的優(yōu)先級和Spring的優(yōu)先級相同,帶環(huán)境名的配置優(yōu)先

共享配置

雖然本篇一直只用my-goods這一個(gè)服務(wù)做案例,但是大家不要忘了,我們這其實(shí)是一個(gè)微服務(wù)系統(tǒng),在一個(gè)微服務(wù)系統(tǒng)里,總有些配置是會被許多服務(wù)共同使用的,比如Redis的配置。

如果每個(gè)服務(wù)都在自己的配置里單獨(dú)維護(hù)同樣的Redis配置,當(dāng)Redis配置發(fā)生變更時(shí),那么每個(gè)服務(wù)都要改一次,想想其實(shí)也是挺惡心的。

為了解決這個(gè)問題,Nacos同樣貼心的給我們提供了另一種配置方式:共享配置

  1. 編輯配置文件

    增加shared-configs,并將data-id設(shè)置為redis.yaml(可定義, 但必須要有文件擴(kuò)展名)

    spring:
      application:
        name: my-goods
      profiles:
        active: dev
      cloud:
        nacos:
          config:
            server-addr: 114.116.212.76:8850
            username: nacos
            password: nacos
            shared-configs:
              - data-id: redis.yaml
                refresh: true

     

    refresh: true表示動態(tài)刷新配置

    此時(shí)文件擴(kuò)展名即為data-id的后綴名

  2. 在nacos中增加配置

    Nacos配置中心實(shí)際操作

    調(diào)皮的小伙伴可以試試這里「配置格式」配成Properties會發(fā)生什么

  3. 編寫代碼

    @RefreshScope
    @RestController
    @RequestMapping("/goods")
    @RequiredArgsConstructor
    public class GoodsController {
    
        @Value("${redis}")
        public String redis;
    
        @GetMapping("/redis")
        public String redis(){
            return "redis url is " + redis;
        }
    }

     

    細(xì)心的小伙伴可能會說:哎呀呀,你這啥redis配置呀,假的吧!對,大家就假裝認(rèn)為我寫了個(gè)redis配置就好啦~

  4. 重啟項(xiàng)目測試

    Nacos配置中心實(shí)際操作

擴(kuò)展配置

擴(kuò)展配置和共享配置的使用方式相同,增加extension-configs即可

spring:
	cloud:
    nacos:
      config:
        server-addr: 114.116.212.76:8850
        username: nacos
        password: nacos
        shared-configs:
          - data-id: redis.yaml
            refresh: true    
        extension-configs:
          - data-id: extension.yaml
            refresh: true

擴(kuò)展配置的優(yōu)先級比共享配置優(yōu)先級高一些

命名空間

Nacos中還有一個(gè)命名空間的概念,不同命名空間的配置相互隔離,相信大家也發(fā)現(xiàn)了,在測試案例中,我們一直使用的是一個(gè)public的命名空間,這是Nacos的默認(rèn)命名空間。

通常我們會以項(xiàng)目名做命名空間進(jìn)行區(qū)分,來試試吧~

  1. 假設(shè)我們現(xiàn)在做一個(gè)商城項(xiàng)目,新建命名空間mall

    Nacos配置中心實(shí)際操作

  2. public命名空間的配置克隆到mall

    Nacos配置中心實(shí)際操作

    Nacos配置中心實(shí)際操作

  3. 修改配置

    spring:
      application:
        name: my-goods
      profiles:
        active: dev
      cloud:
        nacos:
          config:
            server-addr: 114.116.212.76:8850
            username: nacos
            password: nacos
            namespace: mall
            shared-configs:
              - data-id: redis.yaml
                refresh: true
            extension-configs:
              - data-id: extension.yaml
                refresh: true

     

    此時(shí)就只會讀取mall命名空間下的配置啦

文件擴(kuò)展名與配置文件名

講到現(xiàn)在,我們用的文件擴(kuò)展名和配置文件名(data id)依舊是默認(rèn)的properties服務(wù)名,如果小伙伴想要修改的話可以修改file-extensionprefix

file-extension: 文件擴(kuò)展名

prefix: data-id的前綴,默認(rèn)為服務(wù)名

優(yōu)雅使用

我們現(xiàn)在已經(jīng)學(xué)會了如何使用@Value加@RefreshScope實(shí)現(xiàn)動態(tài)刷新配置,但是不得不說這種方式并不優(yōu)雅。

可以設(shè)想一下,凡是在@Value的地方都要加一個(gè)@RefreshScope注解,而且平常一個(gè)配置可能在多個(gè)地方使用,最后就會變成到處都是@RefreshScope, 要多難看就難看。

當(dāng)然,Nacos也提供了一個(gè)@NacosValue加@NacosConfigurationProperties方式讓我們可以不需要再使用@RefreshScope注解,但阿鑒覺得這種方式對系統(tǒng)侵入性太強(qiáng)了。

所以,阿鑒推薦使用@ConfigurationProperties方式管理配置進(jìn)行使用。

  1. 新建配置類, 在配置類上加上@RefreshScope注解

    @Data
    @RefreshScope
    @ConfigurationProperties(prefix = "fruit")
    public class GoodsProperties {
    
        private String name;
        private double price;
        private int number;
    
    }


  2. 使用

    @RestController
    @RequestMapping("/goods")
    public class GoodsController {
    
        @Autowired
        private GoodsProperties goodsProperties;
    
        @GetMapping("/all")
        public String all(){
            String result = "name: %s, price: %s, number: %s";
            return String.format(result, goodsProperties.getName(),
                    goodsProperties.getPrice(), goodsProperties.getNumber());
        }
    }

     

    此時(shí)GoodsController可以不再加@RefreshScope注解了

優(yōu)先級全測試

到現(xiàn)在,我們已經(jīng)認(rèn)識了許多的配置格式了,先來總結(jié)一下有哪些吧

  • 服務(wù)名

  • 服務(wù)名.文件擴(kuò)展名

  • 服務(wù)名-環(huán)境.文件擴(kuò)展名

  • 擴(kuò)展配置

  • 共享配置

那么,它們的優(yōu)先級是如何的呢?

這里,為了方便展示效果,阿鑒先告訴大家優(yōu)先級是怎樣的:

共享配置 < 擴(kuò)展配置 < 服務(wù)名 < 服務(wù)名.文件擴(kuò)展名 < 服務(wù)名-環(huán)境.文件擴(kuò)展名

  1. 修改配置

    spring:
      application:
        name: my-goods
      profiles:
        active: dev
      cloud:
          config:
            server-addr: 114.116.212.76:8850
            username: nacos
            password: nacos
            namespace: mall
            shared-configs:
              - data-id: redis.yaml
                refresh: true
              - data-id: share.properties
                refresh: true
            extension-configs:
              - data-id: extension.properties
                refresh: true


  2. 編寫代碼

    @RefreshScope
    @RestController
    @RequestMapping("/goods")
    @RequiredArgsConstructor
    public class GoodsController {
        /**
         * 測試配置優(yōu)先級
         */
        @Value("${filename}")
        public String filename;
    
        @GetMapping("/filename")
        public String filename(){
            return "now filename is " + filename;
        }
    }


  3. 在Nacos中建出以下配置文件

    Nacos配置中心實(shí)際操作

    nacos中不允許文件為空,所以隨便在里面寫點(diǎn)什么就行

  4. 先在共享配置share.properties文件中增加配置filename=share.properties

  5. 開始測試

    Nacos配置中心實(shí)際操作

    緊接在,分別依次在

    extension.properties文件中增加filename=extension.properties配置,

    my-goods文件中增加filename=my-goods配置,

    my-goods.properties文件中增加filename=my-goods.properties配置,

    my-goods-dev.properties文件中增加filename=my-goods-dev配置

    效果圖如下:

    Nacos配置中心實(shí)際操作

    Nacos配置中心實(shí)際操作

    Nacos配置中心實(shí)際操作

    Nacos配置中心實(shí)際操作

小結(jié)

今天阿鑒給大家介紹了Nacos配置中心的功能,關(guān)于Nacos的動態(tài)配置刷新,多種配置方式,以及如何優(yōu)雅的使用它,最后還給大家測試了所有配置的優(yōu)先級:共享配置 < 擴(kuò)展配置 < 服務(wù)名 < 服務(wù)名.文件擴(kuò)展名 < 服務(wù)名-環(huán)境.文件擴(kuò)展名。希望小伙伴們有所收獲。

到此,相信大家對“Nacos配置中心實(shí)際操作”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI