一、SpringCloud Nacos 概述

Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。

官方地址:

  1. https://nacos.io/zh-cn/index.html

官方文档:

  1. https://nacos.io/zh-cn/docs/what-is-nacos.html

Spring官方文档:

  1. https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html

二、SpringCloud Nacos 下载安装启动

见:

  1. https://www.cnblogs.com/fanshuyao/p/14577910.html

三、SpringCloud Nacos 作为服务注册发现中心

见:

  1. https://www.cnblogs.com/fanshuyao/p/14577910.html

官方文档:

  1. https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery

四、SpringCloud Nacos 作为Config配置中心


官方中文文档:

  1. https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html#_spring_cloud_alibaba_nacos_config

英文文档:

  1. 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 解决方案:

  1. https://www.cnblogs.com/fanshuyao/p/14572830.html

SpringCloud Nacos 作为Config配置中心步骤:

1、pom.xml文件引入依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  4. </dependency>
  5. <dependencyManagement>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-dependencies</artifactId>
  10. <version>${spring-cloud.version}</version><!-- Hoxton.SR10 -->
  11. <type>pom</type>
  12. <scope>import</scope>
  13. </dependency>
  14. <dependency>
  15. <groupId>com.alibaba.cloud</groupId>
  16. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  17. <version>2.2.5.RELEASE</version><!-- 当Nacos的版本为:1.4.1,必须使用2.2.5.RELEASE版本,不然Nacos配置在第一次更新后会报错,后面再也更新不了,因为版本不一致导致的 -->
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. </dependencies>
  22. </dependencyManagement>

2、添加bootstrap.properties配置文件

bootstrap文件优先级高于application.properties
注意(都是官方文档说的):
(1)必须使用 bootstrap.properties配置文件来配置 Nacos Server 地址
(2)${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties 文件中。

具体内容是:

  1. #必须使用 bootstrap.properties配置文件来配置 Nacos Server 地址
  2. #${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties 文件中。
  3. #bootstrap.properties,bootstrap文件优先级高于application.properties
  4. #spring.devtools.restart.enabled=false
  5. spring.profiles.active=dev
  6. server.port=8805
  7. spring.application.name=SPRING-CLOUD-NACOS-CONSUMER
  8. #配置nacos服务地址,通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
  9. #单机配置:127.0.0.1:8848
  10. #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
  11. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  12. #服务提供者的服务名,接口调用需要用到
  13. my.nacos.service.name=SPRING-CLOUD-NACOS-SERVICE
  14. #配置中心,相关配置
  15. #配置文件的后缀,默认值是:properties,可以配置成:yaml
  16. spring.cloud.nacos.config.file-extension=properties
  17. #配置文件更新的服务地址
  18. #单机配置:127.0.0.1:8848
  19. #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
  20. spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  21. #完全关闭 Nacos Config 的自动化配置
  22. #spring.cloud.nacos.config.enabled=false
  23. #DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 nacos-config.properties, GROUP 为 DEFAULT_GROUP
  24. #DataId匹配模式
  25. #Nacos DataId的格式:
  26. #${spring.profiles.active}为空时:${spring.application.name}.${file-extension:properties}
  27. #${spring.profiles.active}不为空时:${spring.application.name}-${spring.profiles.active}.${file-extension:properties}
  28. #若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER-dev.properties
  29. #若spring.application.name=myconfig,且无spring.profiles.active配置,则Nacos服务配置的DataId就是:myconfig.properties
  30. #指定特定的DataId配置文件
  31. #从默认的组DEFAULT_GROUP取配置名为aaa.properties进行更新
  32. #如果设置了组:spring.cloud.nacos.config.group,则在Nacos服务配置时,Group属性就必须一致
  33. #spring.cloud.nacos.config.name=aaa.properties
  34. #Group匹配模式:
  35. #当使用spring.cloud.nacos.config.group,在Nacos服务配置时,Group属性就必须一致,而DataId还是原来的匹配规则,只是定义了一个组,只能从该组取,默认的组是DEFAULT_GROUP,没有配置组,就是从默认组取
  36. spring.cloud.nacos.config.group=mygroup
  37. #命名空间(namespace)模式
  38. #Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
  39. #在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
  40. #在命名空间管理,新增自定义命名空间:dev,命名空间ID不用填写,自动生成,保存后把命名空间ID复制,赋值给spring.cloud.nacos.config.namespace
  41. #匹配方式是:
  42. #若spring.application.name=SPRING-CLOUD-NACOS-CONSUMER,且spring.profiles.active=dev,则Nacos服务配置的DataId就是:SPRING-CLOUD-NACOS-CONSUMER.properties,而命名空间的名称就是dev,和spring.profiles.active配置一致
  43. #spring.cloud.nacos.config.namespace=81671a8b-7994-4142-9be9-029360875ad7
  44. #配置的优先级
  45. #Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置
  46. #A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
  47. #B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
  48. #C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
  49. #服务端如何开启鉴权
  50. #当服务端开启鉴权:nacos.core.auth.enabled=true后,客户端访问需要账号和密码,当前的配置,服务注册中心和配置中心都可以正常访问
  51. #服务注册中心、服务配置中心的同时配置的账号和密码
  52. #spring.cloud.nacos.username=nacos
  53. #spring.cloud.nacos.password=nacos
  54. #服务注册中心配置的账号和密码:
  55. #spring.cloud.nacos.discovery.username=nacos
  56. #spring.cloud.nacos.discovery.password=nacos
  57. #服务配置中心的账号和密码:
  58. #spring.cloud.nacos.config.username=nacos
  59. #spring.cloud.nacos.config.password=nacos
  60. #配置如下:
  61. #spring.cloud.nacos.username=nacos
  62. #spring.cloud.nacos.password=nacos
  63. #测试配置的值
  64. config.text=1

3、application.properties配置文件修改

测试bootstrap文件优先级高于application.properties,application.properties配置的属性,会覆盖bootstrap.properties的属性,因为bootstrap.properties先加载。

  1. #测试配置的值
  2. config.text=application.properties-1

4、启动类


加上@EnableDiscoveryClient注解

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  4. /**
  5. * 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
  6. *
  7. */
  8. @SpringBootApplication
  9. @EnableDiscoveryClient
  10. public class SpringCloud8805NacosWebApplication {
  11. public static void main(String[] args) {
  12. SpringApplication.run(SpringCloud8805NacosWebApplication.class, args);
  13. }
  14. }

5、Controller请求类


加上@RefreshScope,实现Nacos配置文件的动态刷新,不加不会刷新。
@RefreshScope不能配置在启动类上,无效果。
@RefreshScope作用域是:ElementType.TYPE, ElementType.METHOD

实现配置文件:config.text=xxx的动态更新

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.cloud.context.config.annotation.RefreshScope;
  4. import org.springframework.http.MediaType;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. import com.lqy.springCloud.Result;
  10. //@RefreshScope:实现Nacos配置文件的动态刷新,不能配置在启动类上,无效果,作用域是:ElementType.TYPE, ElementType.METHOD
  11. @RefreshScope
  12. @RestController
  13. @RequestMapping("/web")
  14. public class WebController {
  15. @Value("${config.text}")
  16. private String configText;
  17. @RequestMapping(value="/config", produces = MediaType.APPLICATION_JSON_VALUE)
  18. public Result config() {
  19. return Result.ok(configText);
  20. }
  21. }

五、SpringCloud Nacos Config配置中心动态更新

1、启动Nacos Server


在bin路径(D:\0soft\nacos-server-1.4.1\nacos\bin)打开cmd命令窗口,输入下面的命令启动:

  1. startup.cmd -m standalone

2、浏览器打开Nacos Server控制台

  1. http://127.0.0.1:8848/nacos

登录名:nacos
密码:nacos

3、配置管理


展开【配置管理】,点击【配置列表】,在最右边有一个加号的添加按钮,添加相应的配置

Springcloud Nacos 配置 - 图1

Springcloud Nacos 配置 - 图2

六、项目实现配置文件动态刷新,bootstrap.properties增加配置

  1. #配置文件的后缀,默认值是:properties,可以配置成:yaml
  2. spring.cloud.nacos.config.file-extension=properties
  3. #配置文件更新的服务地址
  4. #单机配置:127.0.0.1:8848
  5. #集群配置:192.168.170.11:8848,192.168.170.12:8848,192.168.170.13:8848
  6. 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的格式:

  1. ${spring.profiles.active}为空时:${spring.application.name}.${file-extension:properties}
  2. ${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属性就必须一致

  1. spring.cloud.nacos.config.name=aaa.properties

2、支持自定义 Group 的配置

当使用spring.cloud.nacos.config.group,在Nacos服务配置时,Group属性就必须一致,而DataId还是原来的匹配规则,只是定义了一个组,只能从该组取,默认的组是DEFAULT_GROUP,没有自定义组,就是从默认组取

  1. 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配置一致

  1. spring.cloud.nacos.config.namespace=81671a8b-7994-4142-9be9-029360875ad7

4、支持自定义扩展的 Data Id 配置


Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示:

  1. spring.application.name=opensource-service-provider
  2. spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  3. # config external configuration
  4. # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
  5. spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
  6. # 2、Data Id 不在默认的组,不支持动态刷新
  7. spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
  8. spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
  9. # 3、Data Id 既不在默认的组,也支持动态刷新
  10. spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
  11. spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
  12. 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

  1. spring.cloud.nacos.config.enabled=false

九、Nacos Config Starter 更多的配置项信息

  1. spring.cloud.nacos.config.server-addr
  2. 服务端地址
  3. Nacos Server 启动监听的ip地址和端口
  4. spring.cloud.nacos.config.name
  5. 配置对应的 DataId
  6. 先取 prefix,再去 name,最后取 spring.application.name
  7. spring.cloud.nacos.config.prefix
  8. 配置对应的 DataId
  9. 先取 prefix,再去 name,最后取 spring.application.name
  10. spring.cloud.nacos.config.encode
  11. 配置内容编码
  12. 读取的配置内容对应的编码
  13. spring.cloud.nacos.config.group
  14. GROUP
  15. 默认是:DEFAULT_GROUP,配置对应的组
  16. spring.cloud.nacos.config.fileExtension
  17. 文件扩展名
  18. 默认是:properties,配置项对应的文件扩展名,目前支持 properties yaml(yml)
  19. spring.cloud.nacos.config.timeout
  20. 获取配置超时时间
  21. 默认是:3000,客户端获取配置的超时时间(毫秒)
  22. spring.cloud.nacos.config.endpoint
  23. 接入点
  24. 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
  25. spring.cloud.nacos.config.namespace
  26. 命名空间
  27. 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
  28. spring.cloud.nacos.config.accessKey
  29. AccessKey,当要上阿里云时,阿里云上面的一个云账号名
  30. spring.cloud.nacos.config.secretKey
  31. SecretKey,当要上阿里云时,阿里云上面的一个云账号密码
  32. spring.cloud.nacos.config.contextPath
  33. Nacos Server 对应的 context pathNacos Server 对外暴露的 context path
  34. spring.cloud.nacos.config.clusterName
  35. 集群,配置成Nacos集群名称
  36. spring.cloud.nacos.config.sharedDataids
  37. 共享配置,共享配置的 DataId, "," 分割
  38. spring.cloud.nacos.config.refreshableDataids
  39. 共享配置动态刷新,共享配置中需要动态刷新的 DataId, "," 分割
  40. spring.cloud.nacos.config.extConfig
  41. 自定义 Data Id 配置,属性是个集合,内部由 Config POJO 组成。Config 3 个属性,分别是 dataId, group 以及 refresh

十、Nacos服务端开启鉴权


当服务端开启鉴权:nacos.core.auth.enabled=true后,客户端访问需要账号和密码,当前的配置,服务注册中心和配置中心都可以正常访问

服务注册中心、服务配置中心的同时配置的账号和密码(已经验证)

  1. spring.cloud.nacos.username=nacos
  2. spring.cloud.nacos.password=nacos

仅服务注册中心配置的账号和密码(未验证):

  1. #spring.cloud.nacos.discovery.username=nacos
  2. #spring.cloud.nacos.discovery.password=nacos

仅服务配置中心的账号和密码(未验证):

  1. #spring.cloud.nacos.config.username=nacos
  2. #spring.cloud.nacos.config.password=nacos

十一、Nacos Config 对外暴露的 Endpoint


Nacos Config 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacos-config。

Endpoint 暴露的 json 中包含了三种属性:
Sources: 当前应用配置的数据信息
RefreshHistory: 配置刷新的历史记录
NacosConfigProperties: 当前应用 Nacos 的基础配置信息