SpringCloud Nacos 作为Config配置中心,SpringCloud Nacos 配置动态更新
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/