Skip to content

Nacos核心原理

1. 注册中心核心功能

  1. 服务注册:Nacos Client会通过发送Rest请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如IP地址、端口、服务名等信息。Nacos Server收到注册请求后,就会把这些元数据信息保存到一个内存Map中。
  2. 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被删除,默认5s发送一次心跳。
  3. 服务健康检查:Nacos Server会开启一个定时任务用来检查服务实例的健康状况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现就发现不了), 如果某个实例超过30s没有收到心跳,直接删除该实例(被删除的实例如果恢复,发送心跳会重写注册服务)
  4. 服务发现:服务消费者在调用服务提供者的服务时,会发送一个Rest请求给Nacos Server, 获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务拉取服务端最新的注册表信息更新到缓存。
  5. 服务同步:Nacos集群之间会互相同步服务实例信息,用来保证服务信息一致性。

2. 注册中心架构原理

2.1 发起注册流程

Alt text 服务启动的时候注册NacosAutoServiceRegistration, 其父类实现了ApplicationListener监听事件,在Spring容器启动的时候,将客户端的信息封装,通过http请求,发送到Nacos服务端,进行服务注册。

2.2 组装注册的实例信息

入口的核心代码如下图所示,它会组装注册的实例信息,放到一个instance变量里面: Alt text 通过代码调试,我们可以看到里面的实例信息长这样: Alt text

2.3 组装注册请求request

发起注册的核心方法是doRegisterService(),组装的request如下图所示,里面有之前组装的实例信息instance,还有指定的 namespace(Nacos 的命名空间)、serviceName(服务名),groupName(Nacos的分组) Alt text

2.4 发起远程调用

Alt text equestToServer()方法里面会调用RpcClient的request()方法: 就是向Nacos发起远程调用,如果是Nacos集群,则是向集群中的某个Nacos节点发起远程调用。

  1. Nacos处理服务注册 Nacos服务器接收到服务提供者的注册请求后,会进行一系列的处理。首先,它会将服务实例信息存储在其内部维护的服务列表中。同时,为了提高查询效率,Nacos还会根据需要更新相关缓存,以便在后续的服务发现过程中能够快速响应。在存储服务实例信息时,Nacos会为每个服务实例分配一个唯一的标识,并将实例的元数据信息与该标识关联起来。
  2. 心跳机制维持服务状态
    为了保持服务状态的新鲜度,服务提供者需要定期向Nacos发送心跳包。