Nacos - 配置中心

Nacos 提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务端和客户端支持。使用 Spring Cloud Alibaba Nacos Config。

spring.application.name=nacos-config
# 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# dataid 为 yaml 的文件扩展名配置方式
# `${spring.application.name}.${file-extension:properties}`
spring.cloud.nacos.config.file-extension=yaml

# 指定namespace
spring.cloud.nacos.config.namespace=71bb9785-231f-4eca-b4dc-6be446e12ff8

  • 支持profile粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
spring.profiles.active=dev
  • 支持自定义 Group 的配置
Group是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下,默认是DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
  • 支持自定义扩展的 Data Id 配置
  Data ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
  通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
# 自定义 Data Id 的配置
#不同工程的通用配置 支持共享的 DataId
spring.cloud.nacos.config.sharedConfigs[0].data-id= common.yaml
spring.cloud.nacos.config.sharedConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.sharedConfigs[0].refresh=true

# config external configuration
# 支持一个应用多个 DataId 的配置
spring.cloud.nacos.config.extensionConfigs[0].data-id=ext-config-common01.properties
spring.cloud.nacos.config.extensionConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[0].refresh=true

spring.cloud.nacos.config.extensionConfigs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extensionConfigs[1].group=REFRESH_GROUP

优先级如下:

@RefreshScope

@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解.
@RestController
@RefreshScope
public class TestController {

    @Value("${common.age}")
    private String age;

    @GetMapping("/common")
    public String hello() {
        return age;
    }
}

SpringBoot整合Nacos

@NacosPropertySource(dataId = "example", autoRefreshed = true)

@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)

通过两个注解配合使用,也可以不用写@RefreshScope注解。

client端是如何从配置中心获取配置的

配置中心配置发生变更client是如何感知的

集群架构下其他节点是如何同步配置数据的?

配置中心的架构

 注意:不是去查mysql,而是去查询本地磁盘的缓存,所以直接修改mysql配置文件是不行的。修改配置需要发布ConfigDataEvent事件,触发本地文件和内存的更新。

加载配置文件先后顺序

 源码入口:()

org.springframework.boot.env.PropertyPropertySourceLoader#load

PropertySourceLoader -> prepareContext() -> ApplicationContextInitializer(PropertySourceBootStrapConfiguration).initialize()
PropertySourceLocator(NacosPropertySourceLocator).locationCollection(environment) -> loadSharedConfiguration -> loadExtConfiguration -> loadApplicationConfiguration。

nacos config client源码分析

配置中心核心接口ConfigService

Client获取配置

获取配置的主要方法是 NacosConfigService 类的 getConfig 方法,通常情况下该方法直接从本地文件中取得配置的值,如果本地文件不存在或者内容为空,则再通过 HTTP GET 方法从远端拉取配置,并保存到本地快照中。当通过 HTTP 获取远端配置时,Nacos 提供了两种熔断策略,一是超时时间,二是最大重试次数,默认重试三次。

Nacos Server 在启动的时候怎么将所有的配置文件信息 Dump 到磁盘上的?

DumpService,在更新md5内容的时候,会发布一个事件,通知客户端进行配置更新。

动态刷新原理

spring实例化Bean之后,会调用事件监听器:NacosContextRefresher ,它实现了ApplicationListener<ApplicationReadyEvent>.

registerNacosListenersForApplications() -> NacosPropertySource.getDataId() -> registerNacosListener(propertySource.getGroup(), dataId);

 

2.2.2 注册监听器

配置中心客户端会通过对配置项注册监听器达到在配置项变更的时候执行回调的功能。

End!

posted @ 2022-12-10 14:08  君莫笑我十年游  阅读(100)  评论(0编辑  收藏  举报