1, 引入nacos來作配置中心java
項目如今用的是spring cloud netflix,沒有用到spring-cloud-alibaba的全家桶,但又想用到nacos來作配置中心,故按官網提供的方式是不行的git
2, 探究下nacos配置中心的使用與實現github
目前用的spring config server其實弊端不少,好比: 強依賴gitLab, 加入BUS複雜度高很差確保全部節點的更新等缺點spring
故,想用nacos去替換下當前的配置中心數據庫
官網是假設已經引入了spring-cloud-alibaba的,故直接引入bootstrap
其實都是基於spring-cloud的標準,故直接引入spring cloud alibaba nacos相關適配JAR包便可,但也都有引入spring-cloud-commons,須要主要版本的適配markdown
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-nacos-config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>0.1.1.RELEASE</version> </dependency>
而後在bootstrap.yml中加入相關配置,如app
spring: cloud: nacos: config: server-addr: 10.1.5.101:8848
而後和官網同樣了, 默認的dataId是this
${spring.application.name}-${spring.profile.active}.${file-extension}spa
其中 file-extension 默認爲 properties
如,項目名爲 test
那麼active爲local的默認dataId爲
test-local.properties
這裏其實和config server的用法同樣,也是實現了spring cloud config的標準
1), spring boot 的 自動裝配模式的能夠直接熱更新
如:
@ConfigurationProperties(PREFIX) public class TestSentinelConfig { public static final String PREFIX = "test.sentinel"; private String values; public String getValues() { return values; } public void setValues(String values) { this.values = values; } }
2) , 加了做用域@RefreshScope的,如: @Value("${value}")模式注入的話,須要在bean上加入RefreshScope標籤
@RefreshScope @RestController public class TestOnly { @Value("${testConfig.value1}") private String value; @RequestMapping("test/test") public String test() { return value; } }
nacos是經過長輪詢,拉取最新配置的,拉去到最新配置後,在spring 的context裏進行事件發佈一個RefreshEvent。
輪詢發佈事件具體源碼:
入口, nacos client 中
ClientWorker ->
executor.scheduleWithFixedDelay(new Runnable() { public void run() { try { checkConfigInfo(); } catch (Throwable e) { log.error(agent.getName(), "NACOS-XXXX", "[sub-check] rotate check error", e); } } }, 1L, 10L, TimeUnit.MILLISECONDS);
10L一次 執行一次checkConfigInfo()
而後nacos的spring cloud的適配器,spring-cloud-starter-alibaba-nacos-config進行適配
遇到更新便發佈RefreshEvent #org.springframework.cloud.alibaba.nacos.refresh.NacosContextRefresher$1.receiveConfigInfo
... refreshHistory.add(dataId, md5); applicationContext.publishEvent( new RefreshEvent(this, null, "Refresh Nacos config")); ....
這部分 更多spring cloud alibaba nacos源碼細節實現
再日後,就是spring cloud context自己的實現了,這部分和spring config server是同樣的了
而後後續就和spring config server的同樣了
org.springframework.cloud.endpoint.event.RefreshEventListener 監聽 -->
核心部分 ContextRefresher#refresh()
public synchronized Set<String> refresh() { Map<String, Object> before = extract( this.context.getEnvironment().getPropertySources()); addConfigFilesToEnvironment(); Set<String> keys = changes(before, extract(this.context.getEnvironment().getPropertySources())).keySet(); this.context.publishEvent(new EnvironmentChangeEvent(keys)); this.scope.refreshAll(); return keys; }
這部分網上分析的資料就比較多了,和原來咱們用spring config server 訪問refresh實際上是一個意識了
這部分簡單說就是nacos client長輪詢dataId的修改,而後通知到spring cloud alibaba的適配器,經過spring cloud common部分進行熱更新屬性。
1, 這部分集羣的策略還得探究
2, 對於配置信息的數據庫的持久化還沒加上
3,如何替代spring config server的版本控制策略,用group麼
4,是否要用到nacos的註冊中心去替代eureka,待研究
公衆號: