今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

注册中心-nacos

1.服务注册原理

注册流程
  1. spring启动首先通过自动配置初始化和实例化相关的类,在finishRefresh方中会发布web服务初始化事件,AbstractAutoServiceRegistration类订阅了该事件然后调用start方法

  2. 进而调用NacosServiceRegistry的register方法,此时会创建NamingService对象,创建过程中会提交定时心跳线程 ,`while (true)`形式向服务端发送心跳。创建完成后调用注册方法,之后通过rpc请求naco服务

  3. nacos服务启动时启动grpc BaseGrpcServer服务,通过GrpcRequestAcceptor接收请求并将处理分配给对应的RequestHandler处理。
    将注册信息保存到singletonRepository,namespaceSingletonMaps hashmap中并发送对应的事件。同时也会启动心跳检查处理器HealthCheckRequestHandler,响应客户端的心跳检查。心跳检查并没有过多的处理只是空响应。

    ConnectionManager初始化时启动定时任务,每3秒检查一次是否有过时的客户端连接。如果已经超时则执行取消注册流程。这里会主动探测一次客户端时候还能连接,如果能连接到,则会重新救活该客户端

  4. 上一步保存后,发布ClientRegisterServiceEvent ,然后被对应的监听器监听处理最后加入到ConcurrentHashMap中

  5. 延迟任务执行引擎会启动定时任务(默认100ms), 从任务集合获取任务,处理任务放入阻塞队列中

  6. 工作线程从队列中无限循环获取任务并处理,如果有服务的订阅着,将服务信息推送给订阅着

 

2.服务发现机制

订阅流程
  1. 请求服务时通过ServiceInstanceListSupplier的get方法获取对于的服务实例,然后调用NacosDiscoveryClient获取实例方法,进而调用namingService的选择实例方法
  2. 如果namingService还没初始化,则初始化。初始化和服务注册初始化一致,初始化时设置处理服务端的推送的服务注册请求,并更新服务列表
  3. 通过grpc请求nacos服务端,服务端被SubscribeServiceRequestHandler处理,将该订阅者添加到服务实例的订阅者中。并发布客户端订阅事件
  4. 发布的事件会写入到延迟队列中,此时有订阅者信息,服务端将推送服务信息给该订阅者。  客户端在SubscribeServiceRequestHandler中处理并更新服务列表
  5. 负载均衡器在获取服务实例时会判断服务时健康,如果不健康将从服务列表中移除

3.服务下线

控制台下线

控制台下线会设置Instance的属性isEnabled。操作上线下线后最终会发送服务改变事件,如果有服务的订阅着。将推送服务变更。客户端监听到之后更新服务注册表信息。

 

停止服务

停止服务会通过spring的勾字函数执行deregisterInstance方法,最终也会发送服务变更事件,从而客户端能监听到改变。

同时服务端在检测过期的连接时也会走取消注册流程最终的逻辑也是一样。

设置权重

将服务的权重设置为小于零,也可以认为是服务下线或不可用的一种方式

 

4.Distro结点同步协议

nacos针对临时服务实例,采用 AP 来保证注册中心的可用性,采用Distro 协议。当服务注册以后,会遍历集群中的其他结点调用Grpc将注册信息同步到其他结点。

服务启动时会启动全量同步和服务校验任务。用于定时校对各个结点的数据一致性

对于客户端改变事件,由DistroClientDataProcessor监听并处理,发送数据同步请求给群群的其他服务端。服务端接受并更新注册表

5. JRaft

raft是一致性共识算法,naco在实现CP一致性时使用了Jraft。如下图如果注册的是永久实例会通过http方式请求到nacos服务。通过Jraft协议提交日志。

如果当前结点是leader则直接处理,日志。如果不是则rpc异步调用到leader结点。

nacos启动时初始化raftServer(右边黄色部分)。启动注册必要的处理器。GetLeaderRequestProcessor用户处理前面的leader rpc请求。

同时会启动BatchEventProcessor线程处理日志提交,投票,和选举。

 

6.配置中心

有 DB 模式(读写分离架构)

一致性的核心是 Server 与 DB 保持数据一致性,从而保证 Server 数据一致;Server 之间都是对 等的。数据写任何一个 Server,优先持久化,持久化成功后异步通知其他节点到数据库中拉取最新 配置值,并且通知写入成功。

无 DB 模式( 内嵌数据库Derby)

Server 间采用 Raft 协议保证数据一致性

 

6.总结

以上对nacos配置中心,注册中心,一致性协议进行了代码执行主流程分析,从程序的最开始入口点切入,一步步追踪整个代码执行流程,使的在nacos的整体流程处理上有一个比较清晰的框图。

通过分析nacos源码,不难看出,驱动nacos执行的几个重要的组件是事件机制用于服务内部异步通信,Grpc用户客户端和服务端远程通信,Jraft,Distro实现复制和数据一致性。

分享到:

专栏

类型标签

网站访问总量