Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践

本文涉及的产品
云原生网关 MSE Higress,422元/月
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 随着使用 Nacos 的企业越来越多,遇到的最频繁的两个问题就是:如何在我的生产环境正确的来使用 namespace 以及 endpoint。这篇文章主要就是针对这两个问题来聊聊使用 nacos 过程中关于这两个参数配置的最佳实践方式。

随着使用 Nacos 的企业越来越多,遇到的最频繁的两个问题就是:如何在我的生产环境正确的来使用 namespace 以及 endpoint。这篇文章主要就是针对这两个问题来聊聊使用 nacos 过程中关于这两个参数配置的最佳实践方式。

namespce

关于 namespace ,以下主要从 namespace 的设计背景namespace 的最佳实践 两个方面来讨论。

namespace 的设计背景

namespace 的设计是 nacos 基于此做多环境以及多租户数据(配置和服务)隔离的。即:

  • 从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。例如,你可能有日常,预发和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。如下图所示:

nacos_ingle_tenant_namespace1

  • 从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示。

nacos_multi_tenant_namespace2

注意: 该功能还在规划中。

namespace 的最佳实践

关于 namespace 的最佳实践 ,这部分主要包含有两个 Action:

  • 如何来获取 namespace 的值
  • namespace 参数初始化方式

如何来获取 namespace 的值

无论您是基于 Spring Cloud 或者 Dubbo 来使用 nacos,都会涉及到 namespace 的参数输入,那么这个时候 namespace 的值从哪里可以获取呢?

  1. 如果您在使用过程中没有感知到这个参数的输入,那么 nacos 统一会使用一个默认的 namespace 作为输入,nacos naming 会使用 public 作为默认的参数来初始化,nacos config 会使用一个空字符串作为默认的参数来初始化。。
  2. 如果您需要自定义自己的 namespace,那么这个值该怎么来产生?

    可以在 nacos 的控制台左边功能侧看到有一个 命名空间 的功能,点击就可以看到 新建命名空间 的按钮,那么这个时候就可以创建自己的命名空间了。创建成功之后,会生成一个命名空间ID,主要是用来避免命名空间名称有可能会出现重名的情况。因此当您在应用中需要配置指定的 namespace 时,填入的是命名空间ID。重要的事情说三遍,
  • 当您在应用中需要配置指定的 namespace 时,填入的是命名空间 ID
  • 当您在应用中需要配置指定的 namespace 时,填入的是命名空间 ID
  • 当您在应用中需要配置指定的 namespace 时,填入的是命名空间 ID

说明: namesace 为 public 是 nacos 的一个保留控件,如果您需要创建自己的 namespace,最好不要和 public 重名,以一个实际业务场景有具体语义的名字来命名,以免带来字面上不容易区分自己是哪一个 namespace。

namespace 参数初始化方式

nacos client 对 namespace 的初始化流程如下图所示:

nacos_init_namespace3

nacos client 对 namespace 的初始化,主要包含两部分,

  • 用户态通过 nacos client 构造实例时通过 properties 参数传入的 namespace
  • 在云环境下(阿里云下的 EDAS)的 namespace 参数解析。

    可通过 -Duse.cloud.namespace.parsing=true/false 来控制是否需要在云环境自动解析 namespace 参数,默认为 true,是会自动解析,其目的就是方便用户上云时可以以零成本的方式平滑上云。如果用户在云上需要用自建的 nacos 下的 namespace,那这个时候只需将 -Duse.cloud.namespace.parsing=false 即可。

endpoint

关于 endpoint ,也主要从 endpoint 的设计背景endpoint 的参数初始化 两个方面来讨论。

endpoint 的设计背景

当 nacos server 集群需要扩缩容时,客户端需要有一种能力能够及时感知到集群发生变化。及时感知到集群的变化是通过 endpoint 来实现的。也即客户端会定时的向 endpoint 发送请求来更新客户端内存中的集群列表。

endpoint 的参数初始化

Nacos Client 提供一种可以对传入的 endpoint 参数规则解析的能力。即当通过构造函数的 properties 来初始化 endpoint 时,指定的 endpoint 值可以是一个具体的值,也可以是一个占位符的形式,如下所示:

${endpoint.options:defaultValue}

说明:

  1. endpoint.options 是一个具体的变量。支持从系统属性,系统环境变量中读取。
  2. defaultValue 是给出的一个默认值。当从具体的变量中没有被正确初始化时,会使用给出的默认值来初始化。

整个 endpoint 的解析规则比较复杂,整体的一个解析流程图如下所示:
nacos_init_endpoint4

注意: 蓝色特别区分的是支持云环境下(阿里云上的 EDAS)自动从系统环境变量中来读取 endpoint 值,以此来达到用户本地开发或者将应用往云上迁移的时候以零成本的改造方式实现平滑上云。

说明:

1. 开启 endpoint 参数规则解析

