前言 nacos的功能回顾
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
nacos是ali开源的微服务注册中心,其实也是配置中心,详细说明参见:https://nacos.io/zh-cn/docs/what-is-nacos.html。
上一篇中搭建好nacos后,这一篇,学习使用nacos来进行配置中心的功能学习。
一 在项目使用nacos做为配置中心。
Nacos提供用于存储配置和其他元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用Spring Cloud Alibaba Nacos Config就可以在Nacos Server集中管理Spring Cloud应用的外部属性配置;
Spring Cloud Alibaba Nacos config是在启动的bootstrap阶段,将配置加载到Spring环境中;
Spring Cloud Alibaba Nacos Config使用DataId和GROUP确定一个配置;
1 # bootstrap.properties 文件的配置信息 2 #测试 用nacos作为配置中心时的配置信息 3 spring.application.name= alibabacloud_order_consumer 4 5 # 服务注册与服务发现 6 spring.cloud.nacos.discovery.server-addr=192.168.162.2:8848 7 spring.cloud.nacos.discovery.username=nacos 8 spring.cloud.nacos.username=nacos 9 spring.cloud.nacos.password=nacos 10 11 spring.cloud.nacos.config.server-addr=192.168.162.2:8848 12 #千万要注意,这个配置节点,nacos config dataId name. 13 spring.cloud.nacos.config.name=nacos 14 spring.cloud.nacos.config.password=nacos 15 16 spring.cloud.nacos.config.file-extension=properties
注意:
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.username=nacos
这两个配置其实指的都是连接nacos使用的用户名和密码,在启动nacos的默认是这两个值。可以通过源代码跟踪找到。
#千万要注意,这个配置节点,nacos config dataId name.
spring.cloud.nacos.config.name=nacos
而这个就要特别注意了,如果配置了这个,这个表示的是:nacos config dataId,例如,这里写nacos的话,那么在nacos中的配置,就是这样的。这是需要特别注意的地方,当然也可以通过源码看到,配置注释的。实现中特别容易搞错。
二 nacos中的配置信息是基于命名空间和group隔离的
启动好Nacos之后,在Nacos添加如下的配置:
Data ID: nacos 这里如果不写后缀,那么默认为.properties结尾
Group : DEFAULT_GROUP
配置格式: Properties
配置内容:
user.name=zhangsan
user.age=18
DataId是以.properties为扩展名(默认的文件扩展名方式就是.properties);
在运行时必须使用 bootstrap.properties配置文件配置nacos server地址,同时,spring.application.name值必须与Nacos中配置的Data Id匹配(除了.properties或者.yaml后缀);
DataId默认使用`spring.application.name`配置跟文件扩展名结合(配置格式默认使用.properties),GROUP不配置默认使用DEFAULT_GROUP;
注意当你使用域名的方式来访问Nacos时,
spring.cloud.nacos.config.server-addr 配置的方式为 域名:port,例如 Nacos的域名为nacos.power.com,监听的端口为80,
则 spring.cloud.nacos.config.server-addr=nacos.xxx.com:80,注意80 端口不能省略;
如果要在项目中使用Nacos来实现应用的外部化配置,需要添加如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
三 Nacos Config配置中心动态刷新原理分析
Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher的refresh 方法;
可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新
四 多环境支持
a) Nacos Config 除了支持.properties格式以外,也支持yaml格式,这个时候只需要完成以下两步:
1、在应用的bootstrap.properties配置文件中显式地声明DataId文件扩展名;bootstrap.properties文件配置如下:
应用配置:spring.cloud.nacos.config.file-extension=yml
2、在Nacos的web管控台新增一个DataId为yaml扩展名的配置,如下所示:
Data ID: nacos.yml
Group : DEFAULT_GROUP
配置格式: YAML或者yml
配置内容: aa.name: yml-name
aa.age: 100
这里需要注意的是:
1. 如果在程序中有指定了读取的 config dataid,例如: spring.cloud.nacos.config.name=nacos 那么将会读取 nacos.yml的配置节的信息
2. 如果没有指定读取的dataid,那么默认是读取的是微服务名相头的.yml配置节的信息,实现测试中正是如此。
b) 基于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=develop
${spring.profiles.active}当通过配置文件来指定时必须放在 bootstrap.properties文件中;
比如在Nacos上新增一个dataid为:nacos-config-dev.yaml的基础配置,如下所示:
Data ID: nacos-config-deve.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: current.env: dev-env
启动 Spring Boot 应用测试;
如果需要切换到生产环境,只需要更改 ${spring.profiles.active} 参数配置即可,如下所示:
spring.profiles.active=product
实验效果如下:
五 遇到的一些问题
1. 如果我们在 bootstrap.properties/yml和application.properties/yml里面都配置了,spring.application.name= alibabacloud-order-consumer ,那么最终注册的服务名以 application.properties/yml 里面的配置为准,决定了读到nacos中默认的dataid也是这个决定的。
2. 尝试将 spring.application.name= alibabacloud-order-consumer 配置成有使用中横杠时,发现多环境配置,不受影响,与网上很多说无法读取的情况不会出现。可以正常读取。
六 总结
1. nacos作为配置中心,时,需要在bootstrap.yml中配置读取的配置信息 如节点,环境配置,
2. 默认读取的是:dataid 为 ${spring.application.name}.${file-extension:properties} 的nacos中配置的信息。
3. 当我们指定读取的命令空间,多环境时,那么读取的配置信息为:dataid 为 ${spring.application.name}-{profile}.${file-extension:properties} 如果要读取yml的文件配置信息,则还需要指定一下读取的配置的扩展名为yml,即:
spring.cloud.nacos.config.file-extension=yaml