ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?

沙海 2021年6月1日04:28:55Java评论40字数 5342阅读17分48秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/27961.html

服务注册中心本质上是为了解耦服务提供者和服务消费者。Nacos除了服务的注册发现之外,还支持动态配置服务。动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。文章源自JAVA秀-https://www.javaxiu.com/27961.html

原文约 3833 | 图片 4 | 建议阅读 8 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/27961.html

ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?

架构师专栏 文章源自JAVA秀-https://www.javaxiu.com/27961.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/27961.html

#架构进阶105文章源自JAVA秀-https://www.javaxiu.com/27961.html

#开源工具31文章源自JAVA秀-https://www.javaxiu.com/27961.html

#历史专栏243文章源自JAVA秀-https://www.javaxiu.com/27961.html

大家好,我是磊哥。文章源自JAVA秀-https://www.javaxiu.com/27961.html

服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。文章源自JAVA秀-https://www.javaxiu.com/27961.html

注 意文章源自JAVA秀-https://www.javaxiu.com/27961.html

 文末有:3625页互联网大厂面试题 文章源自JAVA秀-https://www.javaxiu.com/27961.html

CAP理论

CAP理论是分布式架构中重要理论文章源自JAVA秀-https://www.javaxiu.com/27961.html

1、 一致性(Consistency) (所有节点在同一时间具有相同的数据)文章源自JAVA秀-https://www.javaxiu.com/27961.html

2、 可用性(Availability) (保证每个请求不管成功或者失败都有响应)文章源自JAVA秀-https://www.javaxiu.com/27961.html

3、 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)文章源自JAVA秀-https://www.javaxiu.com/27961.html

关于 P 的理解,我觉得是在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用,而可用性是,某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求,CAP 不可能都取,只能取其中2个原因是 如果C是第一需求的话,那么会影响A的性能,因为要数据同步,不然请求结果会有差异,但是数据同步会消耗时间,期间可用性就会降低。文章源自JAVA秀-https://www.javaxiu.com/27961.html

如果A是第一需求,那么只要有一个服务在,就能正常接受请求,但是对与返回结果变不能保证,原因是,在分布式部署的时候,数据一致的过程不可能想切线路那么快。文章源自JAVA秀-https://www.javaxiu.com/27961.html

再如果,同事满足一致性和可用性,那么分区容错就很难保证了,也就是单点,也是分布式的基本核心,好了,明白这些理论,就可以在相应的场景选取服务注册与发现了文章源自JAVA秀-https://www.javaxiu.com/27961.html

服务注册中心解决方案

设计或者选型一个服务注册中心,首先要考虑的就是服务注册与发现机制。纵观当下各种主流的服务注册中心解决方案,大致可归为三类:文章源自JAVA秀-https://www.javaxiu.com/27961.html

1、 应用内:直接集成到应用中,依赖于应用自身完成服务的注册与发现,最典型的是Netflix提供的Eureka文章源自JAVA秀-https://www.javaxiu.com/27961.html

2、 应用外:把应用当成黑盒,通过应用外的某种机制将服务注册到注册中心,最小化对应用的侵入性,比如Airbnb的SmartStack,HashiCorp的Consul文章源自JAVA秀-https://www.javaxiu.com/27961.html

3、 DNS:将服务注册为DNS的SRV记录,严格来说,是一种特殊的应用外注册方式,SkyDNS是其中的代表文章源自JAVA秀-https://www.javaxiu.com/27961.html

注1:对于第一类注册方式,除了Eureka这种一站式解决方案,还可以基于ZooKeeper或者Etcd自行实现一套服务注册机制,这在大公司比较常见,但对于小公司而言显然性价比太低。文章源自JAVA秀-https://www.javaxiu.com/27961.html

注2:由于DNS固有的缓存缺陷,本文不对第三类注册方式作深入探讨。文章源自JAVA秀-https://www.javaxiu.com/27961.html

