🌑

Shawn Fux

Nacos服务注册表结构解析

Nacos 主要是用一个双层 Map 集合来保存我们的客户端服务注册实例信息的,本文主要分析这个双层 Map 是这些信息是如何与我们的环境隔离映射的。

ServiceMap

在 Nacos 1.4.1 版本的 ServiceManager 类有一个成员变量 serviceMap,这就是我们所说的服务注册表用来保存我们的实例信息。

serviceMap

假设我们有一个以下配置的客户端服务实例:

spring:
  application:
    name: demo-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: dev
        group: DEFAULT_GROUP
        cluster-name: ZG

那么它与我们的这个 serviceMap 是如何对应的了?

model

服务的分级模型

首先外层的 Map 的 Key 对应的是我们的 namespace 命名空间,而里层的 Map 的 Key 对应的是 group 分组名称,而 Service 对象内部有一个成员变量 Map<String, Cluster> clusterMap 也是一个 Map 集合,这个 clusterMap 的 Key 则对应的是 cluster-name 集群名称, Value 是一个 Cluster 对象在其内部有两个成员变量分别是 Set<Instance> persistentInstances (保存持久实例)和 Set<Instance> ephemeralInstances (临时实例)。我们真正每一个运行的具体服务实例就是一个个 Instance 对象。

— Feb 6, 2023