当下,分布式系统正变得越来越重要,大型网站几乎都是分布式的。分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。

CAP定理,又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择)

根据该定理,分布式系统只能满足三项中的两项而不可能满足全部三项。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

说回服务注册中心。分布式系统服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个系统,都可能存在众多服务提供者和消费者,为了支持弹性扩缩容特性,一个分布式微服务的数量和分布情况往往是动态变化的,且无法预先确定的。因此,原本在单体应用阶段常用的静态LoadBalance机制就不再适用了,需要引入额外的组件来管理服务的注册与发现,而这个组件就是服务注册中心。

当下业内开源服务注册中心产品主要有以下几个:

-- Nacos Eureka Consul Zookeeper
一致性协议 CP+AP AP CP CP
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd Keep Alive
负载均衡策略 权重/metadata/Selector Ribbon Fabio
雪崩保护
自动注销实例 支持 支持 不支持 支持
访问协议 HTTP/DNS HTTP HTTP/DNS TCP
监听支持 支持 支持 支持 支持
多数据中心 支持 支持 支持 不支持
跨注册中心同步 支持 不支持 支持 不支持
SpringCloud集成 支持 支持 支持 支持
Dubbo集成 支持 不支持 不支持 支持
K8S集成 支持 不支持 支持 不支持

Zookeeper

Zookeeper作为老牌的服务注册中心产品,其遵循的是CP原则,即设计了A。即任何时候对 Zookeeper 的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是 Zookeeper 不能保证每次服务请求都是可达的。

从 Zookeeper 的实际应用情况来看,在使用 Zookeeper 获取服务列表时,如果此时的 Zookeeper 集群中的 Leader 宕机了,该集群就要进行 Leader 的选举,又或者 Zookeeper 集群中半数以上服务器节点不可用(例如有三个节点,如果节点一检测到节点三挂了 ,节点二也检测到节点三挂了,那这个节点才算是真的挂了),那么将无法处理该请求。所以说,Zookeeper 不能保证服务可用性。

Consul

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X)。

Consul 内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等),使用起来也较为简单。

Consul 也是遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比Zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了。

Eureka

Spring Cloud Netflix 在设计 Eureka 时就紧遵AP原则(尽管现在2.0发布了,但是由于其闭源的原因 ,但是目前 Ereka 1.x 任然是比较活跃的)。

Eureka Server 也可以运行多个实例来构建集群,解决单点问题,但不同于 ZooKeeper 的选举 leader 的过程,Eureka Server 采用的是Peer to Peer 对等通信。这是一种去中心化的架构,无 master/slave 之分,每一个 Peer 都是对等的。在这种架构风格中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的 serviceUrl 指向其他节点。每个节点都可被视为其他节点的副本。

在集群环境中如果某台 Eureka Server 宕机,Eureka Client 的请求会自动切换到新的 Eureka Server 节点上,当宕机的服务器重新恢复后,Eureka 会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会在节点间进行复制(replicate To Peer)操作,将请求复制到该 Eureka Server 当前所知的其它所有节点中。

当一个新的 Eureka Server 节点启动后,会首先尝试从邻近节点获取所有注册列表信息,并完成初始化。Eureka Server 通过 getEurekaServiceUrls() 方法获取所有的节点,并且会通过心跳契约的方式定期更新。

默认情况下,如果 Eureka Server 在一定时间内没有接收到某个服务实例的心跳(默认周期为30秒),Eureka Server 将会注销该实例(默认为90秒, eureka.instance.lease-expiration-duration-in-seconds 进行自定义配置)。当 Eureka Server 节点在短时间内丢失过多的心跳时,那么这个节点就会进入自我保护模式。

Eureka的集群中,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

  1. Eureka不再从注册表中移除因为长时间没有收到心跳而过期的服务;

  2. Eureka仍然能够接受新服务注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用);

  3. 当网络稳定时,当前实例新注册的信息会被同步到其它节点中;

因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使得整个注册服务瘫痪。

Nacos

最后来说Nacos。Nacos是阿里开源的,Nacos 支持基于 DNS 和基于 RPC 的服务发现。在Spring Cloud中使用Nacos,只需要先下载 Nacos 并启动 Nacos server,Nacos只需要简单的配置就可以完成服务的注册发现。

Nacos除了服务的注册发现之外,还支持动态配置服务。动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

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可以很好的解决不同场景的业务需求。

一句话概括就是Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。

在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是 Zookeeper 设计紧遵CP原则的重要原因。但是对于服务发现来说,情况就不太一样了,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的,消费者虽然拿到可能不正确的服务实例信息后尝试消费一下,也要胜过因为无法获取实例信息而不去消费,导致系统异常要好。从这一点上来说,分布式服务注册中心AP模式要更优于CP模式。这也是为什么越来越多的人抛弃Zookeeper的原因所在。