除了基本的服务注册与发现机制,从开发和运维角度,至少还要考虑如下五个方面:文章源自JAVA秀-https://www.javaxiu.com/27961.html

  • 测活:服务注册之后,如何对服务进行测活以保证服务的可用性?文章源自JAVA秀-https://www.javaxiu.com/27961.html

  • 负载均衡:当存在多个服务提供者时,如何均衡各个提供者的负载?文章源自JAVA秀-https://www.javaxiu.com/27961.html

  • 集成:在服务提供端或者调用端,如何集成注册中心?文章源自JAVA秀-https://www.javaxiu.com/27961.html

  • 运行时依赖:引入注册中心之后,对应用的运行时环境有何影响?文章源自JAVA秀-https://www.javaxiu.com/27961.html

  • 可用性:如何保证注册中心本身的可用性,特别是消除单点故障?文章源自JAVA秀-https://www.javaxiu.com/27961.html

主流注册中心产品

软件产品特性并非一成不变,如果发现功能特性有变更,欢迎评论指正文章源自JAVA秀-https://www.javaxiu.com/27961.html

ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?文章源自JAVA秀-https://www.javaxiu.com/27961.html

82_1.png文章源自JAVA秀-https://www.javaxiu.com/27961.html

Consul是支持自动注销服务实例, 请见文档:https://www.consul.io/api-docs/agent/service,在check的 DeregisterCriticalServiceAfter 这个参数-- 感谢@超帅的菜鸟博主提供最新信息文章源自JAVA秀-https://www.javaxiu.com/27961.html

新版本的Dubbo也扩展了对 Consul 的支持。参考: https://github.com/apache/dubbo/tree/master/dubbo-registry文章源自JAVA秀-https://www.javaxiu.com/27961.html

Apache Zookeeper -> CP文章源自JAVA秀-https://www.javaxiu.com/27961.html

与 Eureka 有所不同,Apache Zookeeper 在设计时就紧遵CP原则,即任何时候对 Zookeeper 的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是 Zookeeper 不能保证每次服务请求都是可达的。文章源自JAVA秀-https://www.javaxiu.com/27961.html

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

当然,在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是 Zookeeper 设计紧遵CP原则的另一个原因。文章源自JAVA秀-https://www.javaxiu.com/27961.html

但是对于服务发现来说,情况就不太一样了,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。文章源自JAVA秀-https://www.javaxiu.com/27961.html

因为对于服务消费者来说,能消费才是最重要的,消费者虽然拿到可能不正确的服务实例信息后尝试消费一下,也要胜过因为无法获取实例信息而不去消费,导致系统异常要好(淘宝的双十一,京东的618就是紧遵AP的最好参照)。文章源自JAVA秀-https://www.javaxiu.com/27961.html

当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30~120s,而且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。文章源自JAVA秀-https://www.javaxiu.com/27961.html

在云部署环境下, 因为网络问题使得zk集群失去master节点是大概率事件,虽然服务能最终恢复,但是漫长的选举事件导致注册长期不可用是不能容忍的。文章源自JAVA秀-https://www.javaxiu.com/27961.html

Spring Cloud Eureka -> AP

ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?文章源自JAVA秀-https://www.javaxiu.com/27961.html

Spring Cloud Netflix 在设计 Eureka 时就紧遵AP原则(尽管现在2.0了,但是由于其闭源的原因 ,但是目前 Ereka 1.x 任然是比较活跃的)。文章源自JAVA秀-https://www.javaxiu.com/27961.html

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

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

当一个新的 Eureka Server 节点启动后,会首先尝试从邻近节点获取所有注册列表信息,并完成初始化。Eureka Server 通过 getEurekaServiceUrls() 方法获取所有的节点,并且会通过心跳契约的方式定期更新。文章源自JAVA秀-https://www.javaxiu.com/27961.html

默认情况下,如果 Eureka Server 在一定时间内没有接收到某个服务实例的心跳(默认周期为30秒),Eureka Server 将会注销该实例(默认为90秒, eureka.instance.lease-expiration-duration-in-seconds 进行自定义配置)。文章源自JAVA秀-https://www.javaxiu.com/27961.html

