Nacos多环境的实现过程

 更新时间:2024年12月24日 10:19:41   作者:IT利刃出鞘  
本文介绍Nacos实现多环境的方案,包括单租户和多租户两种类型,详细介绍了如何在Nacos中创建命名空间、配置文件和项目,并通过配置文件的DataId和Group区分不同环境和项目,作者通过实战场景展示了如何配置和启动项目,验证了配置文件的读取和隔离效果

简介

说明

本文介绍Nacos实现多环境的方案。

方案概述

多环境有很多方案,如下:

  • 单租户方案(适用于项目很少的场景)
  • 命名空间区分环境,GROUP 使用默认,DATA ID区分应用
  • 单租户方案(适用于项目较少的场景)
  • 命名空间区分环境,GROUP 区分项目,DATA ID区分应用
  • 多租户方案(适用于项目很多的场景)
  • 命名空间区分项目,GROUP使用默认,DATA ID区分应用及环境
  • 多租户方案(适用于项目巨多的场景)
  • 命名空间区分项目,GROUP 区分环境,DATA ID区分应用

方案1:单租户(单GROUP)

场景:适用于项目很少的场景。

有dev,test和prod三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。

如下图所示:

方案2:单租户(多GROUP)

场景:适用于项目较少的场景。

以方案1为基础,多个项目同时使用该Nacos集群时,可以通过Group进行Namespace内的细化分组。

以Namespace:dev为例,在Namespace中通过不同Group进行同一环境中不同项目的再分类:

通过代码来实践一下

创建Nacos配置文件

Namespace下新建配置文件

启动Nacos-Server,进入Nacos控制台,切换到Namespace:dev界面,新建配置文件

  • DataId:nacos-namespace-one-dev.yml
  • Group:namespace-one
  • 配置格式:YAML
  • 配置内容:
nacos: 
    config: 项目:nacos-namespace-one,Namespace:dev

继续新建配置文件

  • DataId:nacos-namespace-two-dev.yml
  • Group:namespace-two
  • 配置格式:YAML
  • 配置内容:
nacos: 
    config: 项目:nacos-namespace-two,Namespace:dev

切换到Namespace:test环境,按照dev中的创建方式,分别创建nacos-namespace-one-test.yml和nacos-namespace-two-test.yml

注意:检查DataId是否正确、group、配置内容与环境是否匹配

创建项目

在聚合工程Nacos下创建名为nacos-namespace-one的子项目。

以下NamespaceId均来自创建Namespace时生成的Id,在控制台命名空间页面中可以查看

创建dev环境配置文件bootstrap-dev.yml

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

创建test环境配置文件bootstrap-dev.yml

server:
  port: 9912

spring:
  application:
    name: nacos-namespace-one
  profiles:
    active: test
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 0133bd1e-25c3-4985-96ed-a4e34efdea2e
        group: namespace-one
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        namespace: 0133bd1e-25c3-4985-96ed-a4e34efdea2e
        group: namespace-one

重复以上操作,再创建一个名为nacos-namespace-two的子项目

nacos-namespace-two项目的dev和test启动端口分别设置为9921和9922,group为:namespace-two(记得修改spring.application.name、namespace和group)。

测试

分别启动两个项目的两个环境(四个启动类),如下图(两个环境都启动dev和test)

现在我们有2个项目:nacos-namespace-one和nacos-namespace-two,2个项目分别有两个不同的环境dev和test。此时观察Nacos-Server控制台如下:

尝试访问接口来获取配置信息,验证是否可以读取相应环境配置

访问127.0.0.1:9911/getValue,返回:项目:nacos-namespace-one,Namespace:dev
访问127.0.0.1:9912/getValue,返回:项目:nacos-namespace-one,Namespace:test
访问127.0.0.1:9921/getValue,返回:项目:nacos-namespace-two,Namespace:dev
访问127.0.0.1:9922/getValue,返回:项目:nacos-namespace-two,Namespace:test

通过以上实验,方案1可以达到多环境多项目下的服务、配置管理的目标。

方案3:多租户(单GROUP)

从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。他有很好的扩展性。

例如超级管理员分配了三个租户,分别为张三、李四和王五。张三负责A项目,李四负责B项目,王五负责C项目。

