1. 简介
Nacos是阿里巴巴2018年7月份开源的项目,全称为Naming Configuration Service,
专注于服务发现和配置管理领域
其中,动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
Nacos提供了一个简洁易用的UI,管理所有的服务和应用的配置, 还提供包括配置版本跟踪、
一键回滚配置的配置管理特性,帮助其更安全地在生产环境中管理配置变更和降低配置变更带来的风险
。
2. 如何使用
Nacos可以和Sping、Spring boot及Spring cloud完美集成
2.1 核心概念
其中,dataId特别说明:
- 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
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 获取配置机制
nacos获取配置关键步骤:
- 1、client 向service发起获取配置是否变更请求(long polling);
- 2、若有配置变更(比较md5),立即返回response;
- 3、若配置未变更,开启AsyncContext异步处理,并将response放入queen;
- 4、当配置变更,从queen中找出response并立即响应;
其中最关键的是第三步中的AsyncContext,这里简单介绍一下:
AsyncContext是Servlet 3.0提供的异步处理类,主要作用为释放Servlet 线程,让当前Servlet 线程去处理别的请求。
3.2 源码剖析
client 向service发起获取配置是否变更请求(long polling):
若有配置变更(比较md5),立即返回response:
若配置未变更,开启AsyncContext异步处理,并将response放入queen:
当配置变更,从queen中找出response并立即响应:
4 动态更新实现原理
4.1 配置动态更新机制
nacos使用对象销毁重建的机制实现配置更新,那就引出一下三个问题:
先简单导入下Bean的生命周期:
4.2 @ConfigurationProperties配置的更新
4.2.1 源码剖析
WHO: 加@ConfigurationProperties的bean:
WHERE:在postProcessBeforeInitialization阶段将以上bean缓存到ConfigurationPropertiesBeans.beans (Map):
WHEN:产生事件EnvironmentChangeEvent时,触发ConfigurationPropertiesRebinder执行销毁对象操作
4.3 @RefreshScope配置的更新
4.3.1 源码剖析
WHERE:在AbstractBeanFactory#doGetBean时该Bean实例由Scope自己RefreshScope#get创建(缓存在map中):
WHEN:产生事件RefreshEvent时,触发RefreshEventListener执行销毁对象操作:
对象重建(销毁-新建)
Nacos产生事件RefreshEvent,触发RefreshEventListener执行销毁对象操作:
4.4 总结
- @ConfigurationProperties可以自动更新;
- @Value需在bean上新增@RefreshScope 才能自动更新;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。