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

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

namespce

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

namespace 的设计背景

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

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

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

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

namespace 的最佳实践

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

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

如何来获取 namespace 的值

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

  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。3d

namespace 参数初始化方式

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

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 的解析规则比较复杂,总体的一个解析流程图以下所示:

注意: 蓝色特别区分的是支持云环境下(阿里云上的 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。目前在软负载团队参与产品架构升级的相关工做。



本文做者:中间件小哥

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索