SpringCloud alibaba使用Nacos配置中心解讀
依賴管理
Spring Cloud Alibaba BOM 包含了它所使用的所有依賴的版本
請將下面的 BOM 添加到 pom.xml 中的 部分。 這將允許我們省略任何Maven依賴項(xiàng)的版本,而是將版本控制委派給BOM。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引用時(shí),請注意版本對應(yīng)關(guān)系。比如我們的示例版本為:2021.0.4.0。其與Spring Boot以及Spring Cloud的版本對應(yīng)關(guān)系如下(為避免不必要的依賴沖突,請按照如下版本對應(yīng)關(guān)系驗(yàn)證本文示例)
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
|---|---|---|
| 2021.0.4.0* | Spring Cloud 2021.0.4 | 2.6.11 |
目前最新版本是2022.x,支持Spring Boot 3.0,我們知道Spring Boot 3.0.x需要使用java 17,針對國內(nèi)大多數(shù)應(yīng)用來說,目前還是java8,所以本文還是選用java8支持的版本。
更多的版本對應(yīng)關(guān)系請參考官網(wǎng):Spring Cloud Alibaba maven依賴版本對應(yīng)關(guān)系
完整pom依賴配置
一個(gè)完整的Spring Cloud Alibaba的pom.xml依賴如下
dependencies標(biāo)簽中的依賴根據(jù)自己實(shí)際情況引入即可。此處只是Nacos的使用示例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>CloudDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<build.name>CloudDemo</build.name>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring.cloud.version>2021.0.4</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 使用Nacos服務(wù)注冊與發(fā)現(xiàn) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 使用Nacos配置管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 支持讀取bootstrap配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 添加web依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
添加bootstrap.properties配置
# 引用pom文件中配置的profile(注意名稱的對應(yīng)) spring.profiles.active=@profileActive@ # 應(yīng)用名稱 spring.application.name=myCloud # Nacos配置 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # 配置的group(默認(rèn)DEFAULT_GROUP) spring.cloud.nacos.config.group=DEFAULT_GROUP # 配置后綴默認(rèn)是properties(只支持properties和ymal) spring.cloud.nacos.config.file-extension=properties # 是否開啟自動刷新配置(默認(rèn)true) spring.cloud.nacos.config.refresh-enabled=true
注意當(dāng)你使用域名的方式來訪問 Nacos 時(shí),spring.cloud.nacos.config.server-addr 配置的方式為 域名:port。
例如 Nacos 的域名為abc.com.nacos,監(jiān)聽的端口為 80,則 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。
在 Nacos Spring Cloud 中,dataId 的完整格式如${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默認(rèn)為 spring.application.name 的值,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置。
- spring.profiles.active 即為當(dāng)前環(huán)境對應(yīng)的 profile,詳情可以參考 Spring Boot文檔。 注意:當(dāng) spring.profiles.active 為空時(shí),對應(yīng)的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
- file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。
注:Nacos Config相關(guān)的配置必須放在 bootstrap.properties 配置文件中,放在application.properties中自動刷新配置不會生效。
一般情況下,我們的應(yīng)用,應(yīng)該需要配置profile,而且要應(yīng)用Spring Boot和Maven的profile組合配置。所以,我們的pom文件豐富一下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>CloudDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<build.name>CloudDemo</build.name>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring.cloud.version>2021.0.4</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 使用Nacos服務(wù)注冊與發(fā)現(xiàn) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 使用Nacos配置管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 支持讀取bootstrap配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 添加web依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>pre</id>
<properties>
<profileActive>pre</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>${build.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>mapper/**/*.xml</include>
<include>application.properties</include>
<include>application-${profileActive}.properties</include>
<include>bootstrap.properties</include>
<include>logback-spring.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
application.properties配置
# 當(dāng)前應(yīng)用的訪問端口 server.port=8701 # 當(dāng)前應(yīng)用的訪問上下文 server.servlet.context-path=/myCloud
編寫啟動類
package com.yyoo.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.yyoo"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
本示例的啟動類和普通的Spring Boot項(xiàng)目啟動類沒什么兩樣.
編寫測試Controller
package com.yyoo.cloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("conf")
@RefreshScope
public class TestConfController {
@Value("${name:默認(rèn)值}")
private String name;
@RequestMapping("getName")
public String getName(){
System.out.println(this.name);
return this.name;
}
}
@RefreshScope是Spring Cloud 的原生注解,用于實(shí)現(xiàn)配置自動更新。
在Nacos界面上添加對應(yīng)的配置

啟動應(yīng)用并訪問
啟動后訪問 http://localhost:8701/myCloud/conf/getName
界面顯示結(jié)果:沒事兒寫兩篇
在界面修改配置 name=沒事兒寫兩篇2 ,再次訪問鏈接
界面顯示結(jié)果:沒事兒寫兩篇2
自定義擴(kuò)展的 Data Id 配置
我們上面的示例,配置的dataId是通過特定的規(guī)則來自動匹配的,這樣很方便,但是也限制的很死。我們的同樣的應(yīng)用部署在不同的服務(wù)器,可能只是些許配置不一樣,怎樣能共用一樣的配置呢?上面的方式顯然是不行的。
Spring Cloud Alibaba Nacos Config 從 0.2.1 版本后,可支持自定義 Data Id 的配置。
使用spring.cloud.nacos.config.extension-configs配置
# 自定義擴(kuò)展dataId ,extension-configs是個(gè)列表,意味著可以配置多個(gè) # 必須帶文件擴(kuò)展名,文件擴(kuò)展名既可支持 properties,又可以支持 yaml/yml。 # 此時(shí) spring.cloud.nacos.config.file-extension 的配置對自定義擴(kuò)展配置的 Data Id 文件擴(kuò)展名沒有影響。 spring.cloud.nacos.config.extension-configs[0].data-id=myCloud-common1.yml # 配置的group,默認(rèn)DEFAULT_GROUP spring.cloud.nacos.config.extension-configs[0].group=COMMON_GROUP # 是否自動刷新(注意:這里默認(rèn)是false,如果需要自動刷新,必須配置為true) spring.cloud.nacos.config.extension-configs[0].refresh=true
注意以上配置也是在bootstrap.properties中配置
在Nacos中新增配置

使用ConfigurationProperties來接收
package com.yyoo.cloud.conf;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties("my.mycloud")
public class CommonConf {
private String name;
private int age;
private String desc;
}
我們這里沒有添加@RefreshScope注解,因?yàn)槲覀兪褂胹pring.cloud.nacos.config.extension-configs[0].refresh=true配置了,所以配置是會自動刷新的。
TestController讀取配置
@Resource
private CommonConf conf;
@RequestMapping("getCommonConf")
public String getCommonConf() throws JsonProcessingException {
System.out.println(conf);
return this.conf.toString();
}
訪問鏈接后輸出結(jié)果:CommonConf(name=沒事兒寫兩篇, age=12, desc=Spring Cloud 學(xué)習(xí))
注意:TestController中的CommonConf 是被代理之后的對象,包含很多內(nèi)容,建議不要用json進(jìn)行轉(zhuǎn)換打印。
spring.cloud.nacos.config.shared-configs配置
spring.cloud.nacos.config.shared-configs[0].data-id=myCloud-common1.yml spring.cloud.nacos.config.shared-configs[0].group=COMMON_GROUP spring.cloud.nacos.config.shared-configs[0].refresh=true
其用法和extension-configs一樣。其主要作用是為了更加清晰的在多個(gè)應(yīng)用間配置共享的 Data Id。
各種配置方式的優(yōu)先級
- A: 通過 spring.cloud.nacos.config.shared-configs[n].data-id 支持多個(gè)共享 Data Id 的配置
- B: 通過 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多個(gè)擴(kuò)展 Data Id 的配置
- C: 通過內(nèi)部相關(guān)規(guī)則(應(yīng)用名、應(yīng)用名+ Profile )自動生成相關(guān)的 Data Id 配置
當(dāng)三種方式共同使用時(shí),他們的一個(gè)優(yōu)先級關(guān)系是:A < B < C
總結(jié)
我們實(shí)際項(xiàng)目當(dāng)中可能涉及到要在Nacos中添加很多配置,這些配置如何區(qū)分,如何定位?
Nacos的概念中,dataId、group、namespace是主要的區(qū)分和定位作用。本文示例中沒有使用namespace,其實(shí)如果我們命名規(guī)則定義的好,只通過dataId和group也能精準(zhǔn)定位。根據(jù)自身的需要制定合理的規(guī)則即可。
spring.cloud.nacos.config.namespace用于指定namespace,在沒有明確指定 ${spring.cloud.nacos.config.namespace} 配置的情況下, 默認(rèn)使用的是 Nacos 上 Public 這個(gè)namespace
通過設(shè)置 spring.cloud.nacos.config.enabled = false 可以完全關(guān)閉 Spring Cloud Nacos Config
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringCloudAlibaba分布式配置中心Nacos持久化方式
- springcloud alibaba nacos config無法加載配置文件的解決方案
- Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案
- SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過登錄頁面問題
- SpringCloud?Alibaba環(huán)境集成之nacos詳解
- SpringCloud Alibaba Nacos 整合SpringBoot Admin實(shí)戰(zhàn)
- SpringCloud Alibaba項(xiàng)目實(shí)戰(zhàn)之nacos-server服務(wù)搭建過程
相關(guān)文章
springboot實(shí)現(xiàn)發(fā)送郵件(QQ郵箱為例)
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)發(fā)送郵件,qq郵箱代碼實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
Windows10系統(tǒng)下JDK1.8的下載安裝及環(huán)境變量配置的教程
這篇文章主要介紹了Windows10系統(tǒng)下JDK1.8的下載安裝及環(huán)境變量配置的教程,本文圖文并茂給大家介紹的非常詳細(xì),對大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
IDEA新建Springboot項(xiàng)目(圖文教程)
下面小編就為大家?guī)硪黄狪DEA新建Springboot項(xiàng)目(圖文教程)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
Java注解詳解及實(shí)現(xiàn)自定義注解的方法
這篇文章主要介紹了Java注解詳解及實(shí)現(xiàn)自定義注解的方法,本文給大家介紹了jdk中預(yù)定義的一些注解及自定義注解的相關(guān)知識,需要的朋友可以參考下2022-06-06

