在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
如果微服务架构中没有使用统一配置中心时,所存在的问题:
-
配置文件分散在各个项目里,不方便维护
-
配置内容安全与权限
-
更新配置后,项目需要重启
nacos配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动
nacos与 Spring Cloud的整合:
${prefix}-${spring.profile.active}.${file-extension}
-
-
spring.profile.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
-
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型;默认为properties
;
官方文档:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
2.配置内容:
项目中易变的内容
添加依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.1.2.RELEASE</version> </dependency>
版本说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
spring: cloud: nacos: server-addr: 127.0.0.1:8848 # 该配置影响统一配置中心中的dataId,之前已经配置过 application: name: nacos-provider
注意:bootstrap.yml添加了spring.application.name,在appliation.yml不需要再添加;
@RefreshScope @RestController public class ProviderController { @Value("${DevConfig}") private String devConfig; @GetMapping("invoke") public String invoke() { return LocalTime.now() + " invoke,devConfig:" + devConfig; } }
调用结果:
在实际开发中,通常有多套不同的环境(默认只有public),那么这个时候可以根据指定的环境来创建不同的 namespce,例如,开发、测试和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。以此来实现多环境的隔离;
可以发现有四个名称空间:public(默认)以及我们自己添加的3个名称空间(prod、dev、test),可以点击查看每个名称空间下的配置文件,当然现在只有public下有一个配置。
默认情况下,项目会到public下找
接下来,在dev名称空间中也添加一个nacos-provider.properties配置。这时有两种方式:
-
切换到dev名称空间,添加一个新的配置文件。缺点:每个环境都要重复配置类似的项目
-
直接通过clone方式添加配置,并修改即可(推荐)
编辑
在服务提供方nacos-provider中切换命名空间,修改bootstrap.yml添加如下配置
spring: cloud: nacos: config: namespace: 288ad42c-c8e0-4b92-b8df-7d7883ad8507
namespace的值为:
重启服务,调用结果:
nacos-provider.properties默认加载,怎么加载另外两个配置文件?
在bootstrap.yml文件中添加如下配置:
spring: cloud: nacos: server-addr: 127.0.0.1:8848 config: extension-configs: - refresh: true data-id: redis.properties - refresh: true data-id: jdbc.properties
修改上面的代码:
@RefreshScope @RestController public class ProviderController { @Value("${DevConfig}") private String devConfig; @Value("${jdbc.url}") private String jdbcUrl; @Value("${redis.url}") private String redisUrl; @GetMapping("invoke") public String invoke() { return LocalTime.now() + " invoke,devConfig:" + devConfig + ",jdbcUrl:" + jdbcUrl + ",redisUrl:" + redisUrl; } }
在实际开发中,除了不同的环境外。不同的微服务或者业务功能,可能有不同的redis及mysql数据库,也就说每个微服务项目可能会有相应的开发环境,测试环境,预发环境,生产环境等;
区分不同的环境我们使用名称空间(namespace),区分不同的微服务或功能,使用分组(group)。
也可以反过来使用,名称空间和分组只是为了更好的区分配置,提供的两个维度而已;
新增一个redis.properties,所属分组为nacos-provider:
现在开发环境中有两个redis.propertis配置文件,一个是默认分组(DEFAULT_GROUP),一个是provider组
默认情况下从DEFAULT_GROUP分组中读取redis.properties,如果要切换到nacos-provider分组下的redis.properties,需要修改如下配置:
spring: cloud: nacos: server-addr: 127.0.0.1:8848 config: extension-configs: - refresh: true group: nacos-provider data-id: redis.properties - refresh: true data-id: jdbc.properties