先说结论:结合某大型医院的真实架构考虑设计,最终还是决定选用Eureka.
具体原因:
对比
在分布式系统中有个著名的CAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);
Zookeeper
Zookeeper是基于CP来设计的,即任何时刻对Zookeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是它不能保证每次服务请求的可用性。从实际情况来分析,在使用Zookeeper获取服务列表时,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。所以说,Zookeeper不能保证服务可用性。
诚然,在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是zookeeper设计成CP的原因。但是对于服务发现场景来说,情况就不太一样了:针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的——拿到可能不正确的服务实例信息后尝试消费一下,也好过因为无法获取实例信息而不去消费。(尝试一下可以快速失败,之后可以更新配置并重试)所以,对于服务发现而言,可用性比数据一致性更加重要——AP胜过CP。
Eureka
而Spring Cloud Netflix在设计Eureka时遵守的就是AP原则。Eureka Server也可以运行多个实例来构建集群,解决单点问题,但不同于ZooKeeper的选举leader的过程,Eureka Server采用的是Peer to Peer对等通信。这是一种去中心化的架构,无master/slave区分,每一个Peer都是对等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。每个节点都可被视为其他节点的副本。
如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer(节点间复制)操作,将请求复制到其他Eureka Server当前所知的所有节点中。
一个新的Eureka Server节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。Eureka Server通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果Eureka Server在一定时间内没有接收到某个服务实例的心跳,Eureka Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。
什么是自我保护模式?默认配置下,如果Eureka Server每分钟收到心跳续约的数量低于一个阈值(instance的数量(60/每个instance的心跳间隔秒数)自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学前面提到过,那就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation = false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔,eureka.server.renewal-percent-threshold可以用来修改自我保护系数(默认0.85)。
总结
ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。
所以理论上Eureka是更适合作注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。
当然话说回来,毕竟Eureka是spring cloud的官方推荐,虽然现在2.X的Eureka闭源但是spring cloud 一直使用的是1.X的Eureka,Spring Cloud并不强依赖Eureka,Spring Cloud Commons实现了通用抽象,允许我们使用自己喜欢的服务发现组件!
分享到:
相关推荐
软件架构说明 springcloud-common 公共模块 springcloud-order-AT 订单服务 springcloud-product-AT 商品库存服务 springcloud-consumer-AT 消费调用者 springcloud-business-Tcc 工商银行服务 springcloud-...
业务层为:seata-springcloud-business 基础服务层: seata-springcloud-account、seata-springcloud-order、seata-springcloud-storage 数据库 CREATE TABLE `BUSINESS_ACCOUNT` ( `accountId` varchar(32) NOT ...
在Tedu5阶段的学习过程中,关于Spring Cloud Alibaba的入门课程中提到了一系列针对`business order cart stock`四个模块的操作,具体包括: 1. **删除Module** - 首先,在IDEA(集成开发环境)中删除相应的Maven...
【描述】"毕业设计之SpringCloud-B2C电子商务平台App端" 暗示这是一份毕业生的最终项目,它专注于移动客户端的开发,与B2C(Business-to-Consumer)模式相适应,即商家直接面向消费者销售产品或服务。在这样的平台上...
【标题】"精品--毕业设计之SpringCloud-B2C电子商务平台App端.zip"涉及的核心知识点是基于SpringCloud构建的B2C(Business-to-Consumer)电子商务应用程序。SpringCloud是一款微服务开发工具,它为开发者提供了在...
在毕业设计中,开发一个基于SpringCloud的B2C(Business-to-Consumer)电子商务平台服务端,是深入理解和实践微服务架构的良好实践。SpringCloud是一个框架集合,它为开发者提供了在分布式系统(如配置管理、服务...
【标题】"毕业设计&课设--SpringCloud-B2C电子商务平台App端"指的是一个基于SpringCloud框架构建的B2C(Business-to-Consumer)电子商务应用程序的毕业设计项目。SpringCloud是一个微服务开发工具集,它为开发者提供...
【标题】"Java毕业设计之SpringCloud-B2C电子商务平台服务端"是一个基于Java技术栈,采用SpringCloud框架构建的B2C(Business-to-Consumer)电子商务系统的后端部分。这个项目旨在展示如何利用微服务架构来设计和...
# 基于Spring Cloud Alibaba的仿12306售票系统 ## 项目简介 本项目是一个仿照12306售票系统的微服务项目,采用Spring Cloud Alibaba、Spring Boot 3、JDK 17、MySQL、Redis、Nacos、Sentinel、Seata、RocketMQ等...
【标题】"毕业设计&课设--SpringCloud-B2C电子商务平台服务端.zip"揭示了本次项目的核心技术栈——SpringCloud,以及项目类型——B2C(Business-to-Consumer)电子商务平台的服务端开发。SpringCloud是微服务架构的...
Readers will learn different Spring Cloud capabilities and also realize the use of Docker for containerization and of Mesos and Marathon for compute resource abstraction and cluster-wide control, ...
Building Modern Business Applications Reactive Cloud Architecture for Java, Spring, and PostgreSQL (Peter Royal) .png 改后缀名pdf
1. **Spring Boot 2.0**: Spring Boot 是一个快速开发框架,它简化了创建独立的、生产级别的基于Spring的应用程序。Spring Boot 2.0是其一个重要版本,引入了诸多增强特性,如更好的性能、改进的健康检查、对Java 11...