随着使用 Nacos 的企业愈来愈多,遇到的最频繁的两个问题就是:如何在个人生产环境正确的来使用 namespace 以及 endpoint。这篇文章主要就是针对这两个问题来聊聊使用 nacos 过程当中关于这两个参数配置的最佳实践方式。架构
关于 namespace ,如下主要从 namespace 的设计背景 和 namespace 的最佳实践 两个方面来讨论。框架
namespace 的设计是 nacos 基于此作多环境以及多租户数据(配置和服务)隔离的。即:分布式
注意: 该功能还在规划中。函数
关于 namespace 的最佳实践 ,这部分主要包含有两个 Action:阿里云
不管您是基于 Spring Cloud 或者 Dubbo 来使用 nacos,都会涉及到 namespace 的参数输入,那么这个时候 namespace 的值从哪里能够获取呢?spa
能够在 nacos 的控制台左边功能侧看到有一个 命名空间 的功能,点击就能够看到 新建命名空间 的按钮,那么这个时候就能够建立本身的命名空间了。建立成功以后,会生成一个命名空间ID,主要是用来避免命名空间名称有可能会出现重名的状况。所以当您在应用中须要配置指定的 namespace 时,填入的是命名空间ID。重要的事情说三遍,设计
说明: namesace 为 public 是 nacos 的一个保留控件,若是您须要建立本身的 namespace,最好不要和 public 重名,以一个实际业务场景有具体语义的名字来命名,以避免带来字面上不容易区分本身是哪个 namespace。3d
nacos client 对 namespace 的初始化流程以下图所示:server
nacos client 对 namespace 的初始化,主要包含两部分,中间件
可经过 -Duse.cloud.namespace.parsing=true/false 来控制是否须要在云环境自动解析 namespace 参数,默认为 true,是会自动解析,其目的就是方便用户上云时能够以零成本的方式平滑上云。若是用户在云上须要用自建的 nacos 下的 namespace,那这个时候只需将 -Duse.cloud.namespace.parsing=false 便可。
关于 endpoint ,也主要从 endpoint 的设计背景 和 endpoint 的参数初始化 两个方面来讨论。
当 nacos server 集群须要扩缩容时,客户端须要有一种能力可以及时感知到集群发生变化。及时感知到集群的变化是经过 endpoint 来实现的。也即客户端会定时的向 endpoint 发送请求来更新客户端内存中的集群列表。
Nacos Client 提供一种能够对传入的 endpoint 参数规则解析的能力。即当经过构造函数的 properties 来初始化 endpoint 时,指定的 endpoint 值能够是一个具体的值,也能够是一个占位符的形式,以下所示:
${endpoint.options: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 参数规则解析的时候,这个时候就以用户态在构造 Nacos Client 时经过 properties 参数输入的 endpoint 值为主。
默认状况下, Nacos Client 是开启 endpoint 参数规则解析的能力。若是你想关闭该能力,可在 Nacos Client 初始化的时候在传入的 properties 实例中指定 key 为 isUseEndpointParsingRule,值为 false 便可关闭。
本文做者:彭兵庭,花名得少,GitHub ID @pbting,阿里巴巴高级开发工程师,主要研究方向分布式系统中间件,致力于打造一套通用的分布式系统中间件开发框架,下降分布式系统中间件的开发门槛。Spring Cloud Alibab 和 Nacos 开源项目 committer。目前在软负载团队参与产品架构升级的相关工做。
本文为云栖社区原创内容,未经容许不得转载。