Nacos多环境配置
在开发过程中,我们的项目会存在不同的运行环境,比如开发环境、测试环境、生产环境,而我们的项目在不同的环境中,有的配置可能会不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置,那每次我们将软件部署到不同的环境时,都需要修改相应的配置文件,这样来回修改,很容易出错,而且浪费劳动力。
Nacos除了可以做注册中心,也可以做统一配置管理(配置中心),Nacos提供了一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
微服务要拉取Nacos中管理的配置,并且与本地的application.properties配置合并,才能完成项目启动,否则项目启动时就会报错。
但是现在有个问题:未读取application.properties,又如何得知nacos地址呢?
Spring引入了一种新的配置文件:bootstrap.properties文件,会在application.properties之前被读取。
1.DataID方案
在springboot配置文件中指定spring.profile.active和Nacos配置中心的DataID来使不同环境下读取不同的配置。
1.1 Nacos配置中心
在Nacos页面中配置管理的配置列表创建配置:
DataID完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。因此prefix的名字需要与项目配置文件中spring.application.name 的值保持一致。
spring.profiles.active 即为当前环境对应的 profile,例如开发环境为dev,测试环境为test,生产环境为prod等。 因此这里的值需要与项目配置文件中的spring.profiles.active的值保持一致。注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 𝑝𝑟𝑒𝑓𝑖𝑥.{file-extension}。
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。支持 properties 、 yaml 和 yml 类型。
Group:分组,默认为DEFAULT_GROUP。
配置格式:目前,Springboot中能识别的配置格式只支持YAML和Properties两个格式。
配置内容:根据自己需要配置的内容进行配置。
1.2 springboot配置
引入nacos-config依赖
<!-- 配置中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
创建bootstrap.properties
#注册中心地址 spring.cloud.nacos.config.server-addr=localhost:8848 #与配置中心DataID的prefix一致 spring.cloud.nacos.config.prefix=productor ##与配置中心DataID的file-exetension一致 spring.cloud.nacos.config.file-extension=properties #与配置中心DataID的spring.profiles.active一致 spring.profiles.active=dev
启动springboot项目,使用postman通过消费者远程访问接口,可以成功返回结果:
2.GROUP方案
我们知道Group为分组,默认为:DEFAULT_GROUP,现在我们在Nacos分出两组,一组是“Dev开发组”,一组是“test测试组”
2.1 Nacos配置中心
2.2 springboot配置
微服务根据指定分组为dev或test进行切换。
启动springboot项目,使用postman通过消费者远程访问接口,可以成功返回结果:
3.命名空间方案
我们创建命名空间, 通过切换对应的命名空间,然后再通过Group和DataID来进行切换,即可以按照Namespace+Group+DataId来切换使用不同的配置文件。
3.1 Nacos配置中心
3.1.1 创建命名空间
在Nacos页面点击命名空间,点击创建命名空间
输入要新建的空间名,点击确定
点击服务列表和配置列表,查看多出一个命名空间
3.1.2 配置中心新增配置文件
在test命名空间下新建配置
添加配置项:
在此,我们可以定义不同的GROUP及DataID,实现Namespace+Group+DataId来切换不同的配置文件。
3.2 springboot配置
在bootstrap.properties文件中配置namespace、group及DataID
#注册中心地址 spring.cloud.nacos.config.server-addr=localhost:8848
#与配置中心DataID的prefix一致 spring.cloud.nacos.config.prefix=productor ##与配置中心DataID的file-exetension一致
spring.cloud.nacos.config.file-extension=properties spring.cloud.nacos.config.group=TEST_GROUP
#与配置中心DataID的spring.profiles.active一致
spring.profiles.active=test spring.cloud.nacos.config.namespace=5f8d56ea-111b-46e6-9edb-68bf92b9706b
启动springboot项目,使用postman通过消费者远程访问接口,可以成功返回结果:
4.权限控制+命名空间方案
在命名空间基础上,添加用户权限控制,可根据不同用户拉取该用户所拥有的不同命名空间的配置。
4.1 权限控制
4.1.1 开启权限控制
在nacos目录的conf文件夹下编辑application.properties,设置:
nacos.core.auth.enabled=true
4.1.2 创建自定义用户
在Nacos页面上点击用户列表,在列表页面点击创建用户
输入用户名和密码,点击确定完成用户创建。
4.1.3 创建角色
在Nacos页面上点击角色管理,在管理页面点击绑定角色
角色名可以自定义输入任意的名称,用户名输入已经创建的用户,点击确定完成。
4.1.4 创建权限
在Nacos页面上点击权限管理,在管理页面点击添加权限
角色名:已经创建的角色
资源:已经创建的命名空间
动作:只读(r)、只写(w)、读写(rw)
点击确定按钮,完成权限添加。
在nacos页面上退出账号,以新创建的账号登录:
当访问配置列表和服务列表的public时,提示权限认证失败,此时配置列表中public命名空间的配置文件不能进行读写。
4.1.5 创建命名空间的配置文件
根据命名空间方案(文中第3中方案)创建配置文件,以test命名空间为例,创建test命名空间,在test命名空间下创建配置文件。
4.2 springboot配置
在bootstrap.properties中添加test的用户名、密码、命名空间配置
#注册中心地址 spring.cloud.nacos.config.server-addr=localhost:8848
#与配置中心DataID的prefix一致 spring.cloud.nacos.config.prefix=productor #
#与配置中心DataID的file-exetension一致
spring.cloud.nacos.config.file-extension=properties spring.cloud.nacos.config.group=TEST_GROUP
#与配置中心DataID的spring.profiles.active一致
spring.profiles.active=test spring.cloud.nacos.config.namespace=5f8d56ea-111b-46e6-9edb-68bf92b9706b spring.cloud.nacos.username=test spring.cloud.nacos.password=123456
由于在Nacos中给test用户分配了test命名空间,所以需要在application.properties中添加test的命名空间配置,在bootstrap.properties中已经配置nacos的用户名和密码,在这里可不配置,用户名默认使用spring.cloud.nacos.username,密码默认使用spring.cloud.nacos.password。
spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.discovery.service=${spring.application.name} spring.cloud.nacos.discovery.namespace=${spring.cloud.nacos.config.namespace}
4.3 测试
启动springboot项目,使用postman通过消费者远程访问接口,可以成功返回结果:
将bootstrap.properties中的group、active修改为dev,启动springboot项目则报错:
该现象说明当group、active修改为dev后,test用户没有权限访问,不能拉取nacos中dev命名空间下的配置文件,导致springboot项目启动获取配置文件中的配置项时失败。