Nacos - 图1
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

1. 服务

服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC | Dubbo RPC Service 或者 Spring Cloud RESTful Service。
**名字服务**
服务映射,例如 ServiceName -> Endpoints Info,Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List,服务发现和 DNS 就是名字服务的2大场景。

2. 注册中心

服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。

3. 元数据

Service Metadata
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。

4. Provider / Consumer

提供可复用和可调用服务的应用方 / 会发起对某个服务调用的应用方。

5. 配置中心

配置及管理 在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。配置变更是调整系统运行时的行为的有效手段之一。系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。

6. 逻辑架构

Nacos - 图2
Console 易用控制台,做服务管理、配置管理等操作。
SDK 多语言sdk。
Agent dns-f类似模式,或者与mesh等方案集成。
CLI 命令行对产品进行轻量化管理,像git一样好用。


OpenAPI 暴露标准Rest风格HTTP接口,简单易用,方便多语言集成。


服务管理 实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能。
配置管理 实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。
元数据管理 提供元数据CURD 和打标能力。


Nameserver 解决namespace到clusterid的路由问题,解决用户环境与nacos物理环境映射问题。
CMDB 解决元数据存储,与三方cmdb系统对接问题,解决应用,人,资源关系。
Metrics 暴露标准metrics数据,方便与三方监控系统打通。
Trace 暴露标准trace,方便与SLA系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通。
接入管理 相当于阿里云开通服务,分配身份、容量、权限过程。
用户管理 解决用户管理,登录,sso等问题。
权限管理 解决身份识别,访问控制,角色管理等问题。
审计系统 扩展接口方便与不同公司审计系统打通。
通知系统 核心数据变更,或者操作,方便通过SMS系统打通,通知到对应人数据变更。


插件机制 实现三个模块可分可合能力,实现扩展点SPI机制。
事件机制 实现异步化事件通知,sdk数据变化异步通知等逻辑。
日志模块 管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档。
回调机制 sdk通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性。
寻址模式 解决ip,域名,nameserver、广播等多种寻址模式,需要可扩展。
推送通道 解决server与存储、server间、server与sdk间推送性能问题。
容量管理 管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性。
流量管理 按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制。
缓存机制 容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具。
启动模式 按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI。
一致性协议 解决不同数据,不同一致性要求情况下,不同一致性机制。
存储模块 解决数据持久化、非持久化存储,解决数据分片问题。

7. 数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
Nacos - 图3
SDK 类视图
Nacos - 图4

8. Nacos 2.X

gRPC Rsocket 长连接RPC调用和推送能力

  • 通信层统一到 gRPC 协议,同时完善了客户端和服务端的流量控制和负载均衡能力,提升的整体吞吐。
  • 将存储和一致性模型做了充分抽象分层,架构更简单清晰,性能更加强悍。
  • 设计了可拓展的接口,提升了集成能力,如让用户扩展实现各自的安全机制。

    8.1. 服务发现升级

    一致性模型 Nacos2架构下的服务发现,客户端通过 gRPC ,发起注册服务或订阅服务的请求。服务端使用 Client 对象来记录该客户端使用 gRPC 连接发布了哪些服务,又订阅了哪些服务,并将该 Client 进行服务间同步。由于实际的使用习惯是服务到客户端的映射,即服务下有哪些客户端实例;因此2.0的服务端会通过构建索引和元数据,快速生成类似 1.X 中的 Service 信息,并将 Service 的数据通过 Grpc Stream 进行推送。

    8.2. 配置管理升级

    通讯机制 配置管理之前用 Http1.1 Keep Alive 模式30s发一个心跳模拟长链接,内存消耗大,推送性能弱。2.0 gRPC 彻底解决这些问题,内存消耗大量降低。

    8.3. 总结

  1. 客户端不再需要定时发送实例心跳,只需要有一个维持连接可用keepalive消息即可。重复TPS可以大幅降低。
  2. TCP连接断开可以被快速感知到,提升反应速度。
  3. 长连接的流式推送,比UDP更加可靠;nio的机制具有更高的吞吐量,而且由于可靠推送,可以加长客户端用于对账服务列表的时间,甚至删除相关的请求。重复的无效QPS可以大幅降低。
  4. 长连接避免频繁连接开销,可以大幅缓解TIME_ WAIT问题。
  5. 真实的长连接,解决配置模块GC问题。
  6. 更细粒度的同步内容,减少服务节点间的通信压力。

    9. 未来

    Nacos - 图5