
隨著Nacos2.0成熟穩(wěn)定,Nacos-spring-boot發(fā)布0.1.10、0.2.10兩個核心版本,全面支持了Nacos2.0,同時支持自動識別配置類型注入能力,修復(fù)了高并發(fā)場景下數(shù)據(jù)一致性問題。
Nacos-spring-boot老用戶,將相關(guān)maven依賴進行如下替換,即可快速升級。<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.10</version>
</dependency>
本文將系統(tǒng)介紹新版本增強能力,并且以一次生產(chǎn)環(huán)境的配置管理項目構(gòu)建過程為例,詳細(xì)描述新版本Nacos Spring Boot0.2.10版本的部署,幫助Spring Boot老用戶快速上岸Nacos2.0,感受長連接帶來的10倍性能提升。新發(fā)布的 0.1.10 版本和 0.2.10 版本主要 feature 增強包括以下幾個部分:
Nacos1 體系中,配置中心的訂閱、實時推送功能主要通過長輪訓(xùn)進行。盡管長輪訓(xùn)是 HTTP 短連接體系中被采用較多的動態(tài)刷新解決方案,但也不可避免地存在時延過高等缺陷;在生產(chǎn)實踐中暴露了一定問題,如下面這兩個鏈接所示:https://github.com/alibaba/nacos/issues/6345https://github.com/alibaba/nacos/issues/2674Nacos2 體系將整個配置中心的訂閱、推送功能重構(gòu)成為了基于 gRPC 的長連接方案,保證了配置刷新實時推送;迄今為止,已經(jīng)歷了大量的生產(chǎn)環(huán)境考驗。在使用 Nacos-spring-boot 新版本之后,即使用戶對配置類型未設(shè)置的情況下,nacos-spring-boot 也會自動識別該配置的文件類型(json/yaml/properties)并給定默認(rèn)值。該機制極大降低了因為文件類型不匹配,業(yè)務(wù)側(cè)出現(xiàn)配置處理錯誤的風(fēng)險。下圖為新版本 Nacos-spring-boot 項目在一次配置文件刷新過程中的工作機制。@NacosValue 注解全面支持 Spel 表達式
Spel 表達式全稱為“Spring Expression Language”,是 Spring 自帶的一種動態(tài)字符串構(gòu)建方式表達式)。用戶可以方便地使用 Spel 表達式來定義 NacosValue,與 Spring 功能完美整合,減少 SpringBoot 用戶們的工作量。
阿里云內(nèi)部同學(xué)在使用 Nacos-spring-boot 項目進行大規(guī)模壓測的過程中,出現(xiàn)了一些配置讀取錯誤:在大流量頻繁修改某些 dataId 的配置的過程中,客戶端可能會拉取到舊版本的配置數(shù)據(jù),導(dǎo)致客戶端配置數(shù)據(jù)反復(fù)。Nacos-spring-boot 新版本通過增加智能鎖、升級 Nacos-spring 依賴等方式,對于潛在的線程安全風(fēng)險進行了修復(fù)。
在 Nacos 服務(wù)端,為了方便 Nacos 部署升級和盡可能保證配置信息的信息安全,我們是從阿里云微服務(wù)引擎MSE中購買的一個 2 核 CPU+4G 內(nèi)存的三節(jié)點 Nacos 集群。

在Nacos客戶端,在Springboot老用戶可以通過下面方式升級到Nacos-spring-boot新版本。在 Maven 項目的 pom.xml 文件中增加/升級以下依賴來獲取 Starter
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.10</version>
</dependency>
注: 使用時請根據(jù)自定義構(gòu)建的Spring Boot版本選擇相應(yīng)的nacos-config-spring-boot-starter版本:nacos-config-spring-boot-starter 版本 0.2.10 對應(yīng) Spring Boot 2.x 版本,版本 0.1.10 對應(yīng) Spring Boot 1.x 版本。
在 application.properties 文件中配置連接信息nacos.config.server-addr=${nacos_server_address}:8848
注:${nacos_server_address}為占位符,表示Nacos server的地址,后文將給出如何獲取其詳細(xì)地址信息的方案。使用 @NacosPropertySource 加載 dataId 為 example 的配置源,并開啟自動更新@SpringBootApplication
@NacosPropertySource(dataId = "com.alibaba.nacos.example.properties", autoRefreshed = true)
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
使用 @NacosValue 注解設(shè)置屬性值@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${connectTimeoutInMills:5000}", autoRefreshed = true)
private int connectTimeoutInMills;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public int get() {
return connectTimeoutInMills;
}
}
在本地啟動客戶端項目,并運行以下命令:
curl localhost:8080/config/get
在 MSE 控制臺將示例配置 com.alibaba.nacos.example.properties 更改為以下內(nèi)容并發(fā)布。connectTimeoutInMills=6000
若 Console 打印出更新的配置內(nèi)容 ,則說明 SDK 的配置自動更新功能正常;工程正式跨入高性能配置中心時代。- END -
「技術(shù)分享」某種程度上,是讓作者和讀者,不那么孤獨的東西。歡迎關(guān)注我的微信公眾號:「Kirito的技術(shù)分享」