eureka和nacos都是服务注册与发现的组件,用于构建微服务架构中的服务治理,那么他们有哪些不同点呢?
CAP理论
C一致性,A高可用,P分区容错性
eureka只支持AP,而nacos支持CP和AP两种
nacos是根据配置识别CP或AP模式,如果注册Nacos的client节点注册时是ephemeral=true即为临时节点,那么Naocs集群对这个client节点效果就是AP,反之则是CP,即不是临时节点。
对于临时实例,健康检查失败,则直接删除。这种特性适合于需要应对流量突增的场景,服务可以弹性扩容,当流量过去后,服务停掉即可自动注销。 对于持久化实例,健康检查失败,会设置为不健康状态。它的优点就是可以实时的监控到实例的健康状态,便于后续的告警和扩容等一系列处理。
#false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=true
连接方式
- nacos使用的是netty和服务直接进行连接,属于长连接
- eureka是使用定时发送和服务进行联系,属于短连接
服务异常剔除
Eureka client在默认情况每隔30s想Eureka Server发送一次心跳,当Eureka Server在默认连续90s秒的情况下没有收到心跳, 会把Eureka client 从注册表中剔除,在由Eureka-Server 60秒的清除间隔,把Eureka client 给下线。
EurekaInstanceConfigBean类下
private int leaseRenewalIntervalInSeconds = 30; //心跳间隔30s
private int leaseExpirationDurationInSeconds = 90; //默认90s没有收到心跳从注册表中剔除
EurekaServerConfigBean 类下
private long evictionIntervalTimerInMs = 60000L; //异常服务剔除下线时间间隔
也就是在极端情况下Eureka 服务 从异常到剔除在到完全不接受请求可能需要 30s+90s+60s=3分钟左右
nacos client 通过心跳上报方式告诉 nacos注册中心健康状态,默认心跳间隔5秒,nacos会在超过15秒未收到心跳后将实例设置为不健康状态,可以正常接收到请求,超过30秒nacos将实例删除,不会再接收请求
管理方式
nacos提供了nacos console可视化控制话界面,可以对实例列表进行监听,对实例进行上下线,权重的配置,并且config server提供了对服务实例提供配置中心,且可以对配置进行CRUD,版本管理。
eureka仅提供了实例列表,实例的状态,错误信息,相比于nacos过于简单。
自我保护
Eureka服务器会定期清理那些长时间没有收到心跳的服务实例,但如果在短时间内丢失了过多的心跳,Eureka会进入自我保护模式,自我保护模式下,Eureka服务器会暂时停止剔除无法联系的服务实例,同时仍然接受新的服务实例注册。这样做是为了防止整个系统的瘫痪,确保服务消费者仍然能够获得可用的服务实例列表。一旦网络恢复正常,Eureka服务器会自动退出自我保护模式,并且恢复对无法联系的服务实例的剔除操作。
# 启用或禁用自我保护模式
eureka.server.enable-self-preservation=true
# 自我保护模式的续约阈值比例
eureka.server.renewal-percent-threshold=0.85
当Nacos注册中心的实例数量低于阈值时,自我保护模式将启动。默认情况下,实例数量低于95%的阈值会触发自我保护模式。在自我保护模式下,Nacos会记录长时间未收到心跳或心跳失败的实例,并将其标记为不健康状态(包括临时实例)。但不健康的实例仍然会保留在注册中心中,以确保服务消费者仍然能够发现它们并尝试进行服务调用。而且Nacos 的阈值是针对某个具体服务的,不是针对所有服务的。但 Eureka的自我保护阈值是针对所有服务的。
# 自我保护模式的触发阈值
server.protect.threshold=0.85
总结
目前由于Eureka已停止维护,Nacos成为了更为活跃和推荐的选择。Nacos不仅提供了服务注册与发现的功能,还提供了更多的服务治理和配置管理能力,是一个功能更为丰富和全面的服务治理平台。
引用:https://blog.csdn.net/weixin_43776652/article/details/120874245
网友评论