Eureka知识大全

it2025-07-31  14

目录

 

CAP理论

1、Eureka为什么是AP,zookeeper为什么是CP?

服务续约:

失效服务剔除:

服务注册:

服务消费:

服务调用:

元数据:


CAP理论

首先我们需要了解CAP理论,

一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance)

最多满足其中的两个特性。也就是下图所描述的。分布式系统要么满足CA,要么CP,要么AP。无法同时满足CAP。

        

分区容错性(Partition tolerance):某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务。总结一句话就是部分错误,不会导致整个瘫痪。

 可用性(Availability):服务持续可用

一致性(Consistency):指的是所有节点在同一时间的数据完全一致

Eureka为什么是AP,zookeeper为什么是CP?

Eureka集群时,各个节点之间是平等的地位,当其中某个节点故障,服务就能正常使用,但是查到消息可能不是最新的,不保证强一致性,但是保证了可用性。

Zookeeper在集群时,分为主从节点,当master节点因为某些故障,失去与其他节点 之间联系时,剩余节点会重新进行leader的选举。但是选举的啥时间较长,通常在30-120s,选举期间zk集群都是不可用的。所以zk保证了一致性,但是没有保证可用性。

 

服务续约:

在服务注册之后,服务提供者会维护一个心跳来持续通知Eureka server,默认是每30s一次。否则eureka server的剔除任务会将该服务实例从服务列表中排除出去。 下面是服务续约的两个重要属性

eureka.instance.lease-expiration-duration-in-seconds(服务续约超时时间,默认90s)

表示Eureka server至少上一次收到client的心跳后,等待下一次心跳的超时时间,在这个时间如果没有收到下一次心跳,则将移除该服务实例。默认时间是90s,如果该值设置的过大,很可能会将请求转发过去的时候,该服务实例已经挂了,如果该值设置的过小,则这个服务实例可能会因为临时的网络波动而被剔除。该值至少应该大于leaseRenewalIntervalInSeconds

eureka.instance.lease-renewal-interval-in-seconds:(服务续约时间,默认30s

表示eureka client 发送心跳给server的频率(默认30s)

失效服务剔除

有时候,服务实例不一定会正常下线,而注册中心没有收到服务下线的请求,为了从列表中将这些无法提供服务的实例剔除,Eureka Server在启动的时候回创建一个定时任务,默认每隔一段时间(默认60s)将的当前服务中超时(默认90s)没续约得服务剔除出去。

eureka.server.eviction-interval-timer-in-ms=2000

自我保护机制:

服务注册到Eureka Server后,会维护一个心跳连接,告诉Eureka Server 自己还活着。Eureka Server在运行期间会统计心跳失败的比例在15min以内是否低于85%,则如果低于这种情况,Eureka Server会将当前注册的服务实例保护起来,让这些服务不会过期。这样做会使客户端容易拿到实际已经不存在的服务实例,会出现时而调用成功,时而失败的情况。

相关属性:

eureka.server.enableSelfPreservation=true # 可以设置改参数值为false,以确保注册中心将不可用的实例删除

服务注册:

服务提供者在服务启动的时候会以rest的方式将自己注册到Eureka Server上,同时带上自身服务的一些元数据信息。Eureka Server接收到这个rest请求后,将元数据存储到一个双层结构的Map中,其中,第一层的key是服务名,第二层的key是具体的服务实例名。 在服务注册时,需要确认一下eureka.client.register-with-eureka=true 是否正确,该配置默认是true,如果设置成false,则不会向注册中心注册该服务;

服务消费:

消费者启动的时候,会发送rest请求从Eureka server 中获取到上面注册的服务列表。为了性能考虑,Eureka server会维护一份只读的服务注册清单返回给客户端,同时该缓存清单默认会每隔30s更新一次。

下面是获取服务的两个重要属性:

#是否需要去检索寻找服务,默认是true

eureka.client.fetch-registry

# 表示Eureka client间隔多久去拉一次服务注册信息,默认是30s。

eureka.client.registry-fetch-interval-seconds=30000

服务调用:

消费者在获取到服务清单后,通过服务名可以获取到具体的实例名和该实例的元数据信息,有了这些服务实例的详细信息,客户端可以根据自己的实际需要具体调用哪个实例。Ribbon,feign实现服务调用的负载均衡。

元数据:

元数据是Eureka客户端向注册中心发送注册请求时,用来描述自身服务信息的对象,其中包含了一些标准化的元数据,比如服务名称、实例名称、实例ip、示例端口等用来服务治理的重要信息,以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息。​​​​​​​

最新回复(0)