Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践
随着使用 Nacos 的企业越来越多,遇到的最频繁的两个问题就是:如何在我的生产环境正确的来使用 namespace 以及 endpoint。这篇文章主要就是针对这两个问题来聊聊使用 nacos 过程中关于这两个参数配置的最佳实践方式。
namespce
关于 namespace ,以下主要从 namespace 的设计背景 和 namespace 的最佳实践 两个方面来讨论。
namespace 的设计背景
namespace 的设计是 nacos 基于此做多环境以及多租户数据(配置和服务)隔离的。即:
- 从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。例如,你可能有日常,预发和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。如下图所示:
- 从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示。
注意: 该功能还在规划中。
namespace 的最佳实践
关于 namespace 的最佳实践 ,这部分主要包含有两个 Action:
- 如何来获取 namespace 的值
- namespace 参数初始化方式
如何来获取 namespace 的值
无论您是基于 Spring Cloud 或者 Dubbo 来使用 nacos,都会涉及到 namespace 的参数输入,那么这个时候 namespace 的值从哪里可以获取呢?
- 如果您在使用过程中没有感知到这个参数的输入,那么 nacos 统一会使用一个默认的 namespace 作为输入,nacos naming 会使用 public 作为默认的参数来初始化,nacos config 会使用一个空字符串作为默认的参数来初始化。。
- 如果您需要自定义自己的 namespace,那么这个值该怎么来产生?
可以在 nacos 的控制台左边功能侧看到有一个 命名空间 的功能,点击就可以看到 新建命名空间 的按钮,那么这个时候就可以创建自己的命名空间了。创建成功之后,会生成一个命名空间ID,主要是用来避免命名空间名称有可能会出现重名的情况。因此当您在应用中需要配置指定的 namespace 时,填入的是命名空间ID。重要的事情说三遍,
- 当您在应用中需要配置指定的 namespace 时,填入的是命名空间 ID
- 当您在应用中需要配置指定的 namespace 时,填入的是命名空间 ID
- 当您在应用中需要配置指定的 namespace 时,填入的是命名空间 ID
说明: namesace 为 public 是 nacos 的一个保留控件,如果您需要创建自己的 namespace,最好不要和 public 重名,以一个实际业务场景有具体语义的名字来命名,以免带来字面上不容易区分自己是哪一个 namespace。
namespace 参数初始化方式
nacos client 对 namespace 的初始化流程如下图所示:
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}。
说明:
- 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,则会从系统环境变量中变量名为 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值来初始化。
- 如果经过以上两步还没有被初始化,这时如果您设置了默认值,这个时候就会使用默认值来初始化 endpoint,否则的话以解析出来的占位符返回。
- 关闭 endpoint 参数规则解析
当关闭了 endpoint 参数规则解析的时候,这个时候就以用户态在构造 Nacos Client 时通过 properties 参数输入的 endpoint 值为主。
默认情况下, Nacos Client 是开启 endpoint 参数规则解析的能力。如果你想关闭该能力,可在 Nacos Client 初始化的时候在传入的 properties 实例中指定 key 为 isUseEndpointParsingRule,值为 false 即可关闭。
本文作者:彭兵庭,花名得少,GitHub ID @pbting,阿里巴巴高级开发工程师,主要研究方向分布式系统中间件,致力于打造一套通用的分布式系统中间件开发框架,降低分布式系统中间件的开发门槛。Spring Cloud Alibab 和 Nacos 开源项目 committer。目前在软负载团队参与产品架构升级的相关工作。
本文作者:中间件小哥
本文为云栖社区原创内容,未经允许不得转载。
Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践的更多相关文章
- 生产环境容器落地最佳实践 --JFrog 内部K8s落地旅程
引言 Kubernetes已经成为市场上事实上领先的编配工具,不仅对技术公司如此,对所有公司都是如此,因为它允许您快速且可预测地部署应用程序.动态地伸缩应用程序.无缝地推出新特性,同时有效地利用硬件资 ...
- Nacos(六):多环境下如何“管理”及“隔离”配置和服务
前言 前景回顾: Nacos(五):多环境下如何"读取"Nacos中相应环境的配置 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 现如今,在微服务体系中 ...
- Python开发程序:生产环境下实时统计网站访问日志信息
日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...
- 生产环境下一定要开启mysqlbinlog
在没有备份数据库的情况下,可以用binlog进行恢复 在生产环境下安全第一,损失一点点效率换来的安全还是值得的. http://www.cnblogs.com/zc22/archive/2013/06 ...
- mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法
mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法 满头大汗的宅鸟该怎么办呢? mysql -u root -e "show processlist"|grep -i ...
- Mysql迁移工具在生产环境下的使用
在产品迭代开发发布过程中,由于业务需求的增加,数据库难免会有结构调整等操作. 在每个版本发布过程中怎么控制每个版本server端程序与数据库版本保持一致,以及数 据库升级.回滚等操作. 本博文宅鸟将向 ...
- [原]生产环境下的nginx.conf配置文件(多虚拟主机)
[原]生产环境下的nginx.conf配置文件(多虚拟主机) 2013-12-27阅读110 评论0 我的生产环境下的nginx.conf配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在 ...
- 生产环境下JAVA进程高CPU占用故障排查
问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过, ...
- 一次生产环境下MongoDB备份还原数据
最近开发一个版本的功能当中用到了MongoDB分页,懒于造数据,于是就研究了下从生产环境上导出数据到本地来进行测试. 研究了一下,发现MongoDB的备份还原和MySQL语法还挺类似,下面请看详细介绍 ...
随机推荐
- spring cloud深入学习(三)-----服务消费
在上一篇博文中简单实现了eureka-server以及eureka-provider,后面会实现eureka-cosumer,现在针对eureka做进一步的详解. 微服务整体架构 文字再美也没有图片直 ...
- GIT → 03:Git的下载和安装
3.1 Git 下载 官网:https://git-scm.com/ 软件下载地址:https://git-scm.com/downloads 根据自己电脑版本下载对应版本: 3.2 Git 安装 3 ...
- Lua报unexpected symbol near错误
如果Lua脚本没有错误,那可能是UTF8 BOM的问题
- Leetcode74. Search a 2D Matrix搜索二维矩阵
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...
- MongoDB 定位 oplog 必须全表扫描吗?
MongoDB oplog (类似于 MySQL binlog) 记录数据库的所有修改操作,除了用于主备同步:oplog 还能玩出很多花样,比如 全量备份 + 增量备份所有的 oplog,就能实现 M ...
- Django静态文件以及模板文件的配置 jQuery v1.12.4
1.配置模板的路径 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os. ...
- Codeforces 3D
题目链接 D. Least Cost Bracket Sequence time limit per test 1 second memory limit per test 64 megabytes ...
- SEO优化步骤
SEO技术并不是简单的几个建议,而是一项需要足够耐心和细致的脑力劳动.大体上,SEO优化主要分为8小步: 1.关键词分析(也叫关键词定位) 这是进行SEO优化最重要的一环,关键词分析包括:关键词关注量 ...
- 三分钟学会在ASP.NET Core MVC 中使用Cookie
一.Cookie是什么? 我的朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!所以我们 ...
- ES6 中字符串的扩展
1. 字符的Unicode表示法 JavaScript允许采用 \uxxxx 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点. "\u0061" // 表示小写 ...