SpringCloud Alibaba —— Nacos 配置中心

前文

SpringCloud 簡介
html

SpringCloud 版本選型
java

SpringCloud 工程構建
git

SpringCloud —— Eureka 註冊中心
web

SpringCloud —— Eureka 集羣
算法

SpringCloud —— 服務註冊進 Eureka 集羣
spring

SpringCloud —— Eureka 自我保護
bootstrap

SpringCloud —— SpringCloud Consul 實現服務註冊中心
app

SpringCloud —— 三個註冊中心的異同點
負載均衡

SpringCloud —— Ribbon
分佈式

SpringCloud —— Ribbon 負載均衡算法

SpringCloud —— OpenFeign

SpringCloud —— Hystrix 簡介

SpringCloud —— Hystrix 斷路器

SpringCloud —— HystrixDashboard 服務監控

SpringCloud —— Gateway 網關

SpringCloud —— Config 配置中心

SpringCloud —— Sleuth 分佈式請求鏈路跟蹤

SpringCloud Alibaba —— Nacos 服務註冊


    前面使用 SpringCloud Config 實現配置中心 的時候是比較麻煩的,各類配置和依賴很複雜的

    SpringCloud Alibaba 退出的 Nacos 除了能夠實現註冊中心之外,還能夠實現配置中心,並且實現很是簡單,下面就用 Nacos 實現配置中心

基礎配置

新建一個模塊

目錄結構以下:
在這裏插入圖片描述

POM

老規矩,不需添加的依賴能夠不加

<dependencies>

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

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web組件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--平常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

YML

這裏須要配置兩個 yml 文件,爲何須要配置兩個 yml 文件呢?

Nacos 與 SpringCloud-Config 同樣,在項目初始化時,要保證先從配置中心進行配置權限,拉取配置以後,才能保證項目的正常啓動

SpringBoot 中配置文件的加載是存在優先級順序的,bootstrap 優先級高於 application

bootstrap.yml

# Nacos 配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos 服務註冊中心地址
      config:
        server-addr: localhost:8848 # Nacos 做爲配置中心地址
        file-extension: yaml        # 指定 yaml 格式的配置(相似去 Github 讀取文件)

# ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

application.yml

spring:
  profiles:
    active: dev # 表示開發環境

主啓動類

package com.java.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/** * @author Woo_home * @create 2020/5/20 16:27 */

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
    public static void main(String[] args){
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }
}

業務類

package com.java.springcloud.alibaba.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;

/** * @author Woo_home * @create 2020/5/20 16:27 */

@RestController
@RefreshScope   // 支持 Nacos 的動態刷新功能
public class ConfigController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

在 Nacos 中添加配置信息

Nacos 中的匹配規則

理論:

Nacos 中的 Data Id 的組成格式及與 SpringBoot 配置文件中的匹配規則

在這裏插入圖片描述
看下 Nacos 是怎麼介紹的,官網地址 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
在這裏插入圖片描述

  • prefix 默認爲 spring.application.name 的值,也能夠經過配置項 spring.cloud.nacos.config.prefix來配置。
  • spring.profile.active 即爲當前環境對應的 profile,詳情能夠參考 Spring Boot文檔。 注意:當 spring.profile.active 爲空時,對應的鏈接符 - 也將不存在,dataId 的拼接格式變成 p r e f i x . {prefix}. {file-extension}
  • file-exetension 爲配置內容的數據格式,能夠經過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型

公式:

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

公式圖解:
在這裏插入圖片描述


實操:

Nacos 的該界面 點擊加號,添加配置
在這裏插入圖片描述
按照官網的說明配置一下
在這裏插入圖片描述
配置完後點擊發布按鈕
在這裏插入圖片描述
在這裏插入圖片描述
此時回到主頁面,已經將剛纔的配置添加進來了
在這裏插入圖片描述
點擊詳情選項發現內容和剛剛配置的是一致的
在這裏插入圖片描述
點擊編輯選項還能夠對剛剛的配置內容進行修改
在這裏插入圖片描述

測試

  • 啓動前須要在 Nacos 客戶端 - 配置管理 - 配置管理欄目下有對應的 yaml 配置文件
  • 運行 cloud-config-nacos-client3377 的主啓動類
  • 調用接口查看配置信息 http://localhost:3377/config/info

啓動主啓動類的時候報錯了,說沒法解析這個 config.info
在這裏插入圖片描述

緣由是由於這個文件名不是 yaml 後綴,這裏有點小 bug(可是有些人的是沒問題的,多是 Nacos 及時修復了,聽說 1.2.0 之後已經解決了這個問題,我這裏使用的是 1.1.4 版本的
在這裏插入圖片描述
刪除該配置文件從新新建一個配置文件,以下:

在這裏插入圖片描述
修改以後再次啓動主啓動類,能夠發現,控制檯打印了 dataid 的信息
在這裏插入圖片描述

而後咱們訪問 http://localhost:3377/config/info ,能夠發現,咱們在 Nacos 配置中心的內容已經拿過來了
在這裏插入圖片描述

自帶刷新功能

OK ,如今已經能夠從 Nacos 配置中心將內容拿過來了,那麼想修改一下配置的內容怎麼辦呢?很是簡單,點擊編輯該配置文件修改配置內容就能夠了
在這裏插入圖片描述
這裏講 version = 1 改成 version = 1.0,而後保存發佈一下
在這裏插入圖片描述
再次刷新該頁面 http://localhost:3377/config/info
在這裏插入圖片描述
這樣就實現了一個動態刷新的功能


完整代碼已上傳至碼雲 完整代碼地址,感興趣的朋友能夠下載運行下