在微服务的多环境开发中,使用Nacos配置,从开发、测试、到部署,都可以带来很大的便利性。一般来说,一个公司有多个项目,一个项目由多个微服务组成,并且会有开发、测试、生产环境的区分。而Nacos在配置管理这方面做得还是比较好的,它可以通过namespace(命名空间)、group(分组)和data-id进行配置文件的唯一性定位。
动态配置
1.引入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.添加配置:
注意,使用了nacos的配置管理,那么代码里面的配置文件名称不能是application,而是bootstrap,因为bootstrap加载的优先级更高。这里主要指明了配置中心的地址和在nacos上配置文件的格式:
spring:
application:
name: nacos-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
3.到nacos上添加配置:dataId为nacos-client-dev.yaml
其中dataId的命令是有规则的,官网解释如下:
但是这种配置的优先级是没有bootstrap配置高,一般用它来做当前服务独有的配置,而将公共的配置抽取出来:
spring:
application:
name: nacos-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# 共享配置的DataId,多个使用,分隔
# 越靠后,优先级越高
# .yaml后缀不能少,只支持yaml/properties
shared-dataids: common.yaml,common2.yaml
# 哪些共享配置支持动态刷新,多个使用,分隔
refreshable-dataids: common2.yaml
主要是添加了共享配置:shared-dataids和refreshable-dataids两个配置项,它们的优先级,我测试的时候,发现比bootstrap配置高。除了shared-dataids和refreshable-dataids两个配置项实现公用的配置之外,还可以使用拓展配置,它的效果是一样的,并且它的优先级比共享配置更高:
spring:
application:
name: nacos-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# 共享配置的DataId,多个使用,分隔
# 越靠后,优先级越高
# .yaml后缀不能少,只支持yaml/properties
shared-dataids: common.yaml
# 哪些共享配置支持动态刷新,多个使用,分隔
refreshable-dataids: common.yaml
# 拓展配置,越后面的配置,优先级越高,nacos-client-dev.yaml的优先级最低
ext-config:
- data-id: common2.yaml
#默认数据不会主动刷新,添加改属性会动态刷新
refresh: true
配置了refreshable-dataids或者refresh: true等属性之后,还需要@RefreshScope注解,才能实现动态刷新,如下示例,当在nacos配置改变发布之后,过了几秒便可以看到新的属性值:
环境和项目的隔离
所谓的环境,指的是开发、测试、生产等环境,在多项目,多个微服务下,区分不同配置,结合在工作中的使用情况,一般有以下几种隔离方式:
- namespace(命名空间)作为环境的隔离,比如使用dev、test和prod三个命名空间,group(分组)作为项目的隔离,每个项目一个分组,dataId作为微服务的区分
- namespace(命名空间)作为项目的隔离,group(分组)作为环境的隔离,每个项目一个都有自己的dev、test和prod环境,dataId作为微服务的区分
我个人是比较倾向于使用第一种方式的,首先是划分清晰,其次是项目多的时候也更容易管理。