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,待研究
公众号:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
并行化-你的高并发大杀器
1.前言 想必热爱游戏的同学小时候,都幻想过要是自己要是能像鸣人那样会多重影分身之术,就能一边打游戏一边上课了,可惜漫画就是漫画,现实中并没有这个技术,你要么只有老老实实的上课,要么就只有逃课去打游戏了。虽然在现实中我们无法实现多重影分身这样的技术,但是我们可以在计算机世界中实现我们这样的愿望。 2.计算机中的分身术 计算机中的分身术不是天生就有了。在1971年,1971年,英特尔推出的全球第一颗通用型微处理器4004,由2300个晶体管构成。当时,公司的联合创始人之一戈登摩尔就提出大名鼎鼎的“摩尔定律”——每过18个月,芯片上可以集成的晶体管数目将增加一倍。最初的主频740kHz(每秒运行74万次),现在过了快50年了,大家去买电脑的时候会发现现在的主频都能达到4.0GHZ了(每秒40亿次)。但是主频越高带来的收益却是越来越小: 据测算,主频每增加1G,功耗将上升25瓦,而在芯片功耗超过150瓦后,现有的风冷散热系统将无法满足散热的需要。有部分CPU都可以用来煎鸡蛋了。 流水线过长,使得单位频率效能低下,越大的主频其实整体性能反而不如小的主频。 戈登摩尔认为摩尔定律未来10-20年会...
- 下一篇
支撑百万并发的数据库架构如何设计?
前言 作为一个全球人数最多的国家,一个再怎么凄惨的行业,都能找出很多的人为之付出。而在这个互联网的时代,IT公司绝对比牛毛还多很多。但是大多数都是创业公司,长期存活的真的不多。大多数的IT项目在注册量从0-100万,日活跃1-5万,说实话就这种系统随便找一个有几年工作经验的高级工程师,然后带几个年轻工程师,随便干干都可以做出来。 因为这样的系统,实际上主要就是在前期快速的进行业务功能的开发,搞一个单块系统部署在一台服务器上,然后连接一个数据库就可以了。接着大家就是不停的在一个工程里填充进去各种业务代码,尽快把公司的业务支撑起来。 但是如果真的发展的还可以,可能就会遇到如下问题: 在运行的过程中系统访问数据库的性能越来越差,单表数据量越来越大,一些复杂查询 SQL直接拖垮! 这种时候就不得不考虑的解决方案:缓存,负载均衡,项目分块(微服务);数据库:读写分离,分库分表等技术 如果说此时你还是一台数据库服务器在支撑每秒上万的请求,负责任的告诉你,每次高峰期会出现下述问题: 数据库服务器的磁盘 IO、网络带宽、CPU 负载、内存消耗,都会达到非常高的情况,数据库所在服务器的整体负载会非常重,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2全家桶,快速入门学习开发网站教程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- 2048小游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7