前面我們學(xué)習(xí)了:
- 使用Nacos實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)
- Springcloud Alibaba入門系列之客戶端調(diào)用方式
- springcloud Alibaba入門系列之springcloud gateway
- springcloud Alibaba入門系列之Nacos作為配置中心
在本篇我們在上節(jié)的基礎(chǔ)上進(jìn)行知識的拓展,來學(xué)習(xí)下Nacos加載配置文件的順序
項目搭建
首先創(chuàng)建一個名為alibaba-nacos-config-load的子模塊,創(chuàng)建過程如前面的項目一樣,接著引入相關(guān)依賴,代碼如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 接著來看配置文件,代碼如下:
server.port=9005
spring.application.name=alibaba-nacos-config-load
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
- 接著來看我們的啟動類代碼:
package com.cacmp.alibaba.nacos.config.load;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaNacosConfigLoadApplication {
public static void main(String[] args) {
SpringApplication.run(AlibabaNacosConfigLoadApplication.class, args);
}
同樣我們將它最為服務(wù)進(jìn)行注冊,最后來看我們的接口:
package com.cacmp.alibaba.nacos.config.load.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 cb
*/
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${config:}")
String str;
@GetMapping("/test")
public String testConfig() {
System.out.println(str);
return str;
}
上面的配置都是最基本的配置,可以說是我們上節(jié)的內(nèi)容,接下來我們來看常見的三種加載順序:
profiles方式
首先在我們的配置中添加配置,代碼如下:
server.port=9005
spring.application.name=alibaba-nacos-config-load
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=dev
接著啟動我們的服務(wù),可以在控制臺上看到如下的加載配置順序:
Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-load-dev.properties'}, NacosPropertySource {name='alibaba-nacos-config-load.properties'}]}
2019-10-28 22:11:24.537 INFO 2080 --- [ main] .n.c.l.AlibabaNacosConfigLoadApplication : The following profiles are active: dev
此時我們會在控制臺上如上圖和代碼中的兩個配置,此時我們還有在nacos管理臺上配置這兩個配置,所以你是在日志中是無法查看相關(guān)的dataId和group信息,所以接下里的事大家應(yīng)該清楚了吧,我們配置這兩個配置信息,如圖:
接著我們訪問http://127.0.0.1:9005/test,會看到如下圖的信息:
會看到這里是加載的dev的配置內(nèi)容,同樣在控制臺的日志信息中我們會看到如下圖的信息:
那么我們是不是可以得出一些結(jié)論,當(dāng)配置文件中配置了spring.profiles.active時,springboot優(yōu)先加載它,會覆蓋前面的配置信息,那么當(dāng)我們把在Nacos配置中心的dev配置信息刪除后會如何了,來看:
此時繼續(xù)訪問上面的地址我們會看到:
會看到加載我們最普通的配置,那么是否又可以得出結(jié)論當(dāng)不存在dev的配置信息時,默認(rèn)會加載spring.application.name的配置,我們接著看另外一種方式:
group 方式
group就是我們要說的第二種方式,我們可能在學(xué)Nacos的作為配置中心時,在管理臺需要配置,其中就有一項就是group,但是我們一般不會動,默認(rèn)為DEFAULT_GROUP,我們可以看如圖:
為什么是它了,看了源碼就知道,代碼如下:
初始的時候,會設(shè)置為默認(rèn)的group,對于group的作用我個人認(rèn)為是nacos對配置信息的一種更深層次的隔離作用,你可以建很多個組,接下來我們來實際操作下,來看我們的配置文件:
server.port=9005
spring.application.name=alibaba-nacos-config-load
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=CONFIG_GROUP
我們可以發(fā)現(xiàn)這里先去掉profiles的配置,我們配置group,直接啟動我們的服務(wù),會在控制臺發(fā)現(xiàn):
這里還是加載alibaba-nacos-config-load.properties的一個屬性配置,但我們這里卻找不到dataId日志的輸出,接著訪問上述的服務(wù)來獲取配置信息,會發(fā)現(xiàn)沒有結(jié)果,具體原因為:
- 當(dāng)我們是通過group時,首先會在配置中心就是group的匹配,接著才是profiles的,因為我們此時沒有在配置中心配置我們的group,也就是CONFIG_GROUP,接著看:
接著我們會在控制臺發(fā)現(xiàn),有我們需要的日志信息了,如圖所示:
分組確實是我們想要的,dataId同時也存在,我們訪問接口來獲取下配置信息,如圖:
從結(jié)果我們可以證實了那句話,當(dāng)有g(shù)roup配置時,首先是通過group進(jìn)行匹配,同時也說明了,不同group之間的dataId可以相同,接著我們添加profiles配置,代碼如下:
server.port=9005
spring.application.name=alibaba-nacos-config-load
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=CONFIG_GROUP
spring.profiles.active=dev
啟動我們的服務(wù),會在控制臺的日志中發(fā)現(xiàn)如下信息:
Loading nacos data, dataId: 'alibaba-nacos-config-load.properties', group: 'CONFIG_GROUP'
Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-load-dev.properties'}, NacosPropertySource {name='alibaba-nacos-config-load.properties'}]}
The following profiles are active: dev
dataId不變,但是這里需要加載alibaba-nacos-config-load-dev.properties和alibaba-nacos-config-load.properties這兩個配置文件,我們通過訪問接口來獲取配置信息,會發(fā)現(xiàn)還是輸出alibaba-nacos-config-load-group.properties配置的信息,這也是符合我們之前說的,當(dāng)有spring.profiles.active配置時,會優(yōu)先加載它,沒有的話會加載spring.application.name的,我們在配置中心添加alibaba-nacos-config-load-dev.properties信息,如圖:
當(dāng)我們發(fā)布時,會發(fā)現(xiàn)控制臺會刷新一下,查看日志信息如下:
Loading nacos data, dataId: 'alibaba-nacos-config-load.properties', group: 'CONFIG_GROUP'
Loading nacos data, dataId: 'alibaba-nacos-config-load-dev.properties', group: 'CONFIG_GROUP'
CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-load-dev.properties'}, NacosPropertySource {name='alibaba-nacos-config-load.properties'}]}
訪問接口,來獲取配置信息,結(jié)果如下圖:
是我們想要的結(jié)果,我們來看最后一種方式
namespace方式
namespace是nacos配置中心的命名空間,對于配置文件的隔離更深,我們來看配置文件:
server.port=9005
spring.application.name=alibaba-nacos-config-load
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
為了演示更直觀,我這里去掉了group和profile的配置,然后啟動服務(wù),會在控制臺的日志輸出中發(fā)現(xiàn):
會發(fā)現(xiàn)它需要去加載alibaba-nacos-config-load.properties的配置信息,同樣也是找不到dataId,我們來配置,如圖顯示創(chuàng)建一個NS的namespace:
接著在該命名空間下創(chuàng)建dataId為alibaba-nacos-config-load.properties的配置信息,如圖:
在來訪問下服務(wù)接口來獲取配置信息,會發(fā)現(xiàn)沒有任何內(nèi)容輸出,原因是我們的bootstrap.properties文件中的namespace配置不能直接寫成NS,應(yīng)該是命名空間ID:
spring.cloud.nacos.config.namespace=26497656-1e2b-42b5-905b-d6d578b28885
重啟我們的服務(wù),訪問接口獲取配置信息,在我們的控制臺會有這樣的日志輸出,代碼如下:
Loading nacos data, dataId: 'alibaba-nacos-config-load.properties', group: 'DEFAULT_GROUP'
Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-load.properties'}]}
來看輸處的配置信息,如圖:
是我們想要的結(jié)果,關(guān)于nacos的配置文件的加載順序和隔離級別就到這了