nocas配置中心热更新原理_spring cloud下用nacos做配置中心的初步探究,替换spring config server...

一, 背景:

1, 引入nacos来做配置中心

项目现在用的是spring cloud netflix,没有用到spring-cloud-alibaba的全家桶,但又想用到nacos来做配置中心,故按官网提供的方式是不行的

2, 探究下nacos配置中心的使用与实现

目前用的spring config server其实弊端很多,比如: 强依赖gitLab, 加入BUS复杂度高不好确保所有节点的更新等缺点

故,想用nacos去替换下当前的配置中心

二, 引入

1, 如何在spring cloud netflix中引入nacos相关?

官网是假设已经引入了spring-cloud-alibaba的,故直接引入

其实都是基于spring-cloud的标准,故直接引入spring cloud alibaba nacos相关适配JAR包即可,但也都有引入spring-cloud-commons,需要主要版本的适配

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-config

0.1.1.RELEASE

然后在bootstrap.yml中加入相关配置,如

spring:

cloud:

nacos:

config:

server-addr: 10.1.5.101:8848

然后和官网一样了, 默认的dataId是

${spring.application.name}-${spring.profile.active}.${file-extension}

其中 file-extension 默认为 properties

如,项目名为 test

那么active为local的默认dataId为

test-local.properties

三, nacos的使用

哪些配置可以热更新

这里其实和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 context本身的实现了,这部分和spring config server是一样的了

然后后续就和spring config server的一样了

org.springframework.cloud.endpoint.event.RefreshEventListener 监听  -->

核心部分 ContextRefresher#refresh()

public synchronized Set refresh() {

Map before = extract(

this.context.getEnvironment().getPropertySources());

addConfigFilesToEnvironment();

Set 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,待研究

公众号:

来源:oschina

链接:https://my.oschina.net/u/867417/blog/3035487

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值