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,需要主要版本的适配
<!-- 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中加入相关配置,如
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 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,待研究
公众号:
原文地址:https://my.oschina.net/u/867417/blog/3035487
相关推荐
-
Spring Cloud GateWay 路由转发规则介绍 Java框架
2019-9-9
-
【问题排查】fastjson线上排坑记 Java框架
2019-7-3
-
LinkedList 基本示例及源码解析 Java框架
2019-6-27
-
Spring Boot(四):如何优雅的使用 Mybatis Java框架
2020-6-1
-
Spring Boot 1 和 Spring Boo 2的差别 Java框架
2020-6-1
-
MySQL主从同步配置 Java框架
2019-6-9
-
kafka生产实践 Java框架
2019-6-30
-
学习源码的第八个月,我成了Spring的开源贡献者 Java框架
2020-6-11
-
shiro整合oauth Java框架
2019-3-22
-
Spring Boot整合rabbitmq Java框架
2020-6-11