Nacos 架构
基本架构及概念
服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
服务注册中心 (Service Registry)
服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据
服务提供方 (Service Provider)
是指提供可复用和可调用服务的应用方
服务消费方 (Service Consumer)
是指会发起对某个服务调用的应用方
配置 (Configuration)
在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。
配置管理 (Configuration Management)
在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。
名字服务 (Naming Service)
提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。
配置服务 (Configuration Service)
在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。
更多概念...
逻辑架构及其组件介绍
- 服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能
- 配置管理:实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能
- 元数据管理:提供元数据CURD 和打标能力
- 插件机制:实现三个模块可分可合能力,实现扩展点SPI机制
- 事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑
- 日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档
- 回调机制:sdk通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性
- 寻址模式:解决ip,域名,nameserver、广播等多种寻址模式,需要可扩展
- 推送通道:解决server与存储、server间、server与sdk间推送性能问题
- 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性
- 流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制
- 缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具
- 启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI
- 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制
- 存储模块:解决数据持久化、非持久化存储,解决数据分片问题
- Nameserver:解决namespace到clusterid的路由问题,解决用户环境与nacos物理环境映射问题
- CMDB:解决元数据存储,与三方cmdb系统对接问题,解决应用,人,资源关系
- Metrics:暴露标准metrics数据,方便与三方监控系统打通
- Trace:暴露标准trace,方便与SLA系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通
- 接入管理:相当于阿里云开通服务,分配身份、容量、权限过程
- 用户管理:解决用户管理,登录,sso等问题
- 权限管理:解决身份识别,访问控制,角色管理等问题
- 审计系统:扩展接口方便与不同公司审计系统打通
- 通知系统:核心数据变更,或者操作,方便通过SMS系统打通,通知到对应人数据变更
- OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成
- Console:易用控制台,做服务管理、配置管理等操作
- SDK:多语言sdk
- Agent:dns-f类似模式,或者与mesh等方案集成
- CLI:命令行对产品进行轻量化管理,像git一样好用
领域模型
数据模型
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
服务领域模型
配置领域模型
围绕配置,主要有两个关联的实体,一个是配置变更历史,一个是服务标签(用于打标分类,方便索引),由 ID 关联。
类视图
Nacos-SDK 类视图
服务部分待续
构建物、部署及启动模式
两种交付工件
Nacos 支持标准 Docker 镜像(TODO: 0.2版本开始支持)及 zip(tar.gz)压缩包的构建物。
两种启动模式
Nacos 支持将注册中心(Service Registry)与配置中心(Config Center) 在一个进程合并部署或者将2者分离部署的两种模式。
免费的公有云服务模式
除了您自己部署和启动 Nacos 服务之外,在云计算时代,Nacos 也支持公有云模式,在阿里云公有云的商业产品(如ACM, EDAS) 中会提供 Nacos 的免费的公有云服务。我们也欢迎和支持其他的公有云提供商提供 Nacos 的公有云服务。
Nacos 快速开始
这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 Nacos。
0.版本选择
您可以在Nacos的release notes及博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为1.3.1。
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
2.下载源码或者安装包
你可以通过源码和发行包两种方式来获取 Nacos。
从 Github 上下载源码方式
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
下载编译后压缩包方式
您可以从 最新稳定版本 下载 nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.启动服务器
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令:
cmd startup.cmd
或者双击startup.cmd运行文件。
4.服务注册&发现和配置管理
服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
5.关闭服务器
Linux/Unix/Mac
sh shutdown.sh
Windows
cmd shutdown.cmd
或者双击shutdown.cmd运行文件。
Nacos 系统参数介绍
Nacos Server
对于Server端来说,一般是设置在{nacos.home}/conf/application.properties
里,如果参数名后标注了(-D)的,则表示是 JVM 的参数,需要在{nacos.home}/bin/startup.sh
里进行相应的设置。例如像设置 nacos.home 的值,可以在{nacos.home}/bin/startup.sh
进行如下设置:
JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"
全局参数
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
nacos.home(-D) | Nacos的根目录 | 目录路径 | Nacos安装的目录 | >= 0.1.0 |
nacos.standalone(-D) | 是否在单机模式 | true/false | false | >= 0.1.0 |
nacos.functionMode(-D) | 启动模式,支持只启动某一个模块,不设置时所有模块都会启动 | config/naming/空 | 空 | >= 0.9.0 |
nacos.inetutils.prefer-hostname-over-ip |
cluster.conf 里是否应该填hostname
|
true/false | false | >= 0.3.0 |
nacos.inetutils.ip-address | 本机IP,该参数设置后,将会使用这个IP去cluster.conf 里进行匹配,请确保这个IP的值在cluster.conf 里是存在的 |
本机IP | null | >= 0.3.0 |
nacos.security.ignore.urls | 控制台鉴权跳过的接口 | 需要跳过控制台鉴权的接口列表 | 空 | >= 0.9.0 |
Naming模块
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
nacos.naming.data.warmup | 是否在Server启动时进行数据预热 | true/false | false | >= 1.0.2 |
nacos.naming.expireInstance | 是否自动摘除临时实例 | true/false | true | >= 1.0.2 |
nacos.naming.distro.taskDispatchPeriod | 同步任务生成的周期,单位为毫秒 | 正整数 | 200 | >= 1.0.2 |
nacos.naming.distro.batchSyncKeyCount | 同步任务每批的key的数目 | 正整数 | 1000 | >= 1.0.2 |
nacos.naming.distro.syncRetryDelay | 同步任务失败的重试间隔,单位为毫秒 | 正整数 | 5000 | >= 1.0.2 |
除了上面列到的在application.properties
里配置的属性,还有一些可以在运行时调用接口来进行调节,这些参数都在Open API里的查看系统当前数据指标
这个API里有声明。
Config模块
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
db.num | 数据库数目 | 正整数 | 0 | >= 0.1.0 |
db.url.0 | 第一个数据库的URL | 字符串 | 空 | >= 0.1.0 |
db.url.1 | 第二个数据库的URL | 字符串 | 空 | >= 0.1.0 |
db.user | 数据库连接的用户名 | 字符串 | 空 | >= 0.1.0 |
db.password | 数据库连接的密码 | 字符串 | 空 | >= 0.1.0 |
CMDB模块
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
nacos.cmdb.loadDataAtStart | 是否打开CMDB | true/false | false | >= 0.7.0 |
nacos.cmdb.dumpTaskInterval | 全量dump的间隔,单位为秒 | 正整数 | 3600 | >= 0.7.0 |
nacos.cmdb.eventTaskInterval | 变更事件的拉取间隔,单位为秒 | 正整数 | 10 | >= 0.7.0 |
nacos.cmdb.labelTaskInterval | 标签集合的拉取间隔,单位为秒 | 正整数 | 300 | >= 0.7.0 |
Nacos Java Client
客户端的参数分为两种,一种是通过-D参数进行指定的配置,一种是构造客户端时,通过Properties
对象指定的配置,以下没有带-D标注的都是通过Properties
注入的配置。
通用参数
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
endpoint | 连接Nacos Server指定的连接点,可以参考文档 | 域名 | 空 | >= 0.1.0 |
endpointPort | 连接Nacos Server指定的连接点端口,可以参考文档 | 合法端口号 | 空 | >= 0.1.0 |
namespace | 命名空间的ID | 命名空间的ID | config模块为空,naming模块为public | >= 0.8.0 |
serverAddr | Nacos Server的地址列表,这个值的优先级比endpoint高 | ip:port,ip:port,... | 空 | >= 0.1.0 |
nacos.logging.path(-D) | 客户端日志的目录 | 目录路径 | 用户根目录 | >= 0.1.0 |
Naming客户端
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
namingLoadCacheAtStart | 启动时是否优先读取本地缓存 | true/false | false | >= 1.0.0 |
namingClientBeatThreadCount | 客户端心跳的线程池大小 | 正整数 | 机器的CPU数的一半 | >= 1.0.0 |
namingPollingThreadCount | 客户端定时轮询数据更新的线程池大小 | 正整数 | 机器的CPU数的一半 | >= 1.0.0 |
com.alibaba.nacos.naming.cache.dir(-D) | 客户端缓存目录 | 目录路径 | {user.home}/nacos/naming | >= 1.0.0 |
com.alibaba.nacos.naming.log.level(-D) | Naming客户端的日志级别 | info,error,warn等 | info | >= 1.0.0 |
com.alibaba.nacos.client.naming.tls.enable(-D) | 是否打开HTTPS | true/false | false | >= 1.0.0 |
Config客户端
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
configLongPollTimeout(config.long-poll.timeout 1.0.1版本) | 长轮询的超时时间,单位为毫秒 | 正整数 | 30000 | >= 1.0.2 |
configRetryTime(config.retry.time 1.0.1版本) | 长轮询任务重试时间,单位为毫秒 | 正整数 | 2000 | >= 1.0.2 |
maxRetry | 长轮询的重试次数 | 正整数 | 3 | >= 1.0.2 |
enableRemoteSyncConfig | 监听器首次添加时拉取远端配置 | 布尔值 | false | >= 1.0.2 |
com.alibaba.nacos.config.log.level(-D) | Config客户端的日志级别 | info,error,warn等 | info | >= 1.0.0 |
JM.SNAPSHOT.PATH(-D) | 客户端缓存目录 | 目录路径 | {user.home}/nacos/config | >= 1.0.0 |