Eureka 和 Consul 都是流行的开源服务注册与发现解决方案,常被用于构建微服务架构中以实现服务之间的动态发现与管理。

Eureka(由Netflix开发,现不再维护更新)

优点:

易用性:提供简单易用的API和用户界面,方便开发人员进行服务注册和发现。高可用性:支持集群模式,可以创建多个Eureka服务器实例,形成相互复制的服务注册表,提高系统的容错性。自我保护机制:在网络分区等异常情况下,Eureka可以通过自我保护模式防止因短暂的节点通信失败而导致的服务下线。快速注册:服务注册相对快速,因为它并不强制要求强一致性,而是采取最终一致性策略。 缺点:

数据一致性:由于牺牲了一定的一致性,Eureka在注册信息变更时可能会存在短暂的不一致状态。不再积极维护:Netflix宣布停止了对Eureka的新功能开发,仅提供维护支持,推荐用户转向其他服务发现解决方案。

对于数据一致性这个缺点来说:

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开发并持续维护更新)

优点:

一致性保证:基于Raft一致性算法,Consul提供的服务注册信息有较强的一致性保障。健康检查:内置健康检查机制,能实时监控服务实例的健康状况,并自动剔除不健康的服务实例。多协议支持:除了HTTP接口,还支持DNS和gRPC接口,为服务发现提供了更多选择。多数据中心支持:原生支持多数据中心的服务发现和配置管理,适合全球范围内的分布式系统。健壮的生态系统:Consul整合了KV存储、服务发现和配置管理等多种功能于一体,提供了更为全面的服务治理能力。 缺点:

注册过程:相较于Eureka,Consul可能在服务注册过程中要求更高的性能和网络资源,尤其是在大规模集群下。复杂度:相对于Eureka,Consul可能在某些方面更复杂,对于初次使用的开发者而言,理解和配置可能会稍显复杂。

综合来看,Eureka设计上更侧重于可用性和快速响应,而Consul则在提供高度一致性的同时,也集成了更多的管理和配置功能。因此,在选择时需要根据项目具体需求、团队熟悉程度以及未来的技术栈规划来决定。随着技术演进,Consul因其活跃的维护和支持通常被视为现代微服务架构中的首选之一。

Consul剔除无效服务时间。

在Consul中,服务剔除(deregistration)的时间与服务的健康检查密切相关。当Consul检测到服务实例健康状况出现问题时,会依据健康检查的结果来决定是否以及何时剔除服务。

以下是关于Consul服务剔除相关的时间设定,服务实例被标记为不健康并最终剔除的时间取决于健康检查的类型及其配置参数。

健康检查类型:

TCP检查:检查远程TCP端口是否可连通。HTTP/HTTPS检查:发送HTTP/HTTPS请求,根据响应的状态码和返回时间判断健康状况。Script checks:执行脚本并根据退出码和输出判断。 健康检查参数:

Check Interval(检查间隔):Consul定期执行健康检查的时间间隔。Timeout(超时时间):健康检查请求在超时之前必须完成的时间限制。Deregister Critical After(临界状态下多少秒后注销):如果服务连续在这个时间段内处于不健康状态(critical状态),Consul会自动注销该服务实例。TTL Checks (Time To Live):另一种健康检查模式,服务实例必须定期刷新TTL,否则在过期后被认为是不健康的。

例如,在Spring Cloud Consul中,可以通过配置项spring.cloud.consul.discovery.health-check-critical-timeout来指定健康检查失败多久后,Consul应该认为服务实例处于严重不健康状态并考虑剔除。

Consul剔除服务的具体时间是由健康检查的配置参数控制的,尤其是“Deregister Critical After”这个参数最为直接。如果您想要Consul更快地剔除失效的服务实例,应调整相应的健康检查配置,使其在服务实例确定不可用后尽快触发剔除操作。默认情况下,Consul并不会自动剔除失效的服务实例,除非明确设置了DeregisterCriticalServiceAfter。如果想要让Consul在健康检查失败后自动剔除服务,需要在服务定义中配置此选项。具体的剔除时间取决于你为每个服务实例配置的健康检查参数。

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。