注册中心一般使用ap模型还是cp模型

959 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

如何注册和发现服务?

在微服务架构下,主要有三种角色:服务提供者(RPC Server)、服务消费者(RPC Client)和服务注册中心(Registry)。
RPC Server 提供服务,在启动时,根据服务发布文件 server.xml 中的配置的信息,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。
RPC Client 调用服务,在启动时,根据服务引用文件 client.xml 中配置的信息,向 Registry 订阅服务,把 Registry 返回的服务节点列表缓存在本地内存中,并与 RPC Sever 建立连接。
当 RPC Server 节点发生变更时,Registry 会同步变更,RPC Client 感知后会刷新本地内存中缓存的服务节点列表。
RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Sever 发起调用。

至此,完成了微服务架构的设计:通过注册中心进行服务治理,使用一个rpc框架在实现服务注册、服务发现、负载均衡、熔断等功能。

注册中心使用AP模型还是CP模型?

一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值。

可用性(Availability):保证每个请求不管成功或者失败都有响应。

分区容忍性(Partition-tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作。

根据CAP原则,分布式系统只能同时满足两种性质,不能三者兼顾。

zookeeperEurekaConsulNacosetcd
CPAPCPAP/CPCP

对于zk来说,并不专门用来作为注册中心,只能提供的通用树状存储结构和znode机制间接实现注册中心的必要功能。
zk中使用临时节点创建a1,a2来存储服务实例信息的节点。当服务实例关闭或通信异常,zk自动删除临时节点实现剔除机制。
但zk一旦服务挂掉,可用性会出现短暂的问题,停止服务,来换取一致性。

Eureka侧重AP,保证可用性,实现最终一致性。通过自我保护机制在网络异常的情况下保留大部分节点信息,来防止雪崩。
如果15分钟内超过85%的客户端节点没有正常心跳,eureka认为客户端和注册中心出现网络故障,eureka进入自我保护机制。

  • 不再从注册表中移除长时间没有收到心跳的服务
  • 仍然接受新服务的注册和查询,但不会同步到其他节点,等待网络稳定时同步

Nacos支持CP+AP模式,即Nacos可以根据配置识别为CP模式或AP模式,默认是AP模式。如果注册Nacos的client节点注册时ephemeral=true,那么Nacos集群对这个client节点的效果就是AP,采用distro协议实现。
注册Nacos的client节点注册时ephemeral=false,那么Nacos集群对这个节点的效果就是CP的,采用raft协议实现。根据client注册时的属性,AP,CP同时混合存在,只是对不同的client节点效果不同。Nacos可以很好的解决不同场景的业务需求。