总之,服务注册中心到底选用CP模型还是AP模型,还是要依照业务场景进行决定,如果对数据一致性要求较高,且可以容忍一定时间的不可用,就选用CP模型。反之,如果可以容忍一定时延的数据不一致性,但不能容忍不可用显现发生,则要选用AP模型。

服务注册中心AP和CP区别【Nacos|Eureka|Consul|Zookeeper】相关推荐

  1. Nacos中服务注册中心AP、CP模式实现,AP、CP模式切换

    本文分析Nacos基于Nacos 2.0 Nacos中服务注册中心默认是AP模式,如果设置为CP模式 那么客户端设置 spring.cloud.nacos.discovery.ephemeral=fa ...

  2. 为什么我们要把服务注册发现改为阿里巴巴的Nacos而不用 ZooKeeper?

    站在未来的路口,回望历史的迷途,常常会很有意思,因为我们会不经意地兴起疯狂的念头,例如如果当年某事提前发生了,而另外一件事又没有发生会怎样?一如当年的奥匈帝国皇位继承人斐迪南大公夫妇如果没有被塞尔维亚 ...

  3. SpringCloud的服务注册中心(三) - 进一步了解 Eureka

    一.服务治理参与者 服务注册中心: eureka-server 服务提供者:HELLO-SERVICE 服务消费者 :HELLO-CONSUMER 很多时候,客户端既是服务提供者又是服务消费者,-&g ...

  4. 服务注册与配置一站式管理神器Nacos(一)-- 优势及功能特性

    可能大家在开发过程中都接触过这两类工具: 一类是注册中心,主要负责服务的注册登记与发现.例如Zookeeper,Eureka等. 一类是配置中心,主要负责维护各个微服务的配置文件内容.例如Apollo ...

  5. 如何优化Spring Cloud微服务注册中心架构?

    作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...

  6. consul服务注册中心

    一.consul 服务注册中心 官网地址:https://www.consul.io/ Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现.服务隔离.服务配置,这些 ...

  7. 服务注册与发现 — 选择 CP 还是 AP?

    概述 为什么要使用服务发现 假设您正在编写一些代码,这些代码将调用具有 REST API 的服务.为了发出请求,您的代码需要知道服务实例的网络位置(IP 地址和端口).在物理硬件上运行的传统应用程序中 ...

  8. 无敌的服务注册中心Spring CloudAlibaba Nacos不进来看一看吗?

    目录​​​​​​​ 1.Nacos概述 2.Nacos安装运行 安装 运行 3.Nacos作为服务注册中心 服务提供者order-service 服务消费者user-service 4.Nacos作为 ...

  9. Spring Cloud Alibaba教程:使用Nacos作为服务注册中心

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 什么是Nacos? Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易 ...

最新文章

  1. 基于深度学习的目标检测算法综述(从R-CNN到Mask R-CNN)
  2. mdcsoft服务器网络安全解决方案-SQL注入解决
  3. sanic官方文档解析之下载和Configuration
  4. 浏览器返回错误汇总分析
  5. querydsl动态 sql_Spring data jpa 复杂动态查询方式总结
  6. 物联网模式下的污水处理前景分析
  7. 区块链软件公司:区块链技术的应用
  8. 【渝粤教育】广东开放大学 社会学概论 形成性考核 (50)
  9. ubantu 系统安装apache 和mysql
  10. 元气骑士 自建服务器,元气骑士远程联机步骤教程一览
  11. php农历生日计算,php实现的农历算法实例
  12. (附源码)计算机毕业设计SSM快递代收系统
  13. NNDL 实验七 循环神经网络(1)RNN记忆能力实验
  14. 东莞爱维EVER总线步进电机驱动器profinet连接实例
  15. 计算一个有向图中出度为零和入度为零的顶点个数
  16. 飞书开发API的调用
  17. elasticSearch Alternatively use a keyword field instead.
  18. Makefile 读书笔记
  19. 基于python及图像识别的围棋棋盘棋子识别4——源码及使用说明
  20. SKU逻辑 vue实现一起学习交流

热门文章

  1. 克里金插值(Kriging)在MATLAB中的实现【优化】
  2. Windows上使用“LogView”打开大文件
  3. css超出字数展示点点点css限制字数超出部份显示点点点
  4. Solidworks二次开发-连接solidworks
  5. sae新浪云开发者认证
  6. 左程云 - 大厂刷题班 - 绳子覆盖最多的点
  7. Stata:正则表达式教程
  8. 一文读懂元宇宙生态Plato Farm,治理通证PLATO的价值
  9. JavaFX- Hyperlink
  10. 2D 游戏引擎 全纪录