今天简单介绍一下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的俄罗斯娃娃结构
-
第一层:注册表大仓库(读写分离)
- 写操作:新餐馆注册直接进小黑屋(写缓存)
- 读操作:从明亮的展示厅(读缓存)拿数据
-
第二层:定时更新的展示柜
- 每30秒把小黑屋里的新数据搬到展示厅(默认值)
- 像商场每天补货一样规律
-
第三层:客户端的小抄本
- 每家外卖站(客户端)都有自己的进货清单
- 定期去总店(服务端)核对最新清单
四、当缓存变成双刃剑:那些年我们踩过的坑
场景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 # 响应缓存更新间隔
六、缓存冷知识:你可能不知道的彩蛋
- 紧急逃生口:通过
/eureka/apps
接口能直接看到原始数据 - 记忆清除术:调用
DiscoveryClient.refresh()
强制刷新 - 时间魔法:服务端的注册表其实是三层时间戳结构(注册时间、续约时间、心跳时间)
最后缓存机制的源码分析,下一篇出,感谢老铁们的一键三连!收徒ing