Nacos 源码分析(五) 一致性协议Distro

EphemeralConsistencyService 接口

这个为临时数据的一致性协议: 这种类型的一致性协议,不需要把数据存储到磁盘或者数据库;因为临时数据通常和服务器保持一个session会话;这个会话只要存在,数据就不会丢失。

写必须永远是成功的,即使可能会发生网络分区。当网络恢复时,每个数据分片都合并到一个set中,所以集群就是恢复成一致性的状态

distro协议的关键点:

  • distro协议是为了注册中心而创造出的协议;

  • 客户端与服务端有两个重要的交互,服务注册与心跳发送;

  • 客户端以服务为维度向服务端注册,注册后每隔一段时间向服务端发送一次心跳,心跳包需要带上注册服务的全部信息,在客户端看来,服务端节点对等,所以请求的节点是随机的;

  • 客户端请求失败则换一个节点重新发送请求;

  • 服务端节点都存储所有数据,但每个节点只负责其中一部分服务,在接收到客户端的“写“(注册、心跳、下线等)请求后,服务端节点判断请求的服务是否为自己负责,如果是,则处理,否则交由负责的节点处理;

  • 每个服务端节点主动发送健康检查到其他节点,响应的节点被该节点视为健康节点;

  • 服务端在接收到客户端的服务心跳后,如果该服务不存在,则将该心跳请求当做注册请求来处理;

  • 服务端如果长时间未收到客户端心跳,则下线该服务;

  • 负责的节点在接收到服务注册、服务心跳等写请求后将数据写入后即返回,后台异步地将数据同步给其他节点;

  • 节点在收到读请求后直接从本机获取后返回,无论数据是否为最新。

看下加载数据,新启动一个线程,调用load()方法加载数据

Nacos 源码分析(五) 一致性协议Distro_第1张图片

Nacos 源码分析(五) 一致性协议Distro_第2张图片

1.对于standalone单机模式,直接返回

2.判断如果健康server数量<=1,那么就等待直到另一个server是可用的

3.健康server数量>1,那么就尝试从远程机器同步所有的数据

Nacos 源码分析(五) 一致性协议Distro_第3张图片

4.从namingProxy代理获取所有的数据data

Nacos 源码分析(五) 一致性协议Distro_第4张图片

 4.1 构造http请求,调用httpGet方法从指定的server获取数据

4.2 从获取的结果result中获取数据bytes

Nacos 源码分析(五) 一致性协议Distro_第5张图片

5.处理数据processData

  5.1 从data反序列化出datumMap

  5.2 把数据存储到dataStore,也就是本地缓存dataMap

 5.3 监听器不包括key,就创建一个空的service,并且绑定监听器

6.监听器listener执行成功后,就更新data store

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

继续看下put方法

Nacos 源码分析(五) 一致性协议Distro_第6张图片

Nacos 源码分析(五) 一致性协议Distro_第7张图片

1.根据入参key判断,如果匹配,就新建datum,入参key和value填充这个datum;然后放到本地缓存dataMap

2.然后通知器notifier增加任务,通知这个变更

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Nacos在 1.0.0 正式支持 AP 和 CP 两种一致性协议并存。一个是基于简化的 Raft 的 CP 一致性,一个是基于自研协议 Distro 的 AP 一致性。Raft 协议基于 Leader 进行写入,其 CP 也并不是严格的,只是能保证一半所见一致,以及数据的丢失概率较小。Distro 协议则是参考了内部 ConfigServer 和开源 Eureka,在不借助第三方存储的情况下,实现基本大同小异。
Nacos 源码分析(五) 一致性协议Distro_第8张图片

Nacos 源码分析(五) 一致性协议Distro_第9张图片

 

 

 

 

你可能感兴趣的:(微服务)