本文主要从以下几点来带大家熟悉下 Nacos 多环境下配置管理和服务隔离
Nacos是现阶段比较流行的微服务配置中心
和注册中心
服务组件,其引入了命名空间(Namespace)的概念来进行多环境下配置管理和服务隔离。在团队中每个成员也可以共用一个Nacos服务,通过开辟个人的Namespace空间的方式,达到共享nacos资源。
解决方案:搭建共享Nacos通过Namespace对开发人员进行环境隔离。
解决方案:构建gitlab流水线通过脚本调用NacosAPI进行配置同步
解决方案:通过python -m json.tool
进行语法校验,通过调用服务接口根据返回值进行健康状态检测。
下面我们就来一步步解决这些痛点
解决这些痛点前首先需要了解一下环境隔离方案。
从多个租户的角度来看,每个租户可能会有自己的 namespace,每个租户的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。
例如分配了三个租户,分别为张三、李四和王五。张三负责A项目,李四负责B项目,王五负责C项目
分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示:
Nacos 通过 Namespace 来隔离多租户之间的服务和配置,而且它具有很好的扩展性
假设公司发展迅速业务调整,张三负责A项目、B项目、C项目,李四负责D项目、E项目、F项目,王五负责G项目、H项目、I项目,
而每个项目又分了dev、test、prod三个环境,继续沿用之前的Namespace隔离租户方案,显得有些管理不便,这时候可以在NameSpace中加入Group进行项目环境分组,如图:
项目数>环境数
时)可以通过Group进行项目分组,如下图:通过上面的理论分析,可以看出该方案有很好的扩展性。
下面我们通过脚本来实践一下。
将用户账号写入 users
,提交 master 分支后会自动
在共享 Nacos 创建命名空间。
通过脚本调用使用Nacos的Api来实现,下面介绍了两个关键API
Nacos API 调研
请求类型 POST
请求路径 /nacos/v1/console/namespaces
请求参数(字符串类型)
customNamespaceId
命名空间ID(必选)namespaceName
命名空间名(必选)namespaceDesc
命名空间描述请求示例:
curl -X POST 'http://localhost:8848/nacos/v1/console/namespaces'-d 'customNamespaceId=&namespaceName=dev&namespaceDesc='
请求类型 POST
请求 URL/nacos/v1/cs/configs
请求参数(字符串类型)
tenant
租户信息,对应 Nacos 的命名空间ID字段dataId
配置 ID(必选)group
配置分组(必选)content
配置内容(必选)type
配置类型请求示例:
curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs'-d 'dataId=nacos.example&group=com.alibaba.nacos&content=contentTest'
实现代码
通过循环读取users
中的用户来创建Namespace,并读取nacos-conf.json
中数据创建配置
# 自动根据用户创建命名空间
if [ $CI_COMMIT_BRANCH = "master" ]; then
namespace=($(cat users))
for url in ${nacos_url[@]}; do
for ns in ${namespace[@]}; do
echo create namespace:$ns namespace
## 创建命名空间
curl -X POST "${url}/nacos/v1/console/namespaces" -d "customNamespaceId=${ns}&namespaceName=${ns}&namespaceDesc=${ns}"
echo
done
done
## 自动发布配置
namespace=($(cat users))
config=$(cat nacos-conf.json)
dataId=gateway-route.properties
group=DEFAULT_GROUP
for url in ${nacos_url[@]}; do
echo ${url}
echo ${namespace[@]}
for ns in ${namespace[@]}; do
echo ${url}
echo ${namespace[@]}
echo create dataId:$dataId in namespace:$ns group:$group
curl --location --request POST "${url}/nacos/v1/cs/configs?tenant=${ns}&dataId=${dataId}&group=${group}" --form "content=$config"
echo
done
done
fi
根据分支绑定到不同环境的变量
实现代码
if [ $CI_COMMIT_BRANCH = "master" ]; then
export nacos_url=(
nacos.test.com:8848
...
...
)
export CHECK_URL=(
http://api-test.yizhoucp.cn/api/lanling/login
...
...
)
fi
示例 gitlab-ci.yml 如下
stages:
- deploy-nacos
deploy-nacos:
stage: deploy-nacos
tags:
- nacos
image: nacos-check:alpine3.14
script:
- cat nacos-conf.json |python -m json.tool
- ./nacos.sh
only:
refs:
- master
- deploy-test
- deploy-prod
此处用的的镜像需包含python与curl。示例 Dockerfile 如下
FROM python:3.9.9-alpine3.14
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk add --no-cache git curl bash ca-certificates
CMD ["/bin/sh"]
通过请求前面定义好的服务接口,返回字段带有code
则视为可用,反之失败。
## 健康检查
for CHECK in ${CHECK_URL[@]}; do
echo -----$CHECK
CMD=`curl ${CHECK} 2>/dev/null | grep -E 'code' | wc -l`
if [ ${CMD} -eq 1 ]; then
echo "Succ: Check proxy ${CHECK} is succeed."
# exit 0
else
echo "Fail: check proxy ${CHECK} is failed."
export erro_var=1
fi
done
fi
# echo $erro_var
if [ ${erro_var} -eq 1 ]; then
exit 1
fi
以上分析了Nacos利用Namespace进行环境隔离实践方案,同时进行了自动配置同步代码实验,达到了预期的要求。
参考与感谢:Nacos官方手册、Namespace,endpoint 最佳实践