当 Eureka Server 节点在短时间内丢失过多的心跳时,那么这个节点就会进入自我保护模式。文章源自JAVA秀-https://www.javaxiu.com/27961.html

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

1、 Eureka不再从注册表中移除因为长时间没有收到心跳而过期的服务;文章源自JAVA秀-https://www.javaxiu.com/27961.html

2、 Eureka仍然能够接受新服务注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用);文章源自JAVA秀-https://www.javaxiu.com/27961.html

3、 当网络稳定时,当前实例新注册的信息会被同步到其它节点中;文章源自JAVA秀-https://www.javaxiu.com/27961.html

因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使得整个注册服务瘫痪。文章源自JAVA秀-https://www.javaxiu.com/27961.html

Consul

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X)。文章源自JAVA秀-https://www.javaxiu.com/27961.html

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

Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。文章源自JAVA秀-https://www.javaxiu.com/27961.html

ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?文章源自JAVA秀-https://www.javaxiu.com/27961.html

Consul本质上属于应用外的注册方式,但可以通过SDK简化注册流程。而服务发现恰好相反,默认依赖于SDK,但可以通过Consul Template(下文会提到)去除SDK依赖。文章源自JAVA秀-https://www.javaxiu.com/27961.html

ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?文章源自JAVA秀-https://www.javaxiu.com/27961.html

Consul Template

Consul,默认服务调用者需要依赖Consul SDK来发现服务,这就无法保证对应用的零侵入性。文章源自JAVA秀-https://www.javaxiu.com/27961.html

所幸通过Consul Template,可以定时从Consul集群获取最新的服务提供者列表并刷新LB配置(比如nginx的upstream),这样对于服务调用者而言,只需要配置一个统一的服务调用地址即可。文章源自JAVA秀-https://www.javaxiu.com/27961.html

Consul强一致性(C)带来的是:文章源自JAVA秀-https://www.javaxiu.com/27961.html

1、 服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功文章源自JAVA秀-https://www.javaxiu.com/27961.html

2、 Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。文章源自JAVA秀-https://www.javaxiu.com/27961.html

Eureka保证高可用(A)和最终一致性:文章源自JAVA秀-https://www.javaxiu.com/27961.html

1、 服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功文章源自JAVA秀-https://www.javaxiu.com/27961.html

2、 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。文章源自JAVA秀-https://www.javaxiu.com/27961.html

其他方面,eureka就是个servlet程序,跑在servlet容器中; Consul则是go编写而成。文章源自JAVA秀-https://www.javaxiu.com/27961.html

Nacos

Nacos是阿里开源的,Nacos 支持基于 DNS 和基于 RPC 的服务发现。在Spring Cloud中使用Nacos,只需要先下载 Nacos 并启动 Nacos server,Nacos只需要简单的配置就可以完成服务的注册发现。文章源自JAVA秀-https://www.javaxiu.com/27961.html

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

一句话概括就是Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。文章源自JAVA秀-https://www.javaxiu.com/27961.html

来源:https://sourl.cn/sXYrZ6文章源自JAVA秀-https://www.javaxiu.com/27961.html

文章源自JAVA秀-https://www.javaxiu.com/27961.html

近期技术热文文章源自JAVA秀-https://www.javaxiu.com/27961.html

1、SpringBoot集成Swagger-Bootstrap-UI,页面更清爽!2、美团实习面试:熟悉红黑树?能不能手写一下?3、CTO说:Service 层和 Dao 的接口是不是多此一举?4、Spring 官宣,换掉 JVM,用上 GraalVM文章源自JAVA秀-https://www.javaxiu.com/27961.html

第3版:互联网大厂面试题文章源自JAVA秀-https://www.javaxiu.com/27961.html

包括 Java 集合、JVM、多线程、并发编程、设计模式、算法调优、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!文章源自JAVA秀-https://www.javaxiu.com/27961.html

阅读原文: 高清 7701页大厂面试题  PDF文章源自JAVA秀-https://www.javaxiu.com/27961.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/27961.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定