乐趣区

Nacos五多环境下如何读取Nacos中相应的配置

前言

前景回顾:

  • Nacos(四):SpringCloud 项目中接入 Nacos 作为配置中心
  • Nacos(三):Nacos 与 OpenFeign 的对接使用
  • Nacos(二):SpringCloud 项目中接入 Nacos 作为注册中心

通过前面几篇介绍,已经基本了解了 Nacos 做为注册中心和配置中心的基本用法。

在实际开发中,通常一个系统会准备开发环境、测试环境、预发环境、正式环境

那么如何保证指定环境启动时服务能正确读取到 Nacos 上相应环境的配置文件呢

本文主要对 Nacos 作为配置中心时,如何对多环境配置文件进行读取进行论述。

我的环境

  • Windows10
  • JDK8
  • SpringCloud:Finchley.RELEASE
  • SpringBoot:2.0.4.RELEASE
  • spring-cloud-alibaba-dependencies:0.2.2.RELEASE
  • Nacos-server:1.0.1

本文的项目 Demo 继续沿用 Nacos(四)中的工程nacos-config, 若小伙伴还没有之前的环境,可至源码地址中下载

Data ID 方案

在上一篇文章中有对 Data ID 进行过介绍,它的命名规则为:${prefix}-${spring.profile.active}.${file-extension}

通过其中的 spring.profile.active 属性即可进行多环境下配置文件的读取

一起来试一下吧~

新建配置

1、启动 Nacos-Server 后,创建配置文件 Data ID 为:nacos-config-dev.yml, 其配置如下:

server:
  port: 9980
nacos: 
  config: 这里是 dev 环境

2、继续创建配置文件 Data ID 为:nacos-config-test.yml, 其配置如下:

server:
  port: 9981
nacos: 
  config: 这里是 test 环境

多环境测试

通过 Idea 启动 nacos-config 项目,并指定spring.profiles.active, 通过不同的环境进行启动

通过上面的配置,将项目分为 dev、test 两个环境启动后,进行测试

访问 http://127.0.0.1:9980/getValue 返回:这里是 dev 环境

访问 http://127.0.0.1:9981/getValue 返回:这里是 test 环境

可以看到,分别以 dev、test 启动后相应的读取到不同的配置,dev 环境读取到启动端口为 9980,test 读取到启动端口 9981

Group 方案

上面介绍了通过指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置

这里也可以不用 DataID,直接通过Group 实现环境区分

注:这种方式不太推荐,切换不灵活,需要切换环境时要改 Gruop 配置

新建配置

1、创建配置文件 Data ID 为:nacos-config.yml, Group 为:DEV_GROUP, 其配置如下:

server:
  port: 9980
nacos: 
  config: 这里是 dev 环境

2、继续创建配置文件 Data ID 为:nacos-config.yml, Group 为:TEST_GROUP, 其配置如下:

server:
  port: 9981
nacos: 
  config: 这里是 test 环境

这里的两个配置文件他们的 DataID 相同但是 Group 不同

修改项目中的配置文件 bootstrap.yml

在 config 下增加一条 group 的配置,指定配置文件所在的 group,可配置为 DEV_GROUPTEST_GROUP

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        group: DEV_GROUP

启动测试

将 group 配置为 DEV_GROUP 启动进行测试

访问 http://127.0.0.1:9980/getValue 返回:这里是 dev 环境

将 group 配置为 TEST_GROUP 启动进行测试

访问 http://127.0.0.1:9981/getValue 返回:这里是 test 环境

通过指定 group 的方式启动,DEV_GROUP 读取到启动端口为 9980,TEST_GROUP 读取到启动端口 9981

说明

只通过 Group 来进行多环境的区分的方式我不推荐使用,因为涉及到了多环境自然就会改变spring.profile.active, 而 profile 一旦生效,配置文件就会依据 DataID 的规则进行查找。所以 Group 的方式仅作参考。

Group 的合理用法应该是配合 namespace 进行服务列表和配置列表的隔离和管理

Namespace 方案

Namespace 命名空间进行环境隔离也是官方推荐的一种方式。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。

创建命名空间

创建命名空间 DEVTEST, 不同的命名空间会生成相应的 UUID,如下图

新建配置文件

1、在命名空间 DEV 下创建 DataID 为:nacos-config.yml,Group 为默认值的配置, 配置如下:

server:
  port: 9980
nacos: 
  config: 这里是 DEV 命名空间

2、在命名空间 TEST 下创建 DataID 为:nacos-config.yml,Group 为默认值的配置, 配置如下:

server:
  port: 9981
nacos: 
  config: 这里是 TEST 命名空间

修改项目中的配置文件 bootstrap.yml

在 config 下增加一条 namespace 的配置,指定当前配置所在的命名空间 ID。注意是命名空间 ID!!!! 配置如下

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        namespace: edbd013b-b178-44f7-8caa-e73071e49c4d

启动测试

将 namespace 配置为 DEV 的 ID:edbd013b-b178-44f7-8caa-e73071e49c4d, 启动进行测试

访问 http://127.0.0.1:9980/getValue 返回:这里是 DEV 命名空间

将 namespace 配置为 TEST 的 ID:0133bd1e-25c3-4985-96ed-a4e34efdea2e, 启动进行测试

访问 http://127.0.0.1:9981/getValue 返回:这里是 TEST 命名空间

通过指定 namespace 的方式启动,均可读取到对应的启动端口和相关配置

说明

Namespace 是官方推荐的环境隔离方案,确实有他的独到之处,使用 namespace 这种方案,同时可以与 DataID+profile 的方式结合

同时释放 Group 的限制,大大提高多环境配置管理的灵活性。

总结

通过上面三种方案的介绍,想必大家对于多环境下的配置读取方式应该有所选择

  • DataID: 适用于项目不多,服务量少的情况。
  • Group:实现方式简单,但是容易与 DataID 方案发生冲突,仅适合于本地调试
  • Namespace:实现方式简单,配置管理简单灵活,同时可以结合 DataID 共同使用,推荐这种方案

参考感谢

  • Nacos 如何支持多环境
  • Nacos 配置的多环境管理

  • 文章作者: LarsCheng
  • 文章链接: 本文首发于个人博客:https://www.larscheng.com/nac…
  • 发布方式:OpenWrite 最懂你的科技自媒体管理平台
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LarsCheng’s Blog!

退出移动版