Eureka服务发现慢的原因

Eureka服务发现慢的原因


Eureka服务发现慢的原因主要有两个,一个是服务端缓存导致的,一个是客户端缓存导致的。
Eureka服务发现流程

服务端缓存

服务注册到注册中心后,服务实例信息是存储在注册表中的,也就是内存中。但Eureka为了提高响应速度在内部做了优化,加入了两层缓存结构。将Client需要的信息直接缓存起来,获取的时候直接从缓存中那数据,然后直接相应给Client。

​ 第一层缓存是readOnlyCacheMap。readOnlyCacheMap是采用ConCurrentHashMap来存储数据的,主要负责定时与readWriteCacheMap进行数据同步,默认同步时间是30秒一次;

​ 第二层缓存是readWriteCacheMap。readWriteCacheMap采用Guava来实现缓存。缓存默认过期时间是180秒,当服务下线、过期、注册或状态变更等操作都会清除此缓存中的数据。

​ Client获取服务实例时,会先从一级缓存中获取,如果一级缓存中不存在再从二级缓存中获取。如果二级缓存中也不存在则会触发缓存的加载,从存储层拉去数据到缓存中,然后再返回给Client。

​ Eureka设计二级缓存机制是为了提高Eureka Server 的响应速度。缺点是缓存会导致Client获取不到最新的服务实例信息,然后导致无法及时发现新注册的服务和已下线的服务。

​ 我们可以缩短只读缓存的更新时间让服务发现变的更加及时eureka.server.response-cache-update-inteval-ms。或者直接将只读缓存关闭eureka.server.use-read-only-response-cache=false。多级缓存也会导致数据一致性层面很薄弱。Eureka中会有定时任务去检测失效的服务,将服务失效信息从注册表中移除,也可以将这个失效检测的时间缩短,这样服务下线后就能够及时从注册表中清除。

客户端缓存

  • 客户端缓存主要分两种,一个是Eureka Client缓存,一个是ribbon缓存。

    • Eureka Client缓存

      ​ Eureka Client负责与Eureka Server进行交互,在Eureka Client中的com.netflix.discovery.DiscoveryClient.initScheduleTasks()方法中,初始化了一个CacheRefreshThread定时任务专门用来拉取Eureka Server的实例信息到本地。所以我们需要缩短定时拉取服务信息的时间间隔来快速发现新服务eureka.client.registryFetchIntervalSeconds

    • ribbon缓存

      ​ ribbon会从Eureka Client中获取服务信息,ServerListUpdater是ribbon中负责服务实例更新的组件,默认的实现是pollingServerListUpdater,通过线程定时去更新实例信息,定时刷新的时间间隔默认是30秒。当服务停止或上线后,这边最快也需要30秒才能将实例信息更新成最新。我们可以将这个时间调短一点,比如3秒。刷新间隔的参数是通过getRefreshIntervalMs()方法来获取的,方法中的逻辑也是从Ribbon的配置中进行取值得。

其他

将这些服务端缓存和客户端缓存的时间全部缩短后,跟默认的时间配置相比快了很多。我们通过调整参数的方式来尽量加快服务发现的速度,但还是不能完全解决报错的问题。间隔时间设置成3秒但还是有间隔。所以我们一般都会开启重试功能,当路由的服务出现问题时,可以重试到另一个服务来保证此次请求的成功。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Eureka是Netflix开源的一款服务发现组件,用于实现微服务架构中的服务注册与发现。当Eureka服务下线时,意味着无法继续使用Eureka提供的服务发现功能。 服务下线可能是由于多种原因引起的,例如服务器故障、网络问题或者人为操作。无论是哪种原因服务下线都会对微服务架构的正常运行产生一定的影响。 首先,Eureka服务下线会导致服务注册和发现功能失效。其他微服务无法通过Eureka来获取服务的地址和端口信息,这会导致微服务之间的通信出现问题。无法及时发现和注册新的服务,也无法及时从服务列表中移除已下线的服务,可能会影响负载均衡和故障恢复策略的实施。 其次,Eureka服务下线还会影响监控和故障转移等功能。Eureka可以通过健康检查等机制来对服务进行监控,当服务不可用时,可以及时通过故障转移来保证系统的可用性。但是一旦Eureka服务下线,这些功能就无法正常使用,将导致监控和故障转移的失效。 为了应对Eureka服务下线的情况,可以考虑以下几个解决方案。首先,可以使用其他的服务发现组件替代Eureka,如Consul或ZooKeeper,这些组件也提供了类似的服务注册和发现功能。其次,可以采用主备模式,即配置多个Eureka服务器,其中一个为主服务器,其他为备份服务器,当主服务器宕机时,备份服务器可以接替其功能。最后,还可以考虑增加监控和报警机制,及时发现Eureka服务的异常情况,并及时采取相应的措施来修复问题。 总之,Eureka服务下线对微服务架构的正常运行会带来一定的影响,需要采取相应的解决方案来应对这种情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄土地的孩子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值