1.1. 如果在初始化 Nacos Client 的时候,没有通过 properties 来指定 endpoint,这个时候会从系统环境变量中变量名为 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值来初始化,如果系统环境变量也没有设置,那么这个时候将会返回一个空字符串。

1.2. 如果设置了 endpoint,

1.2.1 设置的 endpoint 是一个指定具体的值。

这时会先从系统环境变量中变量名为 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值来初始化,如果系统环境变量没有设置,那么这个时候用用户态传入的具体值来初始化 endpoint。

1.2.2 以占位符的形式输入。

这时会解析出具体占位符的值,然后:

  • 依次从系统属性和环境变量中来取值。

    例如,您输入的是 ${nacos.endpoint:defaultValue},那么解析出来的            占位符是 nacos.endpoint。解析出来后,会先读取系统属性中(即 System.getProperty("nacos.endpoint"))是否设置了 nacos.endpoint 变量值,如果没有,则会从系统环境变量中变量名为 nacos.endpoint 指定的值来初始化。
  • 如果通过解析出来的占位符还没有正确初始化 endpoint,则会从系统环境变量中变量名为 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值来初始化。
  • 如果经过以上两步还没有被初始化,这时如果您设置了默认值,这个时候就会使用默认值来初始化 endpoint,否则的话以解析出来的占位符返回。
  1. 关闭 endpoint 参数规则解析

    当关闭了 endpoint 参数规则解析的时候,这个时候就以用户态在构造 Nacos Client 时通过 properties 参数输入的 endpoint 值为主。

默认情况下, Nacos Client 是开启 endpoint 参数规则解析的能力。如果你想关闭该能力,可在 Nacos Client 初始化的时候在传入的 properties 实例中指定 key 为 isUseEndpointParsingRule,值为 false 即可关闭。

本文作者:彭兵庭,花名得少,GitHub ID @pbting,阿里巴巴高级开发工程师,主要研究方向分布式系统中间件,致力于打造一套通用的分布式系统中间件开发框架,降低分布式系统中间件的开发门槛。Spring Cloud Alibab 和 Nacos 开源项目 committer。目前在软负载团队参与产品架构升级的相关工作。

相关文章
|
关系型数据库 MySQL Nacos
生产环境下的终极指南:在生产环境部署 Nacos 集群和高可用 MySQL 使用 Docker
生产环境下的终极指南:在生产环境部署 Nacos 集群和高可用 MySQL 使用 Docker
860 0
|
6月前
|
存储 安全 Nacos
使用KMS为MSE-Nacos敏感配置加密的最佳实践
本文主要介绍通过KMS密钥管理服务产生的密钥对敏感的AK等数据进行加密之后可以有效解决泄漏带来的安全风险问题,其次通过KMS凭据托管的能力直接将MSE的主AK进行有效管理,保障全链路无AK的业务体验,真正做到安全、可控。
93099 5
|
Java Nacos Spring
使用Spring Boot的Profile功能来实现不同环境使用不同的Nacos Namespace的配置
使用Spring Boot的Profile功能来实现不同环境使用不同的Nacos Namespace的配置
575 1
|
运维 Dubbo Cloud Native
APISIX+Dubbo+Nacos 最佳实践
虽然使用 APISIX+Dubbo+Nacos,能够解决这个实践中最主要的两个问题。但是它在使用中仍然还有需要进步的地方。社区中会在后续的计划和展望中继续优化。
467 9
APISIX+Dubbo+Nacos 最佳实践
|
SpringCloudAlibaba 关系型数据库 MySQL
SpringCloud Alibaba学习(四):Linux版Nacos+MySQL生产环境配置
SpringCloud Alibaba学习(四):Linux版Nacos+MySQL生产环境配置
525 1
SpringCloud Alibaba学习(四):Linux版Nacos+MySQL生产环境配置
|
Java 测试技术 Nacos
Nacos 如何实现生产环境中的灰度配置?
Nacos 如何实现生产环境中的灰度配置?
Nacos 如何实现生产环境中的灰度配置?
|
存储 缓存 运维
Nacos 配置管理最佳实践
Nacos3.0 中,在 SDK 能力提升,界面交互升级,服务端核心能力,可观测可运维,稳定性&高可用方面都规划了诸多功能。
Nacos 配置管理最佳实践
|
运维 Kubernetes Cloud Native
Higress + Nacos 微服务网关最佳实践
本文将介绍 Higress 组合 Nacos 作为微服务网关能力,并介绍微服务网关发展的两个趋势,为网关的选型指明道路。
Higress + Nacos 微服务网关最佳实践
|
运维 Kubernetes Cloud Native
Higress + Nacos 微服务网关最佳实践
Higress 结合 Nacos 作为微服务网关的实战演示
Higress + Nacos 微服务网关最佳实践
|
存储 缓存 运维
Nacos 配置管理最佳实践
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 配置管理最佳实践
下一篇
无影云桌面