赞
踩
SpringCloud Nacos 作为Config配置中心,SpringCloud Nacos 配置动态更新
================================
©Copyright 蕃薯耀 2021-03-29
https://www.cnblogs.com/fanshuyao/
一、SpringCloud Nacos 概述
Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。
官方地址:
https://nacos.io/zh-cn/index.html
官方文档:
https://nacos.io/zh-cn/docs/what-is-nacos.html
Spring官方文档:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
二、SpringCloud Nacos 下载安装启动
见:
https://www.cnblogs.com/fanshuyao/p/14577910.html
三、SpringCloud Nacos 作为服务注册发现中心
见:
https://www.cnblogs.com/fanshuyao/p/14577910.html
官方文档:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery
四、SpringCloud Nacos 作为Config配置中心
官方中文文档:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html#_spring_cloud_alibaba_nacos_config
英文文档:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_config
Nacos1.4.1报错: longPolling error ,java.util.concurrent.RejectedExecutionException 解决方案:
https://www.cnblogs.com/fanshuyao/p/14572830.html
SpringCloud Nacos 作为Config配置中心步骤:
1、pom.xml文件引入依赖
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- </dependency>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version><!-- Hoxton.SR10 -->
- <type>pom</type>
- <scope>import</scope>
- </dependency>
-
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-dependencies</artifactId>
- <version>2.2.5.RELEASE</version><!-- 当Nacos的版本为:1.4.1,必须使用2.2.5.RELEASE版本,不然Nacos配置在第一次更新后会报错,后面再也更新不了,因为版本不一致导致的 -->
- <type>pom</type>
- <scope>import</scope>
- </dependency>
-
- </dependencies>
- </dependencyManagement>
2、添加bootstrap.properties配置文件
bootstrap文件优先级高于application.properties
注意(都是官方文档说的):
(1)必须使用 bootstrap.properties配置文件来配置 Nacos Server 地址
(2)${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties 文件中。
具体内容是:
- #必须使用 bootstrap.properties配置文件来配置 Nacos Server 地址
- #${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties 文件中。
-
- #bootstrap.properties,bootstrap文件优先级高于application.properties
-
- #spring.devtools.restart.enabled=false
-
- spring.profiles.active=dev
- server.port=8805
-
- spring.application.name=SPRING-CLOUD-NACOS-CONSUMER
-
- #配置nacos服务地址,通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
- #单机配置:127.0.0.1:8848
- #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
-
-
- #服务提供者的服务名,接口调用需要用到
- my.nacos.service.name=SPRING-CLOUD-NACOS-SERVICE
-
- #配置中心,相关配置
- #配置文件的后缀,默认值是:properties,可以配置成:yaml
- spring.cloud.nacos.config.file-extension=properties
- #配置文件更新的服务地址
- #单机配置:127.0.0.1:8848
- #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
- spring.cloud.nacos.config.server-addr=127.0.0.1:8848
- #完全关闭 Nacos Config 的自动化配置
- #spring.cloud.nacos.config.enabled=false
-
- #DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 nacos-config.properties, GROUP 为 DEFAULT_GROUP
-
- #DataId匹配模式
- #Nacos DataId的格式:
- #${spring.profiles.active}为空时:${spring.application.name}.${file-extension:properties}
- #${spring.profiles.active}不为空时:${spring.application.name}-${spring.profiles.active}.${file-extension:properties}
- #若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER-dev.properties
- #若spring.application.name=myconfig,且无spring.profiles.active配置,则Nacos服务配置的DataId就是:myconfig.properties
-
- #指定特定的DataId配置文件
- #从默认的组DEFAULT_GROUP取配置名为aaa.properties进行更新
- #如果设置了组:spring.cloud.nacos.config.group,则在Nacos服务配置时,Group属性就必须一致
- #spring.cloud.nacos.config.name=aaa.properties
-
- #Group匹配模式:
- #当使用spring.cloud.nacos.config.group,在Nacos服务配置时,Group属性就必须一致,而DataId还是原来的匹配规则,只是定义了一个组,只能从该组取,默认的组是DEFAULT_GROUP,没有配置组,就是从默认组取
- spring.cloud.nacos.config.group=mygroup
-
- #命名空间(namespace)模式
- #Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
- #在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
- #在命名空间管理,新增自定义命名空间:dev,命名空间ID不用填写,自动生成,保存后把命名空间ID复制,赋值给spring.cloud.nacos.config.namespace
- #匹配方式是:
- #若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER.properties,而命名空间的名称就是dev,和spring.profiles.active配置一致
- #spring.cloud.nacos.config.namespace=81671a8b-7994-4142-9be9-029360875ad7
-
- #配置的优先级
- #Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置
- #A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
- #B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
- #C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
-
- #服务端如何开启鉴权
- #当服务端开启鉴权:nacos.core.auth.enabled=true后,客户端访问需要账号和密码,当前的配置,服务注册中心和配置中心都可以正常访问
- #服务注册中心、服务配置中心的同时配置的账号和密码
- #spring.cloud.nacos.username=nacos
- #spring.cloud.nacos.password=nacos
- #服务注册中心配置的账号和密码:
- #spring.cloud.nacos.discovery.username=nacos
- #spring.cloud.nacos.discovery.password=nacos
- #服务配置中心的账号和密码:
- #spring.cloud.nacos.config.username=nacos
- #spring.cloud.nacos.config.password=nacos
- #配置如下:
- #spring.cloud.nacos.username=nacos
- #spring.cloud.nacos.password=nacos
-
-
- #测试配置的值
- config.text=1
3、application.properties配置文件修改
测试bootstrap文件优先级高于application.properties,application.properties配置的属性,会覆盖bootstrap.properties的属性,因为bootstrap.properties先加载。
- #测试配置的值
- config.text=application.properties-1
4、启动类
加上@EnableDiscoveryClient注解
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-
- /**
- * 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
- *
- */
- @SpringBootApplication
- @EnableDiscoveryClient
- public class SpringCloud8805NacosWebApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(SpringCloud8805NacosWebApplication.class, args);
- }
-
- }
5、Controller请求类
加上@RefreshScope,实现Nacos配置文件的动态刷新,不加不会刷新。
@RefreshScope不能配置在启动类上,无效果。
@RefreshScope作用域是:ElementType.TYPE, ElementType.METHOD
实现配置文件:config.text=xxx的动态更新
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.cloud.context.config.annotation.RefreshScope;
- import org.springframework.http.MediaType;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
-
- import com.lqy.springCloud.Result;
-
- //@RefreshScope:实现Nacos配置文件的动态刷新,不能配置在启动类上,无效果,作用域是:ElementType.TYPE, ElementType.METHOD
- @RefreshScope
- @RestController
- @RequestMapping("/web")
- public class WebController {
-
- @Value("${config.text}")
- private String configText;
-
-
- @RequestMapping(value="/config", produces = MediaType.APPLICATION_JSON_VALUE)
- public Result config() {
- return Result.ok(configText);
- }
-
- }
五、SpringCloud Nacos Config配置中心动态更新
1、启动Nacos Server
在bin路径(D:\0soft\nacos-server-1.4.1\nacos\bin)打开cmd命令窗口,输入下面的命令启动:
startup.cmd -m standalone
2、浏览器打开Nacos Server控制台
http://127.0.0.1:8848/nacos
登录名:nacos
密码:nacos
3、配置管理
展开【配置管理】,点击【配置列表】,在最右边有一个加号的添加按钮,添加相应的配置
六、项目实现配置文件动态刷新,bootstrap.properties增加配置
- #配置文件的后缀,默认值是:properties,可以配置成:yaml
- spring.cloud.nacos.config.file-extension=properties
-
- #配置文件更新的服务地址
- #单机配置:127.0.0.1:8848
- #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
- spring.cloud.nacos.config.server-addr=127.0.0.1:8848
七、SpringCloud Nacos Config配置DataId配置规则
DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 nacos-config.properties, GROUP 为 DEFAULT_GROUP
1、支持DataId匹配模式的配置
Nacos DataId的格式:
- ${spring.profiles.active}为空时:${spring.application.name}.${file-extension:properties}
- ${spring.profiles.active}不为空时:${spring.application.name}-${spring.profiles.active}.${file-extension:properties}
具体示例:
若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER-dev.properties
若spring.application.name=myconfig,且无spring.profiles.active配置,则Nacos服务配置的DataId就是:myconfig.properties
指定特定的DataId配置文件
从默认的组DEFAULT_GROUP取配置名为aaa.properties进行更新
如果设置了组:spring.cloud.nacos.config.group,则在Nacos服务配置时,Group属性就必须一致
spring.cloud.nacos.config.name=aaa.properties
2、支持自定义 Group 的配置
当使用spring.cloud.nacos.config.group,在Nacos服务配置时,Group属性就必须一致,而DataId还是原来的匹配规则,只是定义了一个组,只能从该组取,默认的组是DEFAULT_GROUP,没有自定义组,就是从默认组取
spring.cloud.nacos.config.group=mygroup
3、支持自定义 namespace 的配置
Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
在命名空间管理,新增自定义命名空间:dev,命名空间ID不用填写,自动生成,保存后把命名空间ID复制,赋值给spring.cloud.nacos.config.namespace
匹配方式是:
若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER.properties,而命名空间的名称就是dev,和spring.profiles.active配置一致
spring.cloud.nacos.config.namespace=81671a8b-7994-4142-9be9-029360875ad7
4、支持自定义扩展的 Data Id 配置
Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示:
- spring.application.name=opensource-service-provider
- spring.cloud.nacos.config.server-addr=127.0.0.1:8848
-
- # config external configuration
- # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
- spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
-
- # 2、Data Id 不在默认的组,不支持动态刷新
- spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
- spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
-
- # 3、Data Id 既不在默认的组,也支持动态刷新
- spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
- spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
- spring.cloud.nacos.config.ext-config[2].refresh=true
可以看到:
通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。
通过 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
注意:多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。
此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
5、配置的优先级
Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置
A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
八、完全关闭 Nacos Config 的自动化配置
通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config
spring.cloud.nacos.config.enabled=false
九、Nacos Config Starter 更多的配置项信息
- spring.cloud.nacos.config.server-addr
- 服务端地址
- Nacos Server 启动监听的ip地址和端口
-
- spring.cloud.nacos.config.name
- 配置对应的 DataId
- 先取 prefix,再去 name,最后取 spring.application.name
-
- spring.cloud.nacos.config.prefix
- 配置对应的 DataId
- 先取 prefix,再去 name,最后取 spring.application.name
-
- spring.cloud.nacos.config.encode
- 配置内容编码
- 读取的配置内容对应的编码
-
- spring.cloud.nacos.config.group
- GROUP
- 默认是:DEFAULT_GROUP,配置对应的组
-
- spring.cloud.nacos.config.fileExtension
- 文件扩展名
- 默认是:properties,配置项对应的文件扩展名,目前支持 properties 和 yaml(yml)
-
- spring.cloud.nacos.config.timeout
- 获取配置超时时间
- 默认是:3000,客户端获取配置的超时时间(毫秒)
-
- spring.cloud.nacos.config.endpoint
- 接入点
- 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
-
- spring.cloud.nacos.config.namespace
- 命名空间
- 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
-
- spring.cloud.nacos.config.accessKey
- AccessKey,当要上阿里云时,阿里云上面的一个云账号名
-
- spring.cloud.nacos.config.secretKey
- SecretKey,当要上阿里云时,阿里云上面的一个云账号密码
-
- spring.cloud.nacos.config.contextPath
- Nacos Server 对应的 context path,Nacos Server 对外暴露的 context path
-
- spring.cloud.nacos.config.clusterName
- 集群,配置成Nacos集群名称
-
- spring.cloud.nacos.config.sharedDataids
- 共享配置,共享配置的 DataId, "," 分割
-
- spring.cloud.nacos.config.refreshableDataids
- 共享配置动态刷新,共享配置中需要动态刷新的 DataId, "," 分割
-
- spring.cloud.nacos.config.extConfig
- 自定义 Data Id 配置,属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh
十、Nacos服务端开启鉴权
当服务端开启鉴权:nacos.core.auth.enabled=true后,客户端访问需要账号和密码,当前的配置,服务注册中心和配置中心都可以正常访问
服务注册中心、服务配置中心的同时配置的账号和密码(已经验证)
- spring.cloud.nacos.username=nacos
- spring.cloud.nacos.password=nacos
仅服务注册中心配置的账号和密码(未验证):
- #spring.cloud.nacos.discovery.username=nacos
- #spring.cloud.nacos.discovery.password=nacos
仅服务配置中心的账号和密码(未验证):
- #spring.cloud.nacos.config.username=nacos
- #spring.cloud.nacos.config.password=nacos
十一、Nacos Config 对外暴露的 Endpoint
Nacos Config 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacos-config。
Endpoint 暴露的 json 中包含了三种属性:
Sources: 当前应用配置的数据信息
RefreshHistory: 配置刷新的历史记录
NacosConfigProperties: 当前应用 Nacos 的基础配置信息
(时间宝贵,分享不易,捐赠回馈,^_^)
================================
©Copyright 蕃薯耀 2021-03-29
https://www.cnblogs.com/fanshuyao/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。