前言

前景回顾:

现如今,在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境

我们来说算一算,假设某系统有10个微服务,那么至少有10个配置文件吧,三个环境(devtestprod),那就有30个配置文件需要进行管理。

这么多的配置文件,要修改一个或者多个的时候,稍有不慎可能就会出现改错了、不生效....等等问题。

那么如果引入Nacos作为配置中心后,如何有效的进行配置文件的管理和不同环境间的隔离区分呢?

别担心,Namespace可以帮助我们进行多环境下的管理和隔离

有了上一篇文章的介绍,本文主要从以下几个方面介绍:

Namespace是什么

Namespace如何进行配置和服务的管理、隔离

创建和获取NamespaceID

Namespace实施方案1

Namespace实施方案2

Namespace

Nacos引入了命名空间(Namespace)的概念来进行多环境配置和服务的管理及隔离

Namespace也是官方推荐的多环境支持方案。

如何进行配置和服务的管理、隔离

当我们的服务达到一定的数量,集中式的管理许多服务会十分不便,

那我们可以将这些具有相同特征或属性的服务进行分组管理,服务对应的配置也进行分组隔离

这里的分组就是Namespace的概念,将服务和配置纳入相同的Namespace进行管理

不同Namespace下的服务和配置之间就隔离开来

创建和获取NamespaceID

NamespaceId值是在配置文件配置时必须要填入的配置项,所以需要我们先创建Namespace和Id,步骤如下:

nacos 的控制台左边功能栏看到有一个命名空间的功能,点击就可以看到新建命名空间 的按钮

新建成功后,可以在命名空间列表中查看到你所创建的Namespace和他生成的ID值

这里只是讲解创建步骤,本文继续延用Nacos(五)中创建的DEV、TEST

Namespace实施方案1

Nacos给出了两种Namespace的实践方案

面向一个租户

面向多个租户

方案1主要说明一下面向一个租户

从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。

例如,你可能有dev,test和prod三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。如下图所示:

这里的单租户同样也适于小型项目,或者是项目不太多时的实施方案

通过定义不同的环境,不同环境的项目在不同的Namespace下进行管理,不同环境之间通过Namespace进行隔离

当多个项目同时使用该Nacos集群时,还可以通过Group进行Namespace内的细化分组

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

有了以上思路,我们通过代码来实践一下

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的子项目,该工程的依赖文件和启动类的代码与Nacos(四)完全一致。

以下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

启动工程

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

现在我们有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可以达到多环境多项目下的服务、配置管理的目标

方案1通过Namespace来隔离不同的环境(devtest),在具体的环境Namespace中通过Group来管理不同的项目

Namespace实施方案2

了解了单租户的方案1,再来看看Nacos推荐的面向多租户的方案2

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

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

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

方案2通过Namespace来隔离多租户之间的服务和配置,但不仅于此,他有很好的扩展性

在该方案中,Group同样也有用武之地。

需求改变下,公司发展迅速业务调整,张三负责A项目、B项目、C项目,李四负责D项目、E项目、F项目,王五负责G项目、H项目、I项目,

而每个项目又分了dev、test、prod三个环境,继续沿用之前的Namespace隔离租户方案,显得有些管理不便,这时候可以在NameSpace中加入Group进行项目环境分组,如图:

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

通过上面的理论分析,可以看出方案二有很好的扩展性

