首先,我們需要在 coupon-customer-impl 項目的 resource 文件夾中創建 bootstrap.yml 配置文件。
接下來,你需要在 bootstrap.yml 文件中添加一些 Nacos Config 配置項,我把一些常用的配置項寫到了這里,你可以參考一下。
spring:
# 必須把name屬性從application.yml遷移過來,否則無法動態刷新
application:
name: coupon-customer-serv
cloud:
nacos:
config:
# nacos config服務器的地址
server-addr: localhost:8848
file-extension: yml
# prefix: 文件名前綴,默認是spring.application.name
# 如果沒有指定命令空間,則默認命令空間為PUBLIC
namespace: dev
# 如果沒有配置Group,則默認值為DEFAULT_GROUP
group: DEFAULT_GROUP
# 從Nacos讀取配置項的超時時間
timeout: 5000
# 長輪詢超時時間
config-long-poll-timeout: 10000
# 輪詢的重試時間
config-retry-time: 2000
# 長輪詢最大重試次數
max-retry: 3
# 開啟監聽和自動刷新
refresh-enabled: true //默認true
# Nacos的擴展配置項,數字越大優先級越高
extension-configs: //讀取多份配置
- dataId: redis-config.yml
group: EXT_GROUP
# 動態刷新
refresh: true
- dataId: rabbitmq-config.yml
group: EXT_GROUP
refresh: true
文件定位配置項:主要用於匹配 Nacos 服務器上的配置文件。
- namespace:Nacos Config 的 namespace 和 Nacos 服務發現階段配置的 namespace 是同一個概念和用法。我們可以使用 namespace 做多租戶(multi-tenant)隔離方案,或者隔離不同環境。我指定了 namespace=dev,應用程序只會去獲取 dev 這個命名空間下的配置文件;
- group:概念和用法與 Nacos 服務發現中的 group 相同,如未指定則默認值為 DEFAULT_GROUP,應用程序只會加載相同 group 下的配置文件;
- prefix:需要加載的文件名前綴,默認為當前應用的名稱,即 spring.application.name,一般不需要特殊配置;
- file-extension:需要加載的文件擴展名,默認為 properties,我改成了 yml。你還可以選擇 xml、json、html 等格式。
超時和重試配置項:
- timeout:從 Nacos 讀取配置項的超時時間,單位是 ms,默認值 3000 毫秒;
- config-retry-time:獲取配置項失敗的重試時間;
- config-long-poll-timeout:長輪詢超時時間,單位為 ms;
- max-retry:最大重試次數。
在這里,我想多跟你介紹一下超時和重試配置里提到的長輪詢機制的工作原理。
當 Client 向 Nacos Config 服務端發起一個配置查詢請求時,服務端並不會立即返回查詢結果,而是會將這個請求 hold 一段時間。
如果在這段時間內有配置項數據的變更,那么服務端會觸發變更事件,客戶端將會監聽到該事件,並獲取相關配置變更;
如果這段時間內沒有發生數據變更,那么在這段“hold 時間”結束后,服務端將釋放請求。采用長輪詢機制可以降低多次請求帶來的網絡開銷,並降低更新配置項的延遲。
通用配置:
- server-addr:Nacos Config 服務器地址;
- refresh-enabled: 是否開啟監聽遠程配置項變更的事件,默認為 true。
擴展配置:
- extension-configs:如果你想要從多個配置文件中獲取配置項,那么你可以使用 extension-configs 配置多源讀取策略。
- extension-configs 是一個 List 的結構,每個節點都有 dataId、group 和 refresh 三個屬性,分別代表了讀取的文件名、所屬分組、是否支持動態刷新。
在實際的應用中,我們經常需要將一個公共配置項分配給多個微服務使用,比如多個服務共享同一份 Redis、RabbitMQ 中間件連接信息。
這時我們就可以在 Nacos Config 中添加一個配置文件,並通過 extension-configs 配置項將這個文件作為擴展配置源加到各個微服務中。
這樣一來,我們就不需要在每個微服務中單獨管理通用配置了。