赞
踩
Eureka 和 Consul 都是流行的开源服务注册与发现解决方案,常被用于构建微服务架构中以实现服务之间的动态发现与管理。
Eureka(由Netflix开发,现不再维护更新)
优点:
缺点:
对于数据一致性这个缺点来说:
Eureka在注册信息变更时可能会存在的短暂不一致状态,虽然不会导致整个服务注册系统的崩溃或不可用,但确实会对微服务架构中的服务调用带来以下潜在影响:
服务调用不准确:因为服务消费者可能无法立即获取到最新的服务提供者列表,比如某个服务实例已经下线,但在短时间内消费者仍可能将其视为可用,进而发起调用,这可能导致调用失败或连接超时。
负载均衡偏差:在服务实例数量发生增减变化时,如果消费者依据的是过期的服务列表,那么负载可能不会均匀分布到所有实际在线的服务实例上,影响系统的整体负载均衡效果。
故障恢复延迟:新上线的服务实例可能不能立刻被其他服务发现并开始请求,直到注册信息传播到足够的Eureka服务器节点,然后消费者从这些节点获取到最新服务列表为止。
冗余调用:在服务实例健康检查失败后,Eureka会在一段时间后移除该实例,但在这一段时间内,服务消费者仍可能继续尝试调用已知出问题的服务实例。
服务可用性感知滞后:由于最终一致性的特性,服务消费者在服务提供者出现故障时,不能即时得到通知,从而可能延长故障检测和故障切换的时间。
然而,Eureka通过自我保护机制和其他设计决策,有意选择了可用性(Availability)而非强一致性(Consistency),以应对大规模分布式系统中可能出现的网络分区或其他暂时性故障,确保系统在极端条件下仍能对外提供基本的服务注册与发现功能。这意味着在大多数情况下,这种短暂的不一致是可以接受的风险。而在实际部署时,开发人员可以根据业务需求权衡一致性与可用性之间的平衡,通过合理的配置和设计来最小化不一致带来的负面影响。
Eureka剔除无效服务的时间。
Eureka服务剔除无效服务的时间是通过几个配置参数共同决定的:
Lease Renewal Interval(心跳续约周期):Eureka客户端(服务实例)向Eureka Server发送心跳保持服务租约的有效性。默认值通常是每30秒发送一次心跳(eureka.instance.lease-renewal-interval-in-seconds
)。
Lease Expiration Duration(租约到期时间):如果服务实例在指定时间内未发送心跳,Eureka Server将认为该实例无效并从注册表中剔除。默认值是90秒(eureka.instance.lease-expiration-duration-in-seconds
)。
Eviction Interval Timer(剔除间隔计时器):Eureka Server会定期检查是否有服务实例的租约已过期并且未续约,然后从注册表中剔除它们。默认情况下,Eureka Server剔除失效服务的时间间隔是60秒(eureka.server.eviction-interval-timer-in-ms
),即每隔60秒执行一次剔除操作。
因此,假设Eureka客户端停止发送心跳,且配置使用默认值,则从最后一次收到心跳算起,大约在90秒后(租约到期时间),服务实例会被标记为过期。但是,Eureka Server的实际剔除动作将在下次剔除间隔计时器执行时生效,也就是说,理论上最快也需要在租约到期后的下一个剔除周期内完成,即最多150秒(90秒租约到期 + 60秒剔除间隔)。
不过,为了更快地剔除失效服务,可以调整上述参数,特别是降低租约到期时间和缩短剔除间隔计时器的周期。同时要注意,Eureka有一个自我保护模式(Self-Preservation Mode),在特定情况下会暂停服务实例的剔除,以防止网络波动等因素导致正常实例被误删。要禁用自我保护模式,需要设置eureka.server.enable-self-preservation
为false
。
Consul(由HashiCorp开发并持续维护更新)
优点:
缺点:
综合来看,Eureka设计上更侧重于可用性和快速响应,而Consul则在提供高度一致性的同时,也集成了更多的管理和配置功能。因此,在选择时需要根据项目具体需求、团队熟悉程度以及未来的技术栈规划来决定。随着技术演进,Consul因其活跃的维护和支持通常被视为现代微服务架构中的首选之一。
Consul剔除无效服务时间。
在Consul中,服务剔除(deregistration)的时间与服务的健康检查密切相关。当Consul检测到服务实例健康状况出现问题时,会依据健康检查的结果来决定是否以及何时剔除服务。
以下是关于Consul服务剔除相关的时间设定,服务实例被标记为不健康并最终剔除的时间取决于健康检查的类型及其配置参数。
健康检查类型:
健康检查参数:
例如,在Spring Cloud Consul中,可以通过配置项spring.cloud.consul.discovery.health-check-critical-timeout
来指定健康检查失败多久后,Consul应该认为服务实例处于严重不健康状态并考虑剔除。
Consul剔除服务的具体时间是由健康检查的配置参数控制的,尤其是“Deregister Critical After”这个参数最为直接。如果您想要Consul更快地剔除失效的服务实例,应调整相应的健康检查配置,使其在服务实例确定不可用后尽快触发剔除操作。默认情况下,Consul并不会自动剔除失效的服务实例,除非明确设置了DeregisterCriticalServiceAfter
。如果想要让Consul在健康检查失败后自动剔除服务,需要在服务定义中配置此选项。具体的剔除时间取决于你为每个服务实例配置的健康检查参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。