微服務無感發布實踐:基于Nacos的客戶端緩存與故障轉移機制


微服務無感發布實踐:基于Nacos的客戶端緩存與故障轉移機制

背景與問題場景

在微服務架構中,服務的動態擴縮容、滾動升級是常態,而服務實例的上下線需通過注冊中心(如Nacos)實現服務發現的實時同步。但在實際生產環境中,客戶端本地緩存機制服務端心跳檢測延遲可能導致以下問題:

  1. 服務下線感知延遲:當服務實例A的多個節點同時下線時,客戶端可能因本地緩存未刷新(默認30秒)繼續調用失效節點;
  2. 流量中斷風險:若客戶端負載均衡器(如Ribbon)未及時更新實例列表,請求仍可能被路由至已下線實例,導致用戶側報錯;
  3. 發布過程可見性:若緩存未清理或心跳未同步,用戶可能在服務重啟期間感知到短暫的服務不可用。

核心知識點解析

一、Nacos客戶端本地緩存機制

Nacos客戶端通過ServiceInfoHolder類維護服務實例的本地緩存:

  1. 內存緩存ConcurrentHashMap存儲服務名與ServiceInfo的映射,每次從服務端拉取實例列表后更新;
  2. 磁盤快照:默認路徑為{USER_HOME}/nacos/naming/,當服務端不可用時,客戶端可讀取本地緩存維持服務調用;
  3. 故障轉移目錄FailoverReactor機制會備份服務列表至cacheDir/failover,極端情況下(如Nacos集群宕機)自動加載備份數據。

優化方向
? 啟用啟動時加載緩存(namingLoadCacheAtStart=true);
? 配置failover-mode=1,強制客戶端在服務端不可用時切換至本地緩存。


二、服務發現動態刷新策略

1. Ribbon/LoadBalancer緩存刷新

? 默認行為:Ribbon每30秒從Nacos拉取服務列表,LoadBalancer每35秒更新緩存;
? 優化配置

ribbon:ServerListRefreshInterval: 5000  # 縮短至5秒nacos.naming.push-empty-protection: false  # 禁用空列表保護  

? 主動觸發更新:監聽Nacos的InstancesChangeEvent事件,強制清除負載均衡緩存(如Spring Gateway集成方案)。

2. Nacos服務端心跳檢測

? 健康狀態同步:默認15秒標記不健康實例,30秒后剔除;
? 縮短檢測周期

nacos.heartbeatInterval=3000    # 心跳間隔3秒  
nacos.heartbeatTimeout=10000    # 超時時間10秒  

三、優雅停機與主動下線

1. 服務端主動注銷

在服務關閉前調用Nacos下線接口,確保狀態同步:

// Spring Cloud示例  
@Autowired  
private NacosAutoServiceRegistration registration;  public void shutdown() {  registration.deregister();  // 發送注銷請求  Thread.sleep(5000);          // 等待心跳同步  SpringApplication.exit();    // 關閉應用  
}  
2. Kubernetes場景優化

? PreStop Hook:在Pod終止前執行Nacos反注冊命令,并休眠35秒(覆蓋Ribbon緩存刷新周期);
? Termination Grace Period:設置寬限期為40秒,確保異步任務處理完成。


四、高可用架構設計

1. Nacos集群部署

? 多節點冗余:配置多地址避免單點故障(如spring.cloud.nacos.server-addr=ip1:8848,ip2:8848);
? 數據一致性:采用Raft協議保證集群內數據強一致性,持久化服務實例狀態。

2. 客戶端容災策略

? 多級緩存:內存緩存 → 磁盤快照 → 故障轉移文件,逐級降級保障可用性;
? 區域感知路由:優先選擇同區域實例,減少跨區調用延遲(結合ZoneAffinityRule)。


總結與實踐建議

