在多环境多项目管理时,也就是实际开发中,通常一个系统会准备不同的开发环境,如dev开发环境、test测试环境、prod生产环境,如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境等,那对这些微服务配置该如何管理呢?=> 在Nacos配置中心中就可以进行分类配置,一个配置文件的具体所属由 namespace + Group + dataId 所构成:
为什么如此设计?
这种设计就类似于Java中的包名和类名,最外层的 namespace 是可以用于区分部署环境的,主要用来实现隔离,比如有三个环境:开发、测试、生产,那就可以创建三个 namespace。
Group 和 dataId 逻辑上区分两个目标对象。Group可以把不同的微服务划分到同一个分组里面去。Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFALUT,Cluster是对指定微服务的一个虚拟划分。
举例:比如说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称HZ,给广州机房的Service微服务起一个集群名字GZ,还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后就是Instance,就是微服务的实例。
默认情况下 namespace 的值为 public, Group 的值为 DEFAULT_GROUP,默认Cluster是DEFAULT。
下面对这三个属性进行详细展开。
dataId 方案
指定 spring.profile.active 配置属性和配置文件的 dataId 来使不同环境下读取不同的配置,也就是说我们现在用默认的命名空间 namespace (即 public),默认的分组 Group (即 DEFAULT_GROUP),然后在Nacos配置中心中建立两个 dataId 分别为 dev 环境和test环境。此时在同一命名空间同一组中就有了两个应用于开发、测试不同环境的配置文件:
然后我们通过修改微服务自己定制配置信息 application.yml 配置文件中的spring.profile.active 属性即可进行多环境下的配置文件的读取,配置什么就加载什么,在之前我们的3377微服务获取的是配置中心中 nacos-config-client-dev.yaml 配置文件的配置信息,现在我们将 application.yml 修改为:
spring: profiles: # active: dev # 表示开发环境 active: test # 表示开发环境然后重启3377微服务,再次进行测试发现访问到的配置信息为测试环境的配置信息:
Group 方案
不仅通过 dataId 可以实现环境分区,应用 Group 也可以实现环境分区,首先我们在Nacos配置中心新建两个相同 dataId,不同 Group 的配置文件,一个用于开发环境,一个用于测试环境:
由于这两个配置文件的 dataId 均为 nacos-config-client-info.yaml ,根据之前解释的 dataId 的命名规则,我们应该将3377微服务的自定义配置文件 application.yml 中的 spring.profile.active 属性更改为 info:
spring: profiles: active: info在确认了读取的配置文件的 dataId 后,我们在其 bootstrap.yml 配置文件中添加 spring.cloud.nacos.config.group 属性,设置为相应的组名即可,比如我们现在设置为测试环境组:
spring: cloud: nacos: config: group: TEST_GROUP重启3377微服务,再次访问可以发现获取到的配置信息即为TEST_GROUP组的配置信息。
namespace 方案
根据namespace同样可以进行环境区分。
新建两个命名空间
服务列表查看
在 bootstrap.yml 配置文件中添加 spring.cloud.nacos.config.namespace 属性,设置为相应的命名空间流水号即可,比如我们现在设置为开发环境命名空间:
spring: cloud: nacos: config: namespace: 5e4fbf07-10f3-4216-86c5-e40391667310在dev命名空间下新建不同group的配置文件