动态

详情 返回 返回

Nacos 動態配置實現原理 - 动态 详情

1. 簡介

Nacos是阿里巴巴2018年7月份開源的項目,全稱為Naming Configuration Service,
專注於服務發現配置管理領域

其中,動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。
Nacos提供了一個簡潔易用的UI,管理所有的服務和應用的配置, 還提供包括配置版本跟蹤、
一鍵回滾配置的配置管理特性,幫助其更安全地在生產環境中管理配置變更和降低配置變更帶來的風險

2. 如何使用

image.png

Nacos可以和Sping、Spring boot及Spring cloud完美集成

2.1 核心概念

image.png

其中,dataId特別説明:
image.png

  • 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
image.png

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 獲取配置機制

image.png
nacos獲取配置關鍵步驟:

  • 1、client 向service發起獲取配置是否變更請求(long polling);
  • 2、若有配置變更(比較md5),立即返回response;
  • 3、若配置未變更,開啓AsyncContext異步處理,並將response放入queen;
  • 4、當配置變更,從queen中找出response並立即響應;

其中最關鍵的是第三步中的AsyncContext,這裏簡單介紹一下:

AsyncContext是Servlet 3.0提供的異步處理類,主要作用為釋放Servlet 線程,讓當前Servlet 線程去處理別的請求。
image.png
image.png

3.2 源碼剖析

client 向service發起獲取配置是否變更請求(long polling):
image.png
image.png
image.png
image.png
image.png
若有配置變更(比較md5),立即返回response:
image.png
image.png
若配置未變更,開啓AsyncContext異步處理,並將response放入queen:
image.png
當配置變更,從queen中找出response並立即響應:
image.png
image.png
image.png
image.png

4 動態更新實現原理

4.1 配置動態更新機制

nacos使用對象銷燬重建的機制實現配置更新,那就引出一下三個問題:
image.png

先簡單導入下Bean的生命週期:
image.png

4.2 @ConfigurationProperties配置的更新

image.png

4.2.1 源碼剖析

WHO: 加@ConfigurationProperties的bean:
image.png
WHERE:在postProcessBeforeInitialization階段將以上bean緩存到ConfigurationPropertiesBeans.beans (Map):
image.png
WHEN:產生事件EnvironmentChangeEvent時,觸發ConfigurationPropertiesRebinder執行銷燬對象操作
image.png
image.png

4.3 @RefreshScope配置的更新

image.png

4.3.1 源碼剖析

WHERE:在AbstractBeanFactory#doGetBean時該Bean實例由Scope自己RefreshScope#get創建(緩存在map中):
image.png
image.png
WHEN:產生事件RefreshEvent時,觸發RefreshEventListener執行銷燬對象操作:
image.png
image.png

對象重建(銷燬-新建)
image.png
Nacos產生事件RefreshEvent,觸發RefreshEventListener執行銷燬對象操作:
image.png

4.4 總結

  • @ConfigurationProperties可以自動更新;
  • @Value需在bean上新增@RefreshScope 才能自動更新;

Add a new 评论

Some HTML is okay.