eureka原理简介

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eureka原理简介相关的知识,希望对你有一定的参考价值。

参考技术A

首先通过以下一幅图简单看下eureka的服务注册发现流程是什么样的:

1、服务提供者提供应用服务,注册到eureka server中。
2、服务消费者每30秒去去注册中心拉取服务的ip,端口,接口地址等信息。
3、服务消费者拉取到服务提供者的应用信息后,可以直接去调用服务提供者的接口。

服务注册的原理主要涉及到eureka server的存储结构,采用一个三层缓存的结构。具体内部的实现逻辑参考二中的图。

当服务提供者完成服务信息注册后,会维持一个心跳,定时向eureka server 发送rest请求,告诉其还活着。默认心跳间隔30s。

eureka client会定期(默认30s)向eureka server获取获取注册的服务信息,这个获取分为 全量获取 增量获取 。默认配置下,当客户端首次启动后,会向服务端发起一次全量获取并缓存本地信息,之后每隔30s发起一次增量获取,更新本地缓存

通常服务间调用使用组件feign,发起rest请求;其内集成了ribbon,ribbon默认使用了轮训的负载策略,会将eureka client拉取的注册信息拉取到自己这,实现负载。

关于feign和ribbon会在后续学习中具体讲解。

表示要从注册中心删除该服务的注册信息,使该服务不能被调用。

服务下线的方式:

在eureka server中有一个定时任务Evict,该任务默认每60s执行一次,其作用域在readWriteCacheMap和register上。

当有服务提供者在默认90s时间内,没有进行服务续约,当Evict执行时,会对这样失效的注册信息进行剔除。通常是宕机的服务或者强制kill的服务。

官方定义 :自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

Eureka Server在运行期间会统计心跳失败的比例在15分钟内是否低于85%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来,不会让它们立刻过期。

此配置在默认环境下开启。

自我保护存在的问题,在保护期间,服务挂掉,导致服务无法下线,造成调用接口失败。

因为eureka client本地缓存注册表信息,当eureka server宕机后服务间仍然可以访问,但是服务提供端和服务消费端又分为以下情况:

当服务消费端重启后,本地缓存失效,与服务提供端的映射不存在了,无法进行服务调用。
当服务提供端重启后,在服务调用端的本地缓存中,仍然保存有在eureka宕机前的缓存信息,可以正常调用服务。

参考: https://blog.csdn.net/fox_bert/article/details/104210074

eureka采用的同步方式是peer to peer(对等复制),副本间不分主从,任何副本都可以接收写操作,然后每个副本间互相进行数据更新。

Eureka Server 本身依赖了 Eureka Client,也就是每个 Eureka Server 是作为其他 Eureka Server 的 Client。

Eureka Server 启动后,会通过 Eureka Client 请求其他 Eureka Server 节点中的一个节点,获取注册的服务信息,然后复制到其他 peer 节点。

Eureka Server 每当自己的信息变更后,例如 Client 向自己发起注册、续约、注销请求, 就会把自己的最新信息通知给其他 Eureka Server,保持数据同步。

存在的问题:
1)每个节点都可以进行写操作,会导致数据冲突。
2)如果自己的信息变更是另一个Eureka Server同步过来的,这是再同步回去的话就出现数据同步死循环了。

问题 1)解决方案:
Eureka 是通过 lastDirtyTimestamp 这个类似版本号的属性来解决该问题。
lastDirtyTimestamp 是注册中心里面服务实例的一个属性,表示此服务实例最近一次变更时间。

问题 2)解决方案:
Eureka Server 在执行复制操作的时候,使用 HEADER_REPLICATION 这个 http header 来区分普通应用实例的正常请求,说明这是一个复制请求,这样其他 peer 节点收到请求时,就不会再对其进行复制操作,从而避免死循环。

通过前面了解到,eureka并没有保证数据的强一致性,只保证了数据的 最终一致性 ,通过集群模式保证了 高可用

Eureka的工作原理以及它与ZooKeeper的区别

1、Eureka 简介:

Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。

技术分享图片

 

1.基本原理

上图是来自eureka的官方架构图,这是基于集群配置的eureka; 
- 处于不同节点的eureka通过Replicate进行数据同步 
- Application Service为服务提供者 
- Application Client为服务消费者 
- Make Remote Call完成一次服务调用

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。

服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

2.Eureka的自我保护机制

在默认配置中,Eureka Server在默认90s没有得到客户端的心跳,则注销该实例,但是往往因为微服务跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,但是因为网络分区故障时,Eureka Server注销服务实例则会让大部分微服务不可用,这很危险,因为服务明明没有问题。

为了解决这个问题,Eureka 有自我保护机制,通过在Eureka Server配置如下参数,可启动保护机制

eureka.server.enable-self-preservation=true

它的原理是,当Eureka Server节点在短时间内丢失过多的客户端时(可能发送了网络故障),那么这个节点将进入自我保护模式,不再注销任何微服务,当网络故障回复后,该节点会自动退出自我保护模式。

自我保护模式的架构哲学是宁可放过一个,决不可错杀一千

3. 作为服务注册中心,Eureka比Zookeeper好在哪里

著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。

3.1 Zookeeper保证CP

当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

 

3.2 Eureka保证AP

Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况: 
1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务 
2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用) 
3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中

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

4. 总结

Eureka作为单纯的服务注册中心来说要比zookeeper更加“专业”,因为注册服务更重要的是可用性,我们可以接受短期内达不到一致性的状况。不过Eureka目前1.X版本的实现是基于servlet的Java web应用,它的极限性能肯定会受到影响。期待正在开发之中的2.X版本能够从servlet中独立出来成为单独可部署执行的服务。

转自:zhou恨夏 https://www.cnblogs.com/snowjeblog/p/8821325.html








以上是关于eureka原理简介的主要内容,如果未能解决你的问题,请参考以下文章

Eureka的工作原理以及它与ZooKeeper的区别

Spring Cloud进阶篇之Eureka原理分析

spring cloud 服务注册与发现

Spring Cloud Eureka 原理分析

Eureka 服务注册与发现

Eureka(三)eureka集群的实现原理