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

前言

前景回顾:

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

我们来说算一算,假设某系统有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!

---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive_Hive的数据模型_内部表

Hive的数据模型_内部表 - 与数据库中的Table在概念上是类似。- 每一个Table在Hive中都有一个相应的目录存储数据。- 所有的Table数据(不包括External Table)都保存在这个目录中。 create table t1 (tid int, tname string, age int);create table t2 (tid int, tname string, a…

为啥JAVA虚拟机不开发系统_理解Java虚拟机体系结构

1 概述众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么。正是得益于Java虚拟机,它号称的“一次编译,到处…

Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

1.理清概念 我们使用过Dialog和PopupWindow,还有Toast,它们都显示在Activity之上。那么我们首先需要理解的是android中是如何去绘制这些UI的呢?这里我只讲我所理解的,首先看一层次图(盗用网络)首先我们看到左边的Activity层&#…

leetcode面试题 04.03. 特定深度节点链表(bfs)

给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。示例:输入:[1,2,3,4,5,null,7…

Java集合中的细节

integer数据对比 对于Integer var ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用进行判断,但是这个区间之外的所有数据,都会在堆上产生&…

css扩展语言_如何决定是否应该链接或扩展CSS类

css扩展语言by Sarah Dayan通过莎拉达扬 如何决定是否应该链接或扩展CSS类 (How to decide whether you should chain or extend CSS classes) If you’re building an app or a website that changes often, modular CSS methods solve many issues. Instead of copying your…

vue 是否有word编辑控件_GitHub - C84882428/editor-ui: vue集成 tinymce 富文本编辑器,增加导入 word 模板...

editor-uivue 集成 tinymce 富文本编辑器自定义 tinymce 富文本编辑器,在原来的编辑器中增加上传 word 模板最终展示效果:主要代码:整体思路:1,在编辑器原来的基础上增加上传模板按钮2, 前端上传 word 模板3, 服务端接收将 word 转换为html 返回前端4, 前端拿到服务端返回的值,…

Android开发系列之屏幕密度和单位转换

由于Android的开源性,所以目前市面上面Android手机的分辨率特别多,这样的话就给我适配带来了一定的难度。要想做好适配,我们首先应该明白什么是分辨率、PPI、屏幕大小等概念,还有在不同的屏幕密度下,各个单位之间的转换…

java集合AbstractMap_Java 集合中的 AbstractMap 抽象类

Java 集合中的 AbstractMap 抽象类jdk1.8.0_144AbstractMap 抽象类实现了一些简单且通用的方法, 本身并不难但在这个抽象类中有两个方法非常值得关注, keySet 和 values 方法源码的实现可以说是教科书式的典范抽象类通常作为一种骨架实现, 为各自子类实现公共的方法上一篇我们讲…

leetcode392. 判断子序列(动态规划)

给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长&#xff08;长度 ~ 500,000&#xff09;&#xff0c;而 s 是个短字符串&#xff08;长度 <100&#xff09;。 字符串的一个子序列是原始字符串删…

让机器读懂用户——大数据中的用户画像

让机器读懂用户——大数据中的用户画像 摘要&#xff1a; 用户画像(persona)的概念最早由交互设计之父Alan Cooper提出:“Personas are a concrete representation of target users.” 是指真实用户的虚拟代表&#xff0c;是建立在一系列属性数据之上的目标用户模型。随着互联…

asp.net应用程序_如何在ASP.NET中为聊天应用程序构建键入指示器

asp.net应用程序by Neo Ighodaro由新Ighodaro 如何在ASP.NET中为聊天应用程序构建键入指示器 (How to build a typing indicator for your chat app in ASP.NET) A basic understanding of ASP.NET and jQuery is needed to follow this tutorial.要学习本教程&#xff0c;需要…

activeMQ在文件上传的应用

本次试验主要用到了activeMq和上传插件uploadify的知识&#xff0c;感谢以下两篇文章的作者。 1.http://itindex.net/detail/47160-java-jquery-%E4%B8%8A%E4%BC%A0 2.http://blog.csdn.net/jiuqiyuliang/article/details/47160259 本文中不再提供activeMq和uploadify的介绍。 …

java nginx 例子_Java及nginx实现文件权限控制代码实例

我们知道&#xff0c;使用nginx作为文件下载服务器&#xff0c;可以极大地降低对后端Java服务器的负载冲击&#xff0c;但是nginx本身并不提供授权控制&#xff0c;因此好的方案是由后端服务器实现权限控制&#xff0c;最好的方式是直接复用应用的认证体系&#xff0c;最大化的…

leetcode934. 最短的桥(dfs+bfs)

在给定的二维二进制数组 A 中&#xff0c;存在两座岛。&#xff08;岛是由四面相连的 1 形成的一个最大组。&#xff09; 现在&#xff0c;我们可以将 0 变为 1&#xff0c;以使两座岛连接起来&#xff0c;变成一座岛。 返回必须翻转的 0 的最小数目。&#xff08;可以保证答…

谢烟客---------Linux之DNS服务系统的基础知识

DNS Domain Name Server1)C/S架构&#xff1a;SOCKET通信IP PORT2&#xff09;应用层协议&#xff1a;资源子网BIND Berkerley Information Name DomainDNS由来1&#xff09;统一名字&#xff0c;自己维护 <自己查询>解析: 基于key查找value: 查询数据库(二维关系的表: …

Java实现点击导出excel页面遮罩屏蔽,下载完成后解除遮罩

一、问题场景 最近在做数据统计功能&#xff0c;需求是导出大数据量的excel&#xff0c;时间间隔较长&#xff0c;大概需要十秒左右&#xff0c;点击导出后&#xff0c;页面没有做任何处理&#xff0c;用户也不知道是否正在导出&#xff1b;如果没有做交互上的限制&#xff0c;…

pbs 支持 java_Linux下Java安装与配置

安装以JDK1.6.0_43为例下载jdk-6u43-linux-x64.bin&#xff0c;http://www.oracle.com/technetwork/java/javase/downloads/index.html增加可执行权限 chmod x jdk-6u43-linux-x64.bin&#xff0c;执行 ./jdk-6u43-linux-x64.bin 生成目录jdk1.6.0_43拷贝到/usr/share下&#x…

使用Chatkit构建Node.js命令行聊天应用程序

by Hugo雨果 使用Chatkit构建Node.js命令行聊天应用程序 (Build a Node.js command-line chat application with Chatkit) Building chat in your app can be pretty complex. Yet, with Chatkit, implementing fully-featured chat is nothing but a few lines of code.在您的…

java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒

Java程序将毫秒转换为分钟和秒在上面的程序中&#xff0c;您将学习如何在Java中将毫秒分别转换为分钟和秒。示例1&#xff1a;将毫秒分别转换为分钟和秒import java.util.concurrent.TimeUnit;public class Milliseconds {public static void main(String[] args) {long millis…