1. 简介

Nacos是阿里巴巴2018年7月份开源的项目,全称为Naming Configuration Service,
专注于服务发现配置管理领域

其中,动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
Nacos提供了一个简洁易用的UI,管理所有的服务和应用的配置, 还提供包括配置版本跟踪、
一键回滚配置的配置管理特性,帮助其更安全地在生产环境中管理配置变更和降低配置变更带来的风险

2. 如何使用

image.png

Nacos可以和Sping、Spring boot及Spring cloud完美集成

2.1 核心概念

image.png

其中,dataId特别说明:
image.png

  • 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
image.png

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 获取配置机制

image.png
nacos获取配置关键步骤:

  • 1、client 向service发起获取配置是否变更请求(long polling);
  • 2、若有配置变更(比较md5),立即返回response;
  • 3、若配置未变更,开启AsyncContext异步处理,并将response放入queen;
  • 4、当配置变更,从queen中找出response并立即响应;

其中最关键的是第三步中的AsyncContext,这里简单介绍一下:

AsyncContext是Servlet 3.0提供的异步处理类,主要作用为释放Servlet 线程,让当前Servlet 线程去处理别的请求。
image.png
image.png

3.2 源码剖析

client 向service发起获取配置是否变更请求(long polling):
image.png
image.png
image.png
image.png
image.png
若有配置变更(比较md5),立即返回response:
image.png
image.png
若配置未变更,开启AsyncContext异步处理,并将response放入queen:
image.png
当配置变更,从queen中找出response并立即响应:
image.png
image.png
image.png
image.png

4 动态更新实现原理

4.1 配置动态更新机制

nacos使用对象销毁重建的机制实现配置更新,那就引出一下三个问题:
image.png

先简单导入下Bean的生命周期:
image.png

4.2 @ConfigurationProperties配置的更新

image.png

4.2.1 源码剖析

WHO: 加@ConfigurationProperties的bean:
image.png
WHERE:在postProcessBeforeInitialization阶段将以上bean缓存到ConfigurationPropertiesBeans.beans (Map):
image.png
WHEN:产生事件EnvironmentChangeEvent时,触发ConfigurationPropertiesRebinder执行销毁对象操作
image.png
image.png

4.3 @RefreshScope配置的更新

image.png

4.3.1 源码剖析

WHERE:在AbstractBeanFactory#doGetBean时该Bean实例由Scope自己RefreshScope#get创建(缓存在map中):
image.png
image.png
WHEN:产生事件RefreshEvent时,触发RefreshEventListener执行销毁对象操作:
image.png
image.png

对象重建(销毁-新建)
image.png
Nacos产生事件RefreshEvent,触发RefreshEventListener执行销毁对象操作:
image.png

4.4 总结

  • @ConfigurationProperties可以自动更新;
  • @Value需在bean上新增@RefreshScope 才能自动更新;

捕风
353 声望1 粉丝