1. 簡介
Nacos是阿里巴巴2018年7月份開源的項目,全稱為Naming Configuration Service,
專注於服務發現和配置管理領域
其中,動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。
Nacos提供了一個簡潔易用的UI,管理所有的服務和應用的配置, 還提供包括配置版本跟蹤、
一鍵回滾配置的配置管理特性,幫助其更安全地在生產環境中管理配置變更和降低配置變更帶來的風險
。
2. 如何使用
Nacos可以和Sping、Spring boot及Spring cloud完美集成
2.1 核心概念
其中,dataId特別説明:
- prefix : 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置
- spring.profiles.active : 即為當前環境對應的 profile
- file-exetension : 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型
如:product-dev.properties
2.2 如何配置
配置比較簡單,只需以下二步驟即可:
-
添加依賴:
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config' - 在bootstrap.properties中新增配置:
spring:
application:
name: product
profiles:
active: dev
nacos:
config:
file-extension: properties
server-addr: http://localhost:8848
namespace: dce4ce85-ba3a-4450-a8ea-1aa4849e5be3
username: nacos
password: nacos
3 配置獲取實現原理
3.1 獲取配置機制
nacos獲取配置關鍵步驟:
- 1、client 向service發起獲取配置是否變更請求(long polling);
- 2、若有配置變更(比較md5),立即返回response;
- 3、若配置未變更,開啓AsyncContext異步處理,並將response放入queen;
- 4、當配置變更,從queen中找出response並立即響應;
其中最關鍵的是第三步中的AsyncContext,這裏簡單介紹一下:
AsyncContext是Servlet 3.0提供的異步處理類,主要作用為釋放Servlet 線程,讓當前Servlet 線程去處理別的請求。
3.2 源碼剖析
client 向service發起獲取配置是否變更請求(long polling):
若有配置變更(比較md5),立即返回response:
若配置未變更,開啓AsyncContext異步處理,並將response放入queen:
當配置變更,從queen中找出response並立即響應:
4 動態更新實現原理
4.1 配置動態更新機制
nacos使用對象銷燬重建的機制實現配置更新,那就引出一下三個問題:
先簡單導入下Bean的生命週期:
4.2 @ConfigurationProperties配置的更新
4.2.1 源碼剖析
WHO: 加@ConfigurationProperties的bean:
WHERE:在postProcessBeforeInitialization階段將以上bean緩存到ConfigurationPropertiesBeans.beans (Map):
WHEN:產生事件EnvironmentChangeEvent時,觸發ConfigurationPropertiesRebinder執行銷燬對象操作
4.3 @RefreshScope配置的更新
4.3.1 源碼剖析
WHERE:在AbstractBeanFactory#doGetBean時該Bean實例由Scope自己RefreshScope#get創建(緩存在map中):
WHEN:產生事件RefreshEvent時,觸發RefreshEventListener執行銷燬對象操作:
對象重建(銷燬-新建)
Nacos產生事件RefreshEvent,觸發RefreshEventListener執行銷燬對象操作:
4.4 總結
- @ConfigurationProperties可以自動更新;
- @Value需在bean上新增@RefreshScope 才能自動更新;