今天簡單介紹一下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