Nacos 入门教程 - 配置管理中级篇
大纲
技术资源
Nacos Config Spring 入门案例
1.0、版本说明
在本案例中,Spring 的版本为 5.2.x,Nacos Server 的版本为 1.4.0,点击下载完整的案例代码。
1.1、发布配置
1 | Namespace: public |
1.2 、添加 Maven 依赖
1 | <dependency> |
1.3、创建 Nacos 配置类
添加 @EnableNacosConfig
注解启用 Nacos Spring 的配置管理服务,其中使用 @NacosPropertySource
加载了 dataId 为 nacos_config_spring_demo.properties
的配置集,并开启自动更新
1 | package com.nacos.study.config; |
1.4、创建 Controller 测试类
通过 Nacos 的 @NacosValue
注解设置属性值
1 | package com.nacos.study.controller; |
1.5、配置 web.xml
1 | <servlet> |
1.6、配置 dispatcherServlet-servlet.xml
1 | <!-- Spring MVC Annotation-Driven --> |
1.7、测试应用程序
- 将 Spring Web 应用部署到 Tomcat 服务器
- 浏览器访问
http://127.0.0.1:8080/config/get
,若响应结果为true
,则说明程序运行正常
- 浏览器访问
Nacos Config Spring Boot 入门案例
2.0、版本说明
在本案例中,Spring Boot 的版本为 2.0.3.RELEASE,对应的 Nacos Config Spring Boot 的版本为 0.2.7,Nacos Server 的版本为 1.4.0,点击下载完整的案例代码。
2.1、发布配置
1 | Namespace: public |
2.2、添加 Maven 依赖
特别注意,Nacos Spring Boot Starter 版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
1 | <parent> |
2.3、创建启动主类
使用 @NacosPropertySource
加载了 dataId 为 nacos_config_springboot_demo.properties
的配置集,并开启自动更新
1 |
|
2.4、创建 Controller 测试类
通过 Nacos 的 @NacosValue
注解设置属性值
1 |
|
2.5、配置 application.properties
在 application.properties
中配置 Nacos Server 的地址
1 | nacos.config.server-addr=127.0.0.1:8848 |
2.6、测试应用程序
- 启动 Spring Boot 应用
- 浏览器访问
http://127.0.0.1:8080/config/get
,若响应结果为true
,则说明程序运行正常
- 浏览器访问
Nacos Config Spring Cloud 入门案例
3.0、版本说明
在本案例中,Spring Cloud 的版本是 Greenwich.SR6,对应的 Spring Boot 版本是 2.1.18.RELEASE,对应的 Nacos Config Spring Cloud 版本为 2.1.3.RELEASE,Nacos Server 的版本为 1.4.0,Nacos 官方版本说明可以看这里,点击下载完整的案例代码。
3.1、发布配置
第一步:创建名称为 dev
的命名空间
第二步:在 dev
命名空间下新增两项配置,具体的配置内容如下:
1 | Namespace: 4bfcbae8-8c37-417d-89e4-d5134e23eb18 |
1 | Namespace: 4bfcbae8-8c37-417d-89e4-d5134e23eb18 |
3.2、创建 Maven 父工程
在 Maven 父工程里面配置好工程需要的父级依赖,目的是为了更方便管理与简化配置,具体配置如下。特别注意,Nacos Spring Cloud Starter 版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本,版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本,Nacos 官方版本说明可以看这里。
1 | <parent> |
特别注意
若使用的 Spring Cloud 是高版本,例如 Spring Cloud 2021.0.1
,则还需要引入 spring-cloud-starter-bootstrap
依赖(如下所示),否则 Spring Cloud 无法读取项目中的 bootstrap.yml
配置文件,导致 Maven 引入 Nacos 配置中心后无法生效,详细说明请看 这里。
1 | <dependency> |
3.3、创建 Service 1 工程
创建 Service 1 的 Maven 工程,配置工程里的 pom.xml 文件,需要引入 spring-cloud-starter-alibaba-nacos-config
依赖
1 | <dependency> |
创建 Service 1 的主启动类
1 |
|
创建 Service 1 的 Controller 测试类,添加 Spring Cloud 原生 @RefreshScope
注解来实现配置自动更新,或者手动通过 ConfigurableApplicationContext.getEnvironment().getProperty()
来实时获取最新的配置信息
1 |
|
添加 Service 1 需要的 bootstrap.yml 配置文件到工程中
1 | server: |
3.4、创建 Service 2 工程
创建 Service 2 的 Maven 工程,配置工程里的 pom.xml 文件,需要引入 spring-cloud-starter-alibaba-nacos-config
依赖
1 | <dependency> |
创建 Service 2 的主启动类
1 |
|
创建 Service 2 的 Controller 测试类,添加 Spring Cloud 原生 @RefreshScope
注解来实现配置自动更新,或者手动通过 ConfigurableApplicationContext.getEnvironment().getProperty()
来实时获取最新的配置信息
1 |
|
添加 Service 2 需要的 bootstrap.yml 配置文件到工程中
1 | server: |
3.5、测试应用程序
- 分别启动 nacos-service-1、nacos-service-2 应用
- 浏览器访问
http://127.0.0.1:56010/config/get
,若响应结果为service-1-config
,则说明 nacos-service-1 应用运行正常
- 浏览器访问
- 通过 Nacos 的控制台更改 Data ID 为
service-1.yaml
的配置内容,然后再次访问http://127.0.0.1:56010/config/get
,若响应结果发生了变化,则说明 nacos-service-1 应用可以实时感知到 Nacos Server 的配置变更
- 通过 Nacos 的控制台更改 Data ID 为
- 参考步骤二和步骤三,测试 nacos-service-2 应用即可
Nacos Config Spring Cloud 常用配置
配置信息的优先级
若本地配置文件(YML、Properties)和 Nacos 配置中心分别存放了相同的配置信息,Nacos Config Spring Cloud 会优先使用配置中心的配置信息,即配置中心的信息会覆盖本地的配置信息。
常用的配置参数
在上面的 bootstrap.yaml
配置文件中,之所以需要配置 spring.application.name
,是因为它是构成 Nacos 配置管理 dataId
字段的一部分,在 Nacos Spring Cloud 中,dataId
的完整格式如下:
1 | ${prefix}-${spring.profiles.active}.${file-extension} |
group
默认为DEFAULT_GROUP
,可以通过spring.cloud.nacos.config.group
来配置prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置namespace
默认为public
命名空间的 ID,可以通过spring.cloud.nacos.config.namespace
来配置,这里的值是 Namespace 的 IDfile-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置,目前只支持properties
和yaml
类型spring.profiles.active
即为当前环境对应的profile
。特别注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId
的拼接格式会变成${prefix}.${file-extension}
完整的配置参数
配置文件加载顺序
若项目中同时存在 bootstrap.yaml
和 application.yml
配置文件,那么 Nacos Config Spring Cloud 的配置信息必须写在 bootstrap.yml
配置文件里,因为 Spring Boot 会优先加载 bootstrap.yml
配置文件。值得一提的是,bootstrap.yml
作用于应用程序上下文的引导阶段,bootstrap.yml
由父 Spring ApplicationContext 加载。
自定义 Data ID 配置
自定义扩展 Data ID 配置
在日常项目开发中,单个微服务可能拥有多个配置文件,对应的就是 Nacos 中的多个 Data ID(配置集),例如包括全局配置、局部配置等(如下图),而上面的案例只能使用配置单一的 Data ID(配置集),无法满足实际的开发需求。但 Nacos Config Spring CLoud 提供了自定义扩展 Data ID 的配置,以此来解决该问题。在以下案例中,首先通过 Nacos 的控制台新增了全局配置(extension-config-01.yaml
)与默认配置(extension-config-02.yaml
),然后在 bootstrap.yaml
配置文件中通过 extension-configs
标签来配置多个 Data ID(配置集),点击下载完整的案例代码。
使用场景
发布配置
1 | Namespace: 4bfcbae8-8c37-417d-89e4-d5134e23eb18 |
1 | Namespace: 4bfcbae8-8c37-417d-89e4-d5134e23eb18 |
配置示例
值得一提的是,在旧版 Nacos Config Spring Cloud 中,使用的标签是 ext-config
,下标都是从零开始,配置示例如下:
1 | server: |
- 通过
spring.cloud.nacos.config.extension-config[n].data-id
的配置方式来支持多个 Data ID 的配置 - 通过
spring.cloud.nacos.config.extension-config[n].group
的配置方式自定义 Data ID 所在的组,不配置的话,默认是DEFAULT_GROUP
- 通过
spring.cloud.nacos.config.extension-config[n].refresh
的配置方式来控制该 Data ID 在配置变更时,是否支持在应用中可动态刷新,感知到最新的配置值,默认是不支持的 - 多个 Data ID 同时配置时,优先级关系是
spring.cloud.nacos.config.extension-config[n].data-id
其中n
的值越大,优先级越高 spring.cloud.nacos.config.extension-config[n].data-id
的值必须带文件扩展名,文件扩展名支持properties
、yaml/yml
,此时spring.cloud.nacos.config.file-extension
的配置参数对自定义扩展配置的 Data ID 文件扩展名没有影响
Java 代码
1 |
|
自定义共享 Data ID 配置
为了更加清晰地在多个应用间配置共享的 Data ID,可以使用 spring.cloud.nacos.config.shared-dataids
标签来定义 Data ID。值得一提的是,在新版的 Nacos Config Spring Cloud 中,使用的标签升级为 spring.cloud.nacos.config.shared-configs
。当使用自定义共享 Data ID 配置的方式时,只能读取到配置分组(Group)为 DEFAULT_GROUP
的 Data ID,如果 Data ID 归属于其他非默认的配置分组(DEFAULT_GROUP
),则无法读取对应的配置信息,所以自定义共享 Data ID 配置的方式在实际开发中使用频率较低。
配置示例
1 | server: |
- 通过
spring.cloud.nacos.config.shared-dataids
来支持多个共享 Data ID 的配置,多个之间用逗号隔开 - 通过
spring.cloud.nacos.config.refreshable-dataids
来支持哪些共享配置的 Data ID 在配置变化时,在应用中是否可动态刷新,感知到最新的配置值,多个 Data ID 之间用逗号隔开。如果没有配置时,默认情况下所有共享配置的 Data ID 都不支持动态刷新 - 通过
spring.cloud.nacos.config.shared-dataids
来支持多个共享配置的 Data ID 时, 多个共享配置间的优先级关系由配置出现的先后顺序来决定,即后面的优先级要高于前面 - 通过
spring.cloud.nacos.config.shared-dataids
来配置时,Data ID 必须带文件扩展名,文件扩展名既可支持properties
、yaml/yml
,此时spring.cloud.nacos.config.file-extension
的配置参数对自定义共享配置的 Data ID 文件扩展名没有影响 spring.cloud.nacos.config.refreshable-dataids
配置哪些 Data ID 需要支持动态刷新时,Data ID 的值也必须明确给出文件扩展名
配置加载的优先级
新版的 Nacos Config Spring Cloud 目前提供了三种配置能力从 Nacos 拉取相关的配置,具体如下:
- A: 通过
spring.cloud.nacos.config.shared-configs
支持多个共享 Data ID 的配置 - B: 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data ID 的配置 - C: 通过内部相关规则(应用名 或者 应用名 + Profile),即
${prefix}-${spring.profiles.active}.${file-extension}
规则来自动生成相关的 Data ID 配置 - 当三种方式共同使用时,优先级关系是: A < B < C
完全关闭配置
若希望完全关闭 Nacos Config Spring Cloud,可以通过设置 spring.cloud.nacos.config.enabled=false
来关闭。
Nacos Config Spring Cloud 原理浅析
自动注入
Nacos Config Spring Cloud Starter 实现了 org.springframework.cloud.bootstrap.config.PropertySourceLocator
接口,并将优先级设置成了最高。在 Spring Cloud 应用启动阶段,会主动从 Nacos Server 端获取对应的数据,并将获取到的数据转换成 PropertySource
且注入到 Environment
的 PropertySources
属性中,所以使用 @Value
注解也能直接获取 Nacos Server 端配置的内容。
动态刷新
Nacos Config Spring Cloud Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher
的 refresh()
方法 。如果需要对 Bean 进行动态刷新,给类添加 @RefreshScope
或 @ConfigurationProperties
注解即可。
补充内容
Endpoint 支持
Endpoint 信息查看
Spring Boot 支持这一点,Nacos Config 也可以使用 Endpoint 来暴露信息。在 Maven 中添加 spring-boot-starter-actuator
依赖,并配置端点的访问策略。
- Spring Boot 1.x 中添加端点访问策略的配置
management.security.enabled=false
- Spring Boot 2.x 中添加端点访问策略的配置
management.endpoints.web.exposure.include=*
- Spring Boot 1.x 中 Nacos Config 端点查看的 URL 是
http://127.0.0.1:18084/nacos_config
- Spring Boot 2.x 中 Nacos Config 端点查看的 URL 如下所示,不同 Nacos Config 版本可能有所差异
http://127.0.0.1:18084/actuator/nacosconfig
http://127.0.0.1:18084/actuator/nacos-config
值得一提的是,
http://127.0.0.1:18084/actuator/nacosconfig
的127.0.0.1:18084
是 Spring Cloud 应用(业务)占用的 IP 和端口
Endpoint 配置示例
- 引入 Actuator 依赖
1 | <dependency> |
- 配置端点的访问策略(Spring Boot 2.x)
1 | management: |
端点访问策略配置
management.endpoint.health.show-details=ALWAYS
:何时显示完整的健康信息,默认为NEVER
都不展示。可选WHEN_AUTHORIZED
当经过授权的用户;可选ALWAYS
总是显示。management.endpoints.web.exposure.include=*
:需要开放的端点,默认值只打开health
和info
这两个端点。通过设置*
,可以开放所有端点(生产环境不建议这样配置)。