【Eureka 缓存机制】

发布于:2025-02-28 ⋅ 阅读:(12) ⋅ 点赞:(0)

今天简单介绍一下Eureka server 的缓存机制吧✌️✌️✌️

一、先来个小剧场:服务发现的"拖延症"

想象你是个外卖小哥(客户端),每次接单都要打电话问调度中心(Eureka Server):“现在哪个餐馆(服务)还开着啊?”
如果每次都打电话问,调度中心会被烦死。于是Eureka说:“别老问了!我给你个小本本(缓存),每30秒自己更新一次吧!”

这就是Eureka缓存的初心——用空间换时间,用缓存换太平


二、缓存藏宝图:客户端和服务端都有小金库

1. 客户端的小抽屉(应用层缓存)
// 这就是你代码里常见的那个"小本本"
List<ServiceInstance> instances = discoveryClient.getInstances("PAYMENT-SERVICE");
  • 📌 第一次访问:老老实实去Eureka Server查通讯录
  • 🔄 后续请求:直接翻自己的小本本(默认每30秒刷新一次)
  • ⚠️ 小坑:如果这时候有新餐馆开张,你得等30秒后才知道
2. 客户端的保险箱(本地缓存)
  • 📦 就算Eureka Server挂了,还能用上次记住的餐馆列表
  • ⏳ 默认存活时间:30分钟(就像冷冻食品的保质期)
3. 服务端的VIP包厢(响应缓存)
  • 🧊 会把查询结果存在内存里(默认180秒)
  • 🚀 下次同样查询直接给缓存,快得像闪电

三、缓存套娃:Eureka的俄罗斯娃娃结构

  1. 第一层:注册表大仓库(读写分离)

    • 写操作:新餐馆注册直接进小黑屋(写缓存)
    • 读操作:从明亮的展示厅(读缓存)拿数据
  2. 第二层:定时更新的展示柜

    • 每30秒把小黑屋里的新数据搬到展示厅(默认值)
    • 像商场每天补货一样规律
  3. 第三层:客户端的小抄本

    • 每家外卖站(客户端)都有自己的进货清单
    • 定期去总店(服务端)核对最新清单

四、当缓存变成双刃剑:那些年我们踩过的坑

场景1:新餐馆开张没人知
  • 🕒 现象:上线新服务后,其他服务过会儿才看到
  • 🛠️ 解法:调小client.refresh.interval(别小于30秒!)
场景2:关店告示贴得慢
  • 💀 现象:服务挂了但客户端还在调用
  • 🛡️ 防御:启用健康检查 + 调小server.eviction-interval-timer-in-ms
场景3:缓存雪崩
  • ❄️ 风险:所有客户端同时刷新缓存把服务端压垮
  • 🔀 妙招:设置随机抖动(jitter)让刷新时间错开

五、手把手教你玩转缓存开关

# 客户端配置:让你掌控刷新节奏
eureka:
  client:
    registry-fetch-interval-seconds: 30  # 刷新间隔
    disable-delta: false                 # 是否用增量更新

# 服务端配置:控制缓存寿命
eureka:
  server:
    response-cache-update-interval-ms: 30000  # 响应缓存更新间隔

六、缓存冷知识:你可能不知道的彩蛋

  1. 紧急逃生口:通过/eureka/apps接口能直接看到原始数据
  2. 记忆清除术:调用DiscoveryClient.refresh()强制刷新
  3. 时间魔法:服务端的注册表其实是三层时间戳结构(注册时间、续约时间、心跳时间)

最后缓存机制的源码分析,下一篇出,感谢老铁们的一键三连!收徒ing