ナコス:名前空間のエンドポイントと本番環境でのベストプラクティス

ますます多くの企業がナコスを使用するように、2つの最も頻繁に遭遇する問題は次のとおりです。適切に私の本番環境では、エンドポイントの名前空間を使用する方法。この記事では、これら2つのパラメータの設定にナコスのベストプラクティスを使用するプロセスについて話をこれらの2つの問題に主に専念します。

namespce

名前空間については、主に次からのデザインの背景の名前空間ベストプラクティスの名前空間である二つの側面を議論します。

名前空間のデザインの背景

名前空間は、この環境に基づいて、より多くのナコスを行うために設計されており、マルチテナントデータ(された構成とサービスは)単離しました。すなわち:

  • 環境の複数の異なるセットがある場合テナント(ユーザー)の観点から、この時間は、あなたが孤立した環境よりも多くを達成するために、指定された環境に応じて異なるnamespceを作成することができます。たとえば、3つの異なる環境の毎日、事前の開発と生産を持っているナコスクラスターは、それぞれ3つの異なる名前空間に構築することができます使用することがあります。下図のように:

nacos_ingle_tenant_namespace1

  • 複数のテナント(ユーザ)の観点から、各テナント(ユーザ)のために、各テナント(ユーザー)の構成データと登録データは、独自の名前空間下のサービスに起因する、独自の名前空間を有していてもよいです複数のテナント間でのデータの分離を実現。例えば、スーパー管理者は、3つのテナントはジョン・ドウと王ウーある割り当てられました。良好な分布した後、自分のテナントのアカウント名とパスワードのログインでは、それぞれ独自の名前空間を作成します。図に示すように。

nacos_multi_tenant_namespace2

注意:この機能は、計画されています。

ベストプラクティスの名前空間

ベストプラクティスの名前空間では、この部分は、主に2つのアクションが含まれています。

  • 名前空間の値を取得する方法
  • 名前空間パラメータ初期化メソッド

名前空間の値を取得する方法

无论您是基于 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. 閉じる分析エンドポイントパラメータルール

    のプロパティを介してユーザモードでは主に、この時間は、エンドポイントのパラメータルールの解析時間を閉じナコスクライアントの構築に入力されたエンドポイントの値をパラメータ。

デフォルトでは、ナコスクライアントエンドポイントのパラメータは、オープンルールを解決する能力です。あなたはキーが入ってくるのインスタンスで指定されたプロパティのナコスクライアントの初期化で利用できるこの機能を無効にしたい場合はisUseEndpointParsingRuleを、ある閉じます。

著者:鵬Bingting、ニックネーム少なく、GitHubのIDの@pbting、アリババシニア開発エンジニアが、主な研究方向は、分散システムのミドルウェア開発フレームワークの共通セットを作成するには、システムのミドルウェアを分散し、分散減らします開発のしきい値システムミドルウェア。春の雲Alibabとナコスのオープンソースプロジェクトのコミッター。現在、ソフトロードチームに製品構造をアップグレードするために、関連する作業に関与。

おすすめ

転載: yq.aliyun.com/articles/703718