分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示:

方案4:多租户(多GROUP)

以方案3为基础,公司发展迅速业务调整,张三负责A项目、B项目、C项目,李四负责D项目、E项目、F项目,王五负责G项目、H项目、I项目。每个项目又分了dev、test、prod三个环境,继续沿用之前的Namespace隔离租户方案,显得有些管理不便,这时候可以在NameSpace中加入Group进行项目环境分组,如图:

当业务规模更大的时候(不考虑Nacos集群能否支持的因素),张三、李四、王五每人都负责10多个项目时,即项目数>环境数时,可以通过Group进行项目分组,如下图:

实战

场景描述

依旧使用上面的两个项目,假设现在有两个租户,张三、李四

张三负责项目:nacos-namespace-one, 李四负责项目:nacos-namespace-two,项目分别有dev和test环境

新建Namespace和配置文件

新建两个Namespace来隔离租户,分别为zhangsan、lisi

在Namespace:zhangsan 下创建配置文件

  • DataId:nacos-namespace-one-dev.yml
  • Group:namespace-one-dev
  • 配置格式:YAML
  • 配置内容:
nacos: 
    config: 项目:nacos-namespace-one,Namespace:张三,环境:dev

继续创建test环境配置文件

  • DataId:nacos-namespace-one-test.yml
  • Group:namespace-one-test
  • 配置格式:YAML
  • 配置内容:
nacos: 
    config: 项目:nacos-namespace-one,Namespace:张三,环境:test

参照以上操作,在Namespace:lisi命名空间中创建配置文件nacos-namespace-two-dev.yml和nacos-namespace-two-test.yml

注意:核对DataId、Group、和配置内容

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

修改项目nacos-namespace-one的dev配置文件bootstrap-dev.yml

server:
  port: 9911
spring:
  application:
    name: nacos-namespace-one
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
#        方案2:NamespaceID\Group
        namespace: e0d75068-a12c-4314-9296-3f396139d5b3
        group: namespace-one-dev
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
#        方案2:NamespaceID\Group
        namespace: e0d75068-a12c-4314-9296-3f396139d5b3
        group: namespace-one-dev

修改test配置文件bootstrap-test.yml

server:
  port: 9912
spring:
  application:
    name: nacos-namespace-one
  profiles:
    active: test
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
#        方案2:NamespaceID\Group
        namespace: e0d75068-a12c-4314-9296-3f396139d5b3
        group: namespace-one-test
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
#        方案2:NamespaceID\Group
        namespace: e0d75068-a12c-4314-9296-3f396139d5b3
        group: namespace-one-test

重复以上操作相应的修改项目nacos-namespace-two的dev和test配置文件

主要修改namespace和group属性,与命名空间lisi的ID和其下配置文件的Group对应

启动项目

分别启动两个项目的两个环境(四个启动类),启动成功如下图

此时两个项目分别启动两个环境后,注册到Nacos上不同的Namespace下,并读取相应环境的配置,具体如下:

nacos-namespace-one

  • dev: 注册到Namespace:zhangsan,读取Namespace:zhangsan下Group:namespace-one-dev的配置
  • test: 注册到Namespace:zhangsan,读取Namespace:zhangsan下Group:namespace-one-test的配置

nacos-namespace-two

  • dev: 注册到Namespace:lisi,读取Namespace:lisi下Group:namespace-two-dev的配置
  • test: 注册到Namespace:lisi,读取Namespace:lisi下Group:namespace-two-test的配置

此时Nacos控制台如下图:

ok我们来测试下各个环境的服务能否访问到对应的配置

访问127.0.0.1:9911/getValue,返回:项目:nacos-namespace-one,Namespace:张三,环境:dev
访问127.0.0.1:9912/getValue,返回:项目:nacos-namespace-one,Namespace:张三,环境:test
访问127.0.0.1:9921/getValue,返回:项目:nacos-namespace-two,Namespace:李四,环境:dev
访问127.0.0.1:9922/getValue,返回:项目:nacos-namespace-two,Namespace:李四,环境:test

通过访问服务的接口,各个服务都可以准确的读取到各自环境下的配置文件

方案二可以看到同样支持服务和配置的隔离分组,同时支持业务的扩展,有较好的扩展性

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论