實現無感發布需客戶端、服務端與基礎設施協同優化:

  1. 客戶端側:縮短緩存刷新周期 + 啟用故障轉移機制;
  2. 服務提供者側:優雅停機流程 + 主動心跳同步;
  3. 基礎設施側:Nacos集群高可用 + Kubernetes生命周期鉤子;
  4. 監控驗證:通過Nacos控制臺、Ribbon調試日志及鏈路追蹤(如SkyWalking)實時監控實例狀態。

通過上述方案,即使服務實例A的兩個節點同時下線,客戶端仍能在5秒內完成服務列表更新,用戶側請求成功率可達99.99%。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901084.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年的Android NDK 快速開發入門

十年前寫過一篇介紹NDK開發的文章《Android實戰技巧之二十三:Android Studio的NDK開發》,今天看來已經發生了很多變化,NDK開發變得更加容易了。下面就寫一篇當下NDK開發快速入門。 **原生開發套件 (NDK) **是一套工具,使開發者能…

Shell 編程之條件語句

目錄 條件測試操作 文件測試 整數值比較 字符串比較 邏輯測試 if 條件語句 if語句的結構 1、單分支 if 語句 2、雙分支 if 語句 3、多分支 if 語句 if語句應用實例 1、單分支 if 語句應用 2、雙分支 if 語句應用 3、多分支 if 語句應用 case 分支語句 case語句的結構 case語…

【模板】縮點

洛谷p3387 思路: 算法:tarjan算法 根據題意,我們只要找到一個路徑,使得最終權重最大即可,首先,根據題目可知,如果一個點在一個環上,那么我們就將這整個環都選上,題目上允許我們能夠重復走,因此,我們可以將環縮成點,將環所稱點后,就可以轉換成樹,從沒有父節點的結點開始,我們向…

js觸發隱式類型轉換的場景

JavaScript 的隱式類型轉換(Implicit Type Coercion)會在某些操作或上下文中自動觸發,將值從一種類型轉換為另一種類型。以下是常見的觸發場景: 1. 使用 (寬松相等)比較時 會嘗試將兩邊的值轉換為相同類型后…

c++將jpg轉換為灰度圖

c將jpg轉換為灰度圖 step1:添加依賴 下載這兩個文件,放在cpp同一目錄下,編譯生成 https://github.com/nothings/stb/blob/master/stb_image_write.h https://github.com/nothings/stb/blob/master/stb_image.hstep2:C:\Users\wangrusheng\source\repos…

python——正則表達式

一、簡介 在 Python 中,正則表達式主要通過 re 模塊實現,用于字符串的匹配、查找、替換等操作。 二、Python的re模塊 使用前需要導入: import re 三、常用方法 方法描述re.match(pattern, string)從字符串開頭匹配,返回第一個匹…

Soybean Admin 配置vite兼容低版本瀏覽器、安卓電視瀏覽器(飛視瀏覽器)

環境 window10 pnpm 8.15.4 node 8.15.4 vite 5.1.4 soybean admin: 1.0.0 native-ui: 2.38.0 小米電視 MIUI TV版本:MiTV OS 2.7.1886(穩定版) 飛視瀏覽器:https://www.fenxm.com/1220.html在小米電視安裝飛視瀏覽器可以去小紅書查安裝教程&#xff1a…

系統與網絡安全------網絡通信原理(1)

資料整理于網絡資料、書本資料、AI,僅供個人學習參考。 文章目錄 網絡通信模型協議分層計算機網絡發展計算機網絡功能什么是協議為什么分層郵局實例 OSI模型OSI協議模型OSI七層模型OSI七層的功能簡介 TCP/IP模型OSI模型與TCP/IP模型TCP/IP協議族的組成各層PDU設備與…

如何使用通義靈碼完成PHP單元測試 - AI輔助開發教程

一、引言 在軟件開發過程中,測試是至關重要的一環。然而,在傳統開發中,測試常常被忽略或草草處理,很多時候并非開發人員故意為之,而是缺乏相應的測試思路和方法,不知道如何設計測試用例。隨著 AI 技術的飛…

批量清空圖片的相機參數、地理位置等敏感元數據

