在 Nacos 中,命名空间是用于隔离不同的配置和服务注册信息的独立环境。每个命名空间都有自己的配置、服务注册和发现信息,这有助于解决多租户或多环境的需求,以确保不同组织、部门或应用程序之间的信息隔离。
以下是关于 Nacos 命名空间的一些关键点:
隔离配置:不同的命名空间可以拥有独立的配置信息,这意味着不同部门或应用程序可以在同一 Nacos 集群中管理其自己的配置,而不会干扰其他部门或应用程序的配置。
隔离服务注册信息:服务注册和发现也可以根据命名空间隔离。不同命名空间中的服务注册信息不会相互干扰,这对于多租户环境非常有用。
多环境支持:命名空间可以用于管理不同环境(如开发、测试、生产)的配置和服务信息。每个环境可以有一个独立的命名空间。
权限控制:Nacos 支持为每个命名空间配置不同的访问权限,以确保只有授权用户或应用程序可以访问和修改相关命名空间的信息。
全局命名空间:Nacos 也提供一个全局命名空间,通常用于存储一些全局配置信息,它不会受到命名空间隔离的限制。
例如:你可能有开发,测试和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace,实现不同环境下配置的隔离。如下图所示:
下面通过编写代码演示怎样获取特定 namespace 下面的配置信息。
创建一个简单的 Maven 项目,在 pom.xml 中添加如下依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.9</version> </dependency>
登录到 Nacos WEB 页面,创建两个 dev 和 test 命名空间,并且在他们下面分别创建 my_config 配置集,如下图:
(1)在 dev 命名空间下创建配置,如下图:
配置内容为:
name=dev_name
(2)在 test 命名空间下创建配置,如下图:
配置内容为:
name=test_name
下面通过代码获取 test 命名空间(命名空间ID为 be69a2b3-641c-42b8-96f3-72c27f0f8436)中 my_config 的内容,代码如下:
package com.hxstrive.nacos; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import java.util.Properties; /** * Nacos SDK 简单DEMO * @author hxstrive.com */ public class SimpleDemo { public static void main(String[] args) throws NacosException { // Nacos 地址 String serverAddr = "127.0.0.1:8848"; // Data ID String dataId = "my_config"; // Group String group = "DEFAULT_GROUP"; Properties config = new Properties(); config.put("serverAddr", serverAddr); // 关键代码,指定为 test 命名空间 config.put("namespace", "be69a2b3-641c-42b8-96f3-72c27f0f8436"); // 如果 Nacos 开启了登录权限,则指定用户名和密码 // 如果没有开启登录权限,则注释掉下面两行代码 config.put("username", "nacos"); config.put("password", "nacos"); ConfigService configService = NacosFactory.createConfigService(config); // String getConfig(String dataId, String group, long timeoutMs) throws NacosException; // timeoutMs 为获取配置超时时间,单位毫秒 String content = configService.getConfig(dataId, group, 5000); System.out.println(content); } }
运行示例,输出如下:
name=test_name
扩展:如果我们将程序的 namespace 通过命令行参数传递进来,是不是可以实现程序在各个环境之间进行切换。修改后的代码如下:
package com.hxstrive.nacos; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import java.util.Properties; /** * Nacos SDK 简单DEMO * @author hxstrive.com */ public class SimpleDemo { public static void main(String[] args) throws NacosException { // Nacos 地址 String serverAddr = "127.0.0.1:8848"; // Data ID String dataId = "my_config"; // Group String group = "DEFAULT_GROUP"; Properties config = new Properties(); config.put("serverAddr", serverAddr); // 关键代码,指定为 test 命名空间 config.put("namespace", args[0]); // 如果 Nacos 开启了登录权限,则指定用户名和密码 // 如果没有开启登录权限,则注释掉下面两行代码 config.put("username", "nacos"); config.put("password", "nacos"); ConfigService configService = NacosFactory.createConfigService(config); // String getConfig(String dataId, String group, long timeoutMs) throws NacosException; // timeoutMs 为获取配置超时时间,单位毫秒 String content = configService.getConfig(dataId, group, 5000); System.out.println(content); } }
运行方式如下图: