Nacos

260 阅读6分钟

image

nacos.io/zh-cn/docs/…

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. 逻辑架构

image

  • 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。 image

SDK 类视图 image

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. 未来

image