依旧如上,我们通过代码来实践一下方案2(Namespace隔离租户 + 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

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

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

问题描述

但是相信大家已经发现了一个问题,当使用的Group来进行分组后,配置文件相互之间可以实现不同环境与不同项目之间的分组隔离

但是服务注册后,虽然可以通过Namespace隔离,但指定的Group分组却并没有生效,依然是DEFAULT_GROUP

比如方案1 所有项目启动后Nacos服务列表页如下图

这里本应该是我们自定义的分组namespace-one和namespace-two却没有生效

由此发现,配置之间是达到了相互分组隔离名但服务列表暂时并不支持。

但是不要担心,Nacos的社区极度活跃,社区的大佬们也发现了这一情况,并且在Nacos-client的源码中可以看到NameingService在加载配置文件时是有预留Group这一属性字段的。

所以既然Nacos提供了这一实践方案,正常使用只不过是时间问题。

总结

以上分析了Nacos对于Namespace提供的两种实践方案,同时进行了代码实验,均达到了预期的要求。

现对两种方案进行一个总结

单租户方案(方案1):适合小型项目,服务数量不多时,方案一完全够用

多租户方案(方案2):适合项目量多,有一定的团队规模,且服务数量较多时,可以相对条理清晰的管理和隔离配置及服务。

参考与感谢

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LarsCheng's Blog!

---

nacos怎么修改服务分组_Nacos(六):多环境下如何“管理”及“隔离”配置和服务...相关推荐

  1. PaddleOCR——Docker环境下基于HubServing模式部署Restful API服务(CPU版本)

    Docker环境下基于HubServing模式部署Restful API服务(CPU版本) 在日常项目应用中,相信大家一般都会希望能通过Docker技术,把PaddleOCR服务打包成一个镜像,以便在 ...

  2. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发...

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  3. nacos怎么修改服务分组_nacos配置管理

    Nacos是阿里开源的一个项目 用于进行微服务架构的配置管理以及服务发现, 和服务治理等解决方案 配置管理 什么是配置中心 配置发布更新 发布配置到配置中心,把各个服务拿到一个地方, 这样各个服务要从 ...

  4. 检查是否禁止asp.net服务扩展_在 Kubernetes 环境下部署 OpenWhisk 服务

    本文使用 Zhihu On VSCode 创作并发布 1. 总体目标 终于开始准备毕业设计了.在和导师们的讨论之后,我们确定之后的研究方向将会专注于 Serverless Computing. 先长舒 ...

  5. 从Kubernetes安全地访问AWS服务,告诉你多云场景下如何管理云凭据!

    作者| Alexey Ledenev 翻译 | 天道酬勤,责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 随着企业与各种云提供商合作,多云场景已经变得十分常见. 在谷歌Ku ...

  6. nacos怎么修改服务分组_nacos服务注册如何配置分组?

    同问,度娘一番,没找到答案,最终看的代码,大概知道怎么回事了. 这个是下面引用源码的版本 org.springframework.cloud spring-cloud-starter-alibaba- ...

  7. mongodb添加创建修改时间_mongodb副本集生产环境下部署案例,推荐一个主两个从三台机器...

    Linux中部署Mongodb副本集 提示: 以下操作步骤较多,请耐心阅读. 关于理论部分请参考上篇浅谈mongodb副本集. 1. 准备 192.168.102.110 master 192.168 ...

  8. ubuntu mysql 修改 端口_在Ubuntu/Linux环境下使用MySQL:开放/修改3306端口、开放访问权限...

    操作系统:Ubuntu 17.04 64位 MySQL版本:MySQL 5.7 一.查看3306端口是否开放 netstat -an|grep 3306 如果看到下图这样的,说明端口并未打开: 二.修 ...

  9. EasyNVS摄像机公网全终端无插件网页摄像机直播管理服务EasyNVS如何在内网环境下与外网和公网对接

    背景说明 由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋.传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCX Web插件进行直播.对于安防 ...

最新文章

  1. Linux下tomcat内存溢出分析及优化
  2. 如何解决SSL/TLS握手过程中失败的错误?
  3. 移动机器人建图与导航代码实现——3.Path Tracking
  4. xcode 不能读取键盘输入的汉字_C++:cin从控制台读取数据时的结束符
  5. Linux 安装 MySQL 5.7 并连接 Navicat 详细过程
  6. J2EE 企业级应用架构简述
  7. wordpress 基础文件
  8. 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数
  9. k8s集群中 spark访问hbase中数据
  10. 【高电复习3】频谱的线性搬移、振幅调制、解调、混频
  11. 目前比较流行的网站开发框架
  12. Hibernate-部分知识点概述(持续更新)
  13. github分支操作
  14. JavaScrpit+Html实现日期时间启动、停止操作(应用场景:计时器、秒表)
  15. 攻防演练第四年的一些碎碎念
  16. pc端启用微信小程序
  17. python人机交互_人机交互程序 python实现人机对话
  18. Oracle中todate函数的使用
  19. Python pip自动管理脚本
  20. easyui01人门基础

热门文章

  1. 数据库建表赋予权限语句
  2. RUNOOB python练习题2
  3. Java网络02基本Web概念
  4. 代码审计之DocCms漏洞分析
  5. 《Adobe Illustrator大师班:经典作品与完美技巧赏析》—Svetlana Makarova
  6. Xcode 的正确打开方式——Debugging
  7. shell 基本知识
  8. 什么是虚拟化,虚拟化的现状
  9. 在asp.net中备份还原SQL Server数据库
  10. 786. 第 K 个最小的素数分数