前言
傳統的配置方式弊端
1、維護性:一旦有服務配置發生變化,所有的服務配置都得改變,例如 mysql、redis、mq 等。
2、實效性:修改完服務後還得重啟,頻繁的修改意味著頻繁的重啟,重啟完成之後配置修改才會生效。
3、安全性:配置的一些遠端 IP 地址,使用者名稱和密碼等敏感資訊都會暴露。
Nacos提供用於儲存配置和其他後設資料的 key/value 儲存,為分散式系統中的外部化配置提供伺服器端和客戶端支援。使用 Spring Cloud Alibaba Nacos Config,可以在 Nacos Server 集中管理 Spring Cloud應用的外部屬性配置。
springcloud config 對比
三大優勢
- springcloud config 大部分場景結合git使用,動態變更還需要依賴 Spring Cloud Bus 訊息匯流排來透過所有的客戶端變化.
- springcloud config 不提供視覺化介面
- nacos config 使用長輪詢更新配置,一旦配置有變動後,通知 Provider 的過程非常的迅速,從速度上秒殺 springcloud 原來的 config 幾條街
對比專案/配置中心 | springcloud config | apollo | nacos |
---|---|---|---|
開源時間 | 2014.9 | 2016.5 | 2018.6 |
配置實時推送 | 支援(Spring Cloud Bus) | 支援(Http 長輪詢 1s 內) | 支援(Http 長輪詢 1s 內) |
版本管理 | 支援(Git) | 自動管理 | 自動管理 |
配置回滾 | 支援(Git) | 支援 | 支援 |
灰度釋出 | 支援 | 支援 | 支援 |
許可權管理 | 支援 | 支援 | 支援 |
多叢集多環境 | 支援 | 支援 | 支援 |
監聽查詢 | 支援 | 支援 | 支援 |
多語言 | 只支援 Java | Go,C++,Python,java,.NET,OpenApi | Python,Java,Nodejs,OpenApi |
分散式高可用最小叢集數量 | Conifig-Server2+Git+MQ | Config2+Admin3+portal*2+Mysql=8 | Nacos*3+Mysql=4 |
配置格式校驗 | 不支援 | 支援 | 支援 |
通行協議 | HTTP 和 AMQP | HTTP | HTTP |
資料一致性 | Git保證資料一致性,Config-Server從Git讀取資料 | 資料庫模擬訊息佇列,Apollo定時讀取訊息 | HTTP 非同步通知 |
單機讀(tps) | 7(限流所致) | 9000 | 15000 |
單機寫 | 5(限流所致) | 1100 | 1800 |
3 節點讀 | 21(限流所致) | 27000 | 45000 |
3 節點寫 | 5(限流所致) | 3300 | 5600 |
一、Nacos-Config 配置介面
1.1、配置列表
新建配置檔案
實際上是將配置儲存到資料庫中
1.2、歷史版本
當釋出配置更新之後
可以看到歷史版本
1.3、監聽查詢
可以檢視配置是否推動更新成功。
1.4、克隆
可以將配置快速克隆到其它開發環境中
二、許可權控制
如果需要使用許可權控制,需要修改配置檔案
$ vim application.properties
### If turn on auth system:
nacos.core.auth.enabled=true
此時可以看到多了許可權控制模組,可以給不同的使用者分配不同的角色,給不同的角色分配不同資源的不同的許可權,下圖為例,test 使用者只能訪問 dev 環境,且無法進行新增操作。
二、Nacos 配置中心使用
最佳實踐:
Namespace:代表不同的環境,如開發,測試,生產等
Group:代表專案,如xxx安全專案,xxx電商專案等
DataId:每個專案往往有若干個工程(微服務),每個配置集(DataId)是一個工程(微服務)的主配置檔案
2.1、引入依賴
先配置中心有這樣一份配置
<!--Nacos config 依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2、啟動類如下
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
while (true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(5);
}
}
}
在執行之前,必須使用 bootstrap.properties 配置檔案來配置 Nacos Server 地址,此配置檔案是 springcloud 擴充套件出來的,例如
resource 下 bootstrap.yml 檔案內容如下
spring:
application:
# 會自動根據服務名稱拉取 dataid 對應的配置,如果 dataid 與服務名不一致,需要手動指定 dataid
name: com.hudu.mall.order.redis
cloud:
nacos:
server-addr: 192.168.33.62:8847
username: test
password: 123456
config:
namespace: public
成功獲取到配置資訊
當我們修改配置檔案之後,nacos 可以立馬監測到配置的修改。
三、其它擴充套件
3.1、nacos 配置檔案擴充名
spring:
application:
# 會自動根據服務名稱拉取 dataid 對應的配置,如果 dataid 與服務名不一致,需要手動指定 dataid
name: com.hudu.mall.order.redis
cloud:
nacos:
server-addr: 192.168.33.62:8847
username: kunjuee
password: we753951.
config:
namespace: public
# nacos 客戶端預設是 properties 的副檔名
# 一旦修改成了飛 Properties 格式,則必須透過 file-extension 進行設定
file-extension: yaml
3.2、支援配置的動態更新
即上面演示的,當配置中心的配置修改後,會立馬監測到配置檔案的修改。
可以透過spring.cloud.nacos.config.refresh-enabled=false
來關閉動態重新整理
3.3、支援 profile 粒度的配置
spring-cloud-starter-alibaba-nacos-config 在載入配置的時候,不僅僅載入了以 dataid 為 ${spring.application.name}.${file-extension:properties}
為字首的基礎配置,還載入了 dataid 為 ${spring.application.name}-${profile}.${file-extension:properties}
的基礎配置。在日常開發中如果遇到多套配置環境下的不同配置,可以透過 Spring 提供的${spring.profile.active}
這個配置項來配置
spring.profiles.active=develop
注意:${spring.profile.active}
當透過配置檔案來指定時必須放在 bootstrap.properties 檔案中
當前配置中心配置如下
com.hudu.mall.order
內容如下
com.hudu.mall.order-dev.yaml
內容如下
專案結構如下
application.yml 內容如下
server:
port: 8050
# 在配置中心中,可以透過 profile 進行設定
# 只有預設的配置檔案才能結合 profile 進行使用(跟服務名相同的 dataid 的配置檔案,稱之為預設的配置檔案)
# 對應的 Dataid:${spring.application.name}-${profile}.${file-extension:properties}
# profile 的字尾必須與跟隨預設配置檔案的格式來
spring:
profiles:
active: dev
bootstrap.yml 檔案內容如下
spring:
application:
# 會自動根據服務名稱拉取 dataid 對應的配置,如果 dataid 與服務名不一致,需要手動指定 dataid
# 跟服務名相同的 dataid 的配置檔案,稱之為預設的配置檔案)
# 除了預設的配置檔案,其他配置檔案必須寫上字尾
name: com.hudu.mall.order
cloud:
nacos:
server-addr: 192.168.33.62:8847
username: kunjuee
password: we753951.
config:
namespace: public
# nacos 客戶端預設是 properties 的副檔名
# 一旦修改成了飛 Properties 格式,則必須透過 file-extension 進行設定
file-extension: yaml
# 客戶端將無法感知配置的變化
# refresh-enabled: false
結果如下
配置檔案優先順序(優先順序大的會覆蓋優先順序小的,並且會形成互補)
profile > 預設配置檔案
但是,還是推薦使用名稱空間的方式區別不同環境的配置,因為可以進行許可權控制
3.4、支援 namespace 的配置
用於進行租戶粒度的配置隔離。不同的名稱空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離, 例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
在沒有明確指定$(spring.clpud.nacos.config.namespace}
配置的情況下,預設使用的是 Nacos 上Public 這個 namespace。如果需要使用自定義的名稱空間,可以透過以下配置來實現:
spring.cloud.nacos.config.namespace=namespaceName
3.5、自定義 Group 的配置
在沒有明確指定${spring.cloud.nacos.config.group}
配置的強況下,預設使用的是 DEFAULT_GROUP,如果需要自定義自己的 Group,可以透過以下配置來實現
spring.cloud.nacos.config.group=DEVELOP_GROUP
注意:該配置必須放在 botstrap 配置檔案中,並且在新增配置時,Group 的值一定要和spring.cloud.nacos.config.group
的配置值一致
3.6、自定義擴充的 DataId 配置
3.6.1、shared-configs
Spring Cloud Alibaba Nacos Config從0.2.1版本後,可支援自定義Data ld的配置。一個完整的配置案例如下所示:
新建如下配置
該配置只有三個屬性
新增如下配置
spring:
cloud:
nacos:
config:
shared-configs:
- dataId: com.hudu.mall.common.properties
refresh: true
# group: 預設是 DEFAULT_GROUP
可以看到成功獲取到配置,並且優先順序是小於 profile配置 和 預設配置檔案,
如果有多個配置,會以後獲取到的配置為準。
spring:
cloud:
nacos:
config:
shared-configs:
- dataId: com.hudu.mall.common.properties
refresh: true
# group: 預設是 DEFAULT_GROUP
- dataId: com.hudu.mall.common02.properties
refresh: true
# group: 預設是 DEFAULT_GROUP
結果如下
3.6.2、extension-configs
建立如下配置
配置檔案內容如下
spring:
cloud:
nacos:
config:
shared-configs:
- dataId: com.hudu.mall.common.properties #[0]
refresh: true
# group: 預設是 DEFAULT_GROUP
- dataId: com.hudu.mall.common02.properties #[1]
refresh: true
# group: 預設是 DEFAULT_GROUP
extension-configs[0]:
dataId: com.hudu.mall.common03.properties
refresh: true
結果如下
四、@RefreshScope
@Value
註解可以獲取到配置中心的值,但是無動態感知修改後的值,需要利用@RefreshScope
註解
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${user.name}")
public String username;
@RequestMapping("show")
public String show() {
return username;
}
}
五、總結
配置檔案優先順序如下
profile > 預設配置檔案 > extension-configs(下標越大優先順序越大) > shared-configs(下標越大優先順序越大)
本作品採用《CC 協議》,轉載必須註明作者和本文連結