先说结论:结合某大型医院的真实架构考虑设计,最终还是决定选用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 ...
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
百度地图开发java源码 ...business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may b
###scaff项目基于JDK1.8,springboot-1.5.9.RELEASE ,springcloud-Dalston.RELEASE完成项目特性: 1.模块划分清晰:抽取通用模块,业务模块 2.代码规范 3.项目结构清晰 4.代码简洁:自定义注解提高开发效率能够运行...
Spring Framework has been a popular programming framework for the developer community for many years. Spring Boot removed the need to have a heavyweight application container, and provides a means to ...
Chapter 1: Setup Routine for an Enterprise Spring Application Chapter 2: Designing a Microservice Architecture with Spring MVC Chapter 3: Working with Java Persistence and Entities Chapter 4: Building...
open-smartcloud通用微服务平台:采用SpringCloud系列和alibaba产品集成;包括基本的服务支撑模块(注册中心,API网关,配置中心,监控中心,日志中心,全文搜索,基础权限模块,登录认证中心, CI/CD等等);主要用于...
While most high schoolers were out enjoying spring break and summer vacations, Will worked as an assistant on the publishing side of the business, before moving over to the technical side of the ...
(控制器,服务,实体,dto,映射器)项目结构spirngbasics├── business ------------ Spring Boot,主要业务模块,基本只放controller,默认配置不连接Cloud├── create -------------- 无需编译运行,仅用于...
OM(OPEN-MALL)电商平台是一个分布式的开源电商平台,包括前台商城平台及后台管理系统,前台商城系统包含首页门户、商品...SpringCloud:Hoxton.SR9 Mybatis-Plus:3.x 前端技术 Bootstrap:v3.3.7 Vue:v3.0 Uni-App
Cloud Greenwich.SR4 + Spring Data Moore-SR4开发,基于Maven做依赖管理。 每一个案例都是独立的SpringBoot或Java命令行应用程序,可以单独启动,避免相互干扰,但是它们公用一个Maven POM。 下载源码后,先在根...
The Spring Tool suite supports application targeting to local, virtual and cloud-based servers. It is freely available for development and internal business operations use with no time limits, fully ...
This book is intended for all Salesforce users―administrators, managers, business analysts, or report writers who are new to creating reports or dashboards within Salesforce. Basic knowledge of the ...
Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted at business people, developers and system admins. Its core is a super-fast and rock-solid BPMN 2 process ...
这项挑战定义了使用Spring Cloud的简单云方案。 我们想要创建一个服务,给定一个起源城市将返回一个路线列表,一个基于较少的连接数,而第二个基于较少的时间。 此方案的元素如下: H2:嵌入式的简单SQL数据库使用...
它与Spring完美集成,非常轻巧,基于简单的概念。 注意:我们将用于设计和编码项目的下一个主要版本的开发分支的所有内容移至master分支。 如果您想为6.x版做出贡献,请查看6.x分支。 如果您想了解有关我们存储库...
它与Spring完美集成,非常轻巧,基于简单的概念。 注意:我们将用于设计和编码项目的下一个主要版本的开发分支的所有内容移至master分支。 如果您想为6.x版做出贡献,请查看6.x分支。 如果您想了解有关我们存储库...