我們在使用相機或者手機拍攝照片的時候,照片中都會帶有一些敏感元數據信息,比如說相機的型號,參數,拍攝的時間地點等等。這些信息雖說不是那么引人注意,但是在某些時候他是非常隱私非常重要的。如果我們將這些信息泄露…

SQL優化算法解析 | PawSQL 如何將EXISTS子查詢“秒拆“為JOIN連接

在數據庫性能調優中,子查詢優化是提升查詢效率的關鍵點之一。今天,我們將分享一個使用 PawSQL 對EXISTS子查詢進行重寫優化的案例,展示如何通過合理的SQL重寫與索引設計,實現超過487516.45%的性能提升! 一、案例分析:EXISTS子查詢的性能困境 這個查詢的目的是找出…

大模型day1 - 什么是GPT

什么是GPT 全稱 Generative Pre-trained Transformer 是一種基于 Transformer 架構的大規模 預訓練 語言模型,由OpenAI研發,但GPT僅僅只是借鑒了Transformer 中 Decoder 的部分,并且做了升級 Transformer 架構 Transformer架構 是一種用于…

MDM功能演示:遠程鎖定與數據擦除,保障企業移動設備安全

在當今高度互聯的商業環境中,企業數據伴隨著員工穿梭于不同城市、時區和設備之間。智能手機、平板電腦和筆記本電腦賦予員工隨時隨地辦公的能力,但也帶來了新的安全挑戰:設備一旦遺失或落入不當之手,企業數據就面臨泄露風險。 無…

深度集成學習不均衡樣本圖像分類

用五個不同的網絡,然后對分類概率進行平均,得到分類結果。基本上分類精度可以提升10% 1.導入基本庫 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…

從零開始學java--泛型

泛型 目錄 泛型 引入 泛型類 泛型與多態 泛型方法 泛型的界限 類型擦除 函數式接口 Supplier供給型函數式接口: Consumer消費型函數式接口: Function函數型函數式接口: Predicate斷言式函數式接口: 判空包裝 引入 …

5?? Coze+AI應用基礎教學(2025年全新版本)

目錄 一、了解應用開發 1.1 扣子應用能做什么 1.2 開發流程 1.3 開發環境 二、快速搭建一個AI應用 2.1 AI翻譯應用介紹 2.2 設計你的應用功能 2.3 創建 AI 應用項目 2.4 編寫業務邏輯(新建工作流) 2.5 搭建用戶界面 2.6 效果測試 2.7 發布應用 一、了解應用開發 …

工會成立100周年紀念,開發職工健身AI運動小程序、APP方案推薦

時光荏苒,轉眼間2025年五一將至,這一年對于中華全國總工會而言,具有非凡的歷史意義——它將迎來成立100周年的輝煌時刻。為了慶祝這一盛事,各級工會組織將精心籌備了一系列豐富多彩、形式多樣的紀念活動,旨在展現工會百…

【深度學習】Ubuntu 服務器配置開源項目FIGRET(PyTorch、torch-scatter、torch-sparse、Gurobi 安裝)

開源項目網址:https://github.com/FIGRET/figret 該項目在SIGCOMM2024發表,用深度學習方法處理流量工程中的突發問題 1. 創建新的 Conda 環境 使用國內鏡像源創建環境? conda create -n figret python3.8.0 --override-channels -c https://mirrors.…

【SpringCloud】從入門到精通(上)

今天主播我把黑馬新版微服務課程MQ高級之前的內容都看完了,雖然在看視頻的時候也記了筆記,但是看完之后還是忘得差不多了,所以打算寫一篇博客再溫習一下內容。 課程坐標:黑馬程序員SpringCloud微服務開發與實戰 微服務 認識單體架構 單體架…

MySQL中動態生成SQL語句去掉所有字段的空格

在MySQL中動態生成SQL語句去掉所有字段的空格 在數據庫管理過程中,我們常常會遇到需要對表中字段進行清洗和整理的情況。其中,去掉字段中的空格是一項常見的操作。當表中的字段數量較少時,我們可以手動編寫 UPDATE 語句來處理。但如果表中包…