前面咱們學習瞭如何在Spring Boot中使用Nacos來管理配置,總體來講仍是比較簡單。web
爲了可以在Spring Cloud中更加方便的使用Nacos,今天介紹下在Spring Cloud中如何簡單,快速,方便的使用Nacos。spring
須要在項目中加入spring-cloud-starter-alibaba-nacos-config的Maven依賴。bootstrap
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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>
<version>0.9.0.RELEASE</version>
</dependency>
</dependencies>
複製代碼
版本選擇請參考下面的規範:緩存
因爲 Spring Boot 1 和 Spring Boot 2 在 Actuator 模塊的接口和註解有很大的變動,且 spring-cloud-commons 從 1.x.x 版本升級到 2.0.0 版本也有較大的變動,所以咱們採起跟 SpringBoot 版本號一致的版本:bash
1.5.x 版本適用於 Spring Boot 1.5.x 2.0.x 版本適用於 Spring Boot 2.0.x 2.1.x 版本適用於 Spring Boot 2.1.xapp
在bootstrap.properties中配置Nacos的信息,切記是bootstrap.properties不是application.properties,緣由你能夠本身體驗下。ide
# 應用名稱,用於配置文件命名
spring.application.name=example
# Nacos server 的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置內容的數據格式
spring.cloud.nacos.config.file-extension=properties
# 指定對應的環境
spring.profiles.active=test
複製代碼
在 Nacos Spring Cloud 中,dataId 的完整格式以下:spring-boot
${prefix}-${spring.profile.active}.${file-extension}
複製代碼
prefix 默認爲 spring.application.name 的值,也能夠經過配置項 spring.cloud.nacos.config.prefix來配置。學習
而後咱們在Nacos的後臺建立一個配置,dataId爲example-test.properties測試
useLocalCache=false
複製代碼
再建立一個example-dev.properties
useLocalCache=true
複製代碼
測試代碼:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
複製代碼
配置變動須要刷新的話記得加上@RefreshScope註解。加載對應環境的配置是根據spring.profiles.active=test的值進行加載,當咱們指定test後,useLocalCache的值爲false, 當spring.profiles.active=dev時,useLocalCache的值爲true
方便的點在於不用啓動時指定namespace來區分環境,而是跟Spring Boot中的spring.profiles.active進行了整合。
若是咱們須要加載多個配置文件,能夠用ext-config來配置
spring.cloud.nacos.config.ext-config[0].data-id=app.properties
spring.cloud.nacos.config.ext-config[0].group=multi-data-ids
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=user.properties
spring.cloud.nacos.config.ext-config[1].group=multi-data-ids
spring.cloud.nacos.config.ext-config[1].refresh=true
複製代碼
spring-cloud-starter-alibaba-nacos-config內置了nacos-config端點,能夠經過nacos-config端點查看配置相關信息,源碼在org.springframework.cloud.alibaba.nacos.endpoint.NacosConfigEndpoint
{
"NacosConfigProperties": {
"serverAddr": "127.0.0.1:8848",
"encode": null,
"group": "DEFAULT_GROUP",
"prefix": null,
"fileExtension": "properties",
"timeout": 3000,
"endpoint": null,
"namespace": null,
"accessKey": null,
"secretKey": null,
"contextPath": null,
"clusterName": null,
"name": null,
"sharedDataids": null,
"refreshableDataids": null,
"extConfig": [
{
"dataId": "example.properties",
"group": "DEFAULT_GROUP",
"refresh": true
},
{
"dataId": "student.properties",
"group": "DEFAULT_GROUP",
"refresh": true
}
]
},
"RefreshHistory": [],
"Sources": [
{
"lastSynced": "2019-08-18 13:07:42",
"dataId": "student.properties"
},
{
"lastSynced": "2019-08-18 13:07:42",
"dataId": "null-test.properties"
},
{
"lastSynced": "2019-08-18 13:07:42",
"dataId": "null.properties"
},
{
"lastSynced": "2019-08-18 13:07:42",
"dataId": "example.properties"
}
]
}
複製代碼
spring-cloud-starter-alibaba-nacos-config內置了Nacos健康狀態檢查的實現,當Nacos出現故障時,可以及時經過actuator/health進行反饋,源碼在org.springframework.cloud.alibaba.nacos.endpoint.NacosConfigHealthIndicator
"status": "UP",
"details": {
"diskSpace": {
"status": "UP",
"details": {
"total": 249795969024,
"free": 12436131840,
"threshold": 10485760
}
},
"nacosConfig": {
"status": "UP",
"details": {
"dataId: 'student.properties', group: 'DEFAULT_GROUP'": "config is empty",
"dataId: 'null-test.properties', group: 'DEFAULT_GROUP'": "config is empty",
"dataId: 'null.properties', group: 'DEFAULT_GROUP'": "config is empty",
"dataId: 'example.properties', group: 'DEFAULT_GROUP'": "config is empty",
"dataIds": [
"student.properties",
"null-test.properties",
"null.properties",
"example.properties"
]
}
},
"refreshScope": {
"status": "UP"
}
}
}
複製代碼
目前我本身看下來,感受這塊有那麼一點點問題,現象是Nacos服務所有停掉以後,Nacos的health狀態仍是UP, 並非咱們指望的DOWN。
看了下源碼,發現了緣由,在最後一行設置了UP信息,就算前面設置了DOWN,最後都會變成UP, 不知道這是否是BUG, 哈哈。。。
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
for (String dataId : dataIds) {
try {
String config = configService.getConfig(dataId,
nacosConfigProperties.getGroup(),
nacosConfigProperties.getTimeout());
if (StringUtils.isEmpty(config)) {
builder.down().withDetail(String.format("dataId: '%s', group: '%s'",
dataId, nacosConfigProperties.getGroup()), "config is empty");
}
}
catch (Exception e) {
builder.down().withDetail(String.format("dataId: '%s', group: '%s'",
dataId, nacosConfigProperties.getGroup()), e.getMessage());
}
}
// 問題出在這邊
builder.up().withDetail("dataIds", dataIds);
}
複製代碼
我以爲最後一行應該加一個判斷,當前面已經設置DOWN的時候,這邊就不要再設置成UP了
if( builder.build().getStatus() != Status.DOWN ) {
builder.up().withDetail("dataIds", dataIds);
}
複製代碼
這邊改完以後,仍是有個問題,就是Nacos其實在本地也有緩存配置信息,固然這個失效時間我沒去看代碼,還不知道多久失效。也就是說當Nacos全部的服務都掛掉後,這邊也不能及時將健康狀態設置成DOWN, 由於configService.getConfig的時候,內部會優先從本地緩存中獲取配置,因此配置是能夠獲取到的,也就是健康檢查在這種狀況下是無效的。
我我的感受健康檢查既然要作的話,那麼就不要走這個邏輯,最簡單的方式每次直接從Nacos服務讀取,讀取異常這個時候就能夠設置成DOWN,就是這麼簡單。
不說了,去Github提個issues問問大佬們....