sentinel與seata組件在微服務中的基本作用

微服務基礎內容:

在微服務中,首先學習了微服務的橫向拆分與縱向拆分,縱向拆分指按照功能拆分模塊,橫向拆分指將高復用的模塊單獨拆分,使縱向拆分的模塊去調用這部分內容。

學習了基本拆分后,需要知道微服務之間的關系是多對多的消費者生成者模型,每個模塊互為消費者與生產者,為了微服務之間傳遞的可靠性,需要用到nacos組件。nacos組件的主要充當一個中介——注冊中心,nacos與生產者間通過心跳協議維護一張服務表單,當消費者需要生產者的調用時,nacos會給消費者提供相應的生產者表單,這個表單維護了多個完成消費者服務的端口號,消費者根據負載均衡選擇一個端口號進行建立連接,從而調用生產者。

學習了基本拆分與nacos后,拿到了具體的生產者的端口號,引入了openfeign組件,這個組件實際上就是http轉發工具,因為不同微服務之間是相互隔離的,擁有自己的數據庫與服務器,所以不同微服務之間的調用需要采用網絡請求,openfeign的作用就是這個。通過端口號以及對應的openfeign轉發,從而構建不同微服務之間的連接與調用。

學習了上述內容之后,開始思考如何進行鑒權。還是由于微服務的隔離性,不同服務之間如何拿到鑒權信息?回顧單體架構的鑒權方式,使用的是springmvc攔截器,通過在攔截器中獲取http.request.header中的授權信息后,在后端將授權信息比對,從而將需要的權力信息(比如userInfo)存儲在ThreadLocal中,然后在線程執行期間就可以隨時在鑒權頁面拿到想要的內容。

在微服務架構中采用網關來實現上述操作,不僅如此,網關還可以解決前后端端口號不一致的矛盾。前端只會訪問網關,網關來負責轉發給不同的微服務。

以鑒權舉例,網關通過攔截器拿到userInfo,存儲在threadLocal中,當本次調用的微服務要調用下一個微服務,并且需要userInfo時,會使用openfeign工具,將userInfo存儲在這個網絡請求的請求頭中,轉發的請求仍然再一次訪問網關,網管攔截器拿到userInfo,提取出放入該微服務執行線程的threadlocal中。從而實現,多個微服務之間的數據傳遞。

開始:

上述內容都是微服務的基本內容,現在需要考慮微服務的一些弊端。

一、首先微服務顯然會出現雪崩的場景,當某個微服務A宕機后,后續調用該微服務B調用A時也會卡在請求A的過程中,后續又有C調用B,C也卡住(繼續向后疊加獎池)從而造成A/B/C的資源一直在請求中無法釋放,最終造成服務器資源耗盡而崩潰。

sentinel組件就是用于解決這個問題的,sentinel組件也是alibaba旗下的,與nacos配合服用。

sentinel的操控在控制臺中,只需要導包與配置,方便快捷,在管理面板添加相應的配置項后,甚至可以免服務部署來更新對應的參數。說一說sentinel的作用,sentinel的作用主要分為限流與熔斷。

1.限流包含限制訪問請求數以及為微服務分配的線程數,限制請求數就是限定QPS,這個很好理解。

2.限制線程數為每個微服務分配固定的線程數,請求到了微服務,首先去線程池中取線程,如果沒有線程,那么就會返回報錯。

3.針對返回報錯導致用戶體驗不好的弊端,在openfeign中又定義了一個錯誤處理,這個可以理解為單體架構中的異常處理,代碼案例如下:

@Slf4j
public class CartToItemFallback implements FallbackFactory<ItemClient>{@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemById(Collection<Long> ids) {log.error("查詢商品失敗",cause);return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {log.error("扣減庫存失敗",cause);throw new RuntimeException(cause);}};}
}

這個內容會被對應的ItemClient生成注解并標記。需要理解的是,我們進行fallback處理的是微服務調用之間的問題,而宕機的微服務不是通過fallback進行處理的。當微服務A調用宕機微服務B時,A這個時候因為限流沒有拿到B的資源,這時直接fallback返回,不會出現報錯,A中的其余項目繼續處理即可。

4.sentinel中除了限流還有熔斷機制,限流只是為了防止未出現故障的微服務A調用已經宕機的微服務B而造成整個系統崩潰,但是A還是會去調用B,只不過A沒有調用成功而已,這個請求的過程仍然在耗費資源。

而使用熔斷機制后,能夠直接不讓A發送請求。熔斷機制會監控一段時間或一定次數內的調用失敗率(或錯誤次數),比如在sentinel中就有TTL,當連接響應超過設置的TTL以及持續多少秒后(達到閾值),就將熔斷器置為 Open 狀態,此時所有對微服務 B 的調用都會被短路快速失敗,不再真正發送請求。經過一個休眠時長后,熔斷器進入 Half-Open,允許少量請求恢復探測;如果恢復良好,則關閉熔斷器,否則繼續保持 Open。

二、在學習了sentinel后知道了如何處理單個微服務的崩潰問題,繼續學習微服務中的事務問題。

微服務的事務問題和單體架構的事務問題很相似,舉個例子:

支付操作:對用戶扣款,將訂單狀態修改為已支付。

這個例子中,用戶服務會去調用訂單服務,如果用戶扣款服務正常執行,但是執行訂單狀態修改時出現了問題,從而導致數據庫不一致。

這個解決的方案就是使用seata組件,來對事務進行控制。

想要進行事務,簡單分析就是讓多個微服務進行提交的同步或者回滾的同步,就如同數據庫中的提交與回滾類似,只不過在這里的事務不完全保證原子性(如AT方法)

seata組件支持兩種方式來進行事務控制,分別是XA和AT:

XA方式:

XA方式是最早的傳統方式,方式比較粗暴,首先RM注冊分支事務到TC(也就是告訴TC我是一個多服務時間,需要XA管理),然后RM去執行對應的sql操作,但是此時不進行提交,RM 向 TC 發送服務運行結果,TC比對這個時間所有RM的執行結果,進行統一的提交和回滾。
顯然這個方式很好的保證了多個微服務的sql操作同步性,但是弊端也比較明顯,這種方式即使對應的微服務已經完成工作并且發送給TC其成功狀態,仍然還需要等待其余RM執行完畢,造成資源的浪費。優點是不會出現數據庫的不一致,保證結果的完全可靠。

TA方式:

TA方式是現在國內用的比較多的一種方式,TA方式不同點在于 所有RM注冊后,會對當前的環境生成相應的快照undo-log,說白了就是備份當前數據庫環境。
然后每個RM分別執行自己的,執行完后自行提交,提交由RM自行完成,提交完后向TC報告執行狀態。


當所有RM進行報告后,TC會來驗收,如果有RM出現故障,就會回滾到最初的快照狀態。
TA方式優勢很明顯,每個RM結束后就會立刻釋放資源,不會造成資源的浪費。
缺點也比較明顯,TA方式會導致短暫的數據不一致(在RM提交后到TC檢查到錯誤并回滾之前)

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

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

相關文章

微信點餐小程序—美食物

本項目是基于WAMP Server 和PHP 動態網頁技術構建的微信小程序點餐系統&#xff0c;該系統主要分為前端&#xff08;微信小程序&#xff09;和后端&#xff08;基于PHPMySQL服務器端&#xff09; 整體架構流程 1、前端部分 用戶界面&#xff1a;展示菜品、處理用戶點餐操作、…

記錄Idea運行控制臺亂碼處理方案

記錄Idea運行控制臺亂碼處理方案 方法1&#xff1a;修改運行配置 打開 Run/Debug Configurations在對應的運行配置中 → 找到 VM Options → 添加&#xff1a; -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8重新運行程序 方法2&#xff1a;強制指定輸出流編碼 在代碼中顯…

JVM對象內存分配機制全解析

jvm創建對象的內存分配過程 1、逃逸對象在棧上分配 通過在棧上為對象分配內存,使對象占用的內存空間隨著方法結束棧幀彈出而銷毀,避免了GC垃圾收集器回收對象,減小GC的壓力; 棧上分配內存依賴逃逸分析和標量替換。 逃逸分析: 分析對象的動態作用域逃逸:當一個對象在方…

揭秘OSPF核心:LSA類型與路由計算

一、區域內路由計算 同一區域內中的所有路由器有相同的LSDB LSA關鍵字段&#xff1a; 【1】LS Age&#xff08;鏈路狀態老化時間&#xff09;&#xff1a;LSA生存的時間&#xff0c;單位秒 【2】Option&#xff08;選項字段&#xff09; 【3】LS Type&#xff08;鏈路狀…

英文摘要給成中文摘要模型

你現在使用的 UNIMO 項目&#xff08;PaddlePaddle/Research/NLP/UNIMO&#xff09;&#xff0c;默認是做英文摘要任務&#xff0c;如你在 README 中看到的數據集是 CNN/DailyMail&#xff0c;它是一個 英文摘要數據集。不過&#xff0c;這個項目的架構完全支持中文&#xff0c…

前端面試專欄-主流框架:13.vue3組件通信與生命周期

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 Vue3組件通信與生命周期深度解析 在Vue3的開發體系…

自動化交易優化網格策略

一、動態參數調整 1. 網格間距優化 - 波動率自適應&#xff1a;使用平均真實波幅&#xff08;ATR&#xff09;指標動態調整間距。例如&#xff0c;當ATR值上升20%時&#xff0c;將間距從原定的1%擴大至1.5%&#xff1b;ATR下降時則縮小間距至0.8%。可通過Python的TA-Lib庫實時計…

測試平臺ui自動化demo說明

1. 要啟動celery worker windows 開發時&#xff0c;用第二行 。&#xff08;試過&#xff0c;可以&#xff09;&#xff0c;第一行的沒試過。 celery -A myproject worker --loglevelinfo # windows電腦用下面的&#xff0c;并且settings中還要加那個solo celery -A your_p…

五大主要Token類型之字符標記Token

如大家所了解的&#xff0c;在數字化時代&#xff0c;我們每天都會與Token&#xff08;令牌&#xff09;打交道——無論是在線支付、登錄社交媒體&#xff0c;還是調用API接口&#xff0c;都離不開這一關鍵技術。 今天我們主要來學習&#xff1a;字符標記Token 在自然語言處理…

可理解性輸入:洗澡習慣

一、開場與淋浴準備 Today we’re going to learn bathroom English. Let’s get started. So the first thing we want to do. Make sure we have our towel and we’ll hang it on the towel rack before we have a shower. Because if we have a shower and then forget ou…

GO Echo框架面試題及參考答案

目錄 Echo 框架的核心結構是什么?Echo 和 Context 分別扮演什么角色? 如何創建一個 Echo 實例?簡述常見配置項。 e.Start () 與 e.StartServer () 的區別是什么? Echo 如何實現基于先后順序路由匹配? 如何注冊 GET、POST、PUT、DELETE 等不同 HTTP 方法的路由? Echo…

Java 中LinkedList 總結

406.根據身高重建隊列 力扣題目鏈接(opens new window) 假設有打亂順序的一群人站成一個隊列&#xff0c;數組 people 表示隊列中一些人的屬性&#xff08;不一定按順序&#xff09;。每個 people[i] [hi, ki] 表示第 i 個人的身高為 hi &#xff0c;前面 正好 有 ki 個身高…

大模型微調:從零到實踐,掌握AI大模型的核心技能

大模型微調&#xff1a;從零到實踐&#xff0c;掌握AI大模型的核心技能 引言 大規模語言模型&#xff08;如DeepSeek、通義千問&#xff09;的出現&#xff0c;徹底改變了自然語言處理的格局。這些模型不僅在學術界取得了突破性進展&#xff0c;在工業界也得到了廣泛應用。 …

Flutter - 原生交互 - 相冊

環境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 iOS 13.4.1 iOS 18.5 集成image_picker 在Flutter中可以使用image_picker插件實現從相冊中獲取圖片 添加插件 flutter中訪問相冊image_picker插件 flutter pub add image_pickerflutter pub getXcode工程的GenerateP…

node.js在vscode的配置

文章目錄 概要1. 使用和webstrom一樣的快捷鍵2. 讓vscode的主題變成webstrom3. 如何在 Node.js 環境下寫代碼3.1 使用 ESLint配置規則3.2 配置.vscode/settings.json 4. Prettier安裝5. 其它問題解決 概要 node.js在webstrom編輯器中可以完美使用代碼提示、錯誤提示等功能&…

Android14音頻子系統-Audio HAL分析

文章目錄 1&#xff09;概述2&#xff09;HAL的打開流程3&#xff09;HAL庫的實現(Qualcomm)4&#xff09;tinyalsa5&#xff09;數據結構6&#xff09;代碼流程 1&#xff09;概述 1、回顧HAL、tinyalsa與linux driver的關系 2、與AudioFlinger的關系 3、 1、如何判斷當前…

前端與 Spring Boot 后端無感 Token 刷新 - 從原理到全棧實踐

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Micro麥可樂的博客 &#x1f425;《Docker實操教程》專欄以最新的Centos版本為基礎進行Docker實操教程&#xff0c;入門到實戰 &#x1f33a;《RabbitMQ》…

【AI智能體】新手教程-通過 Chat SDK 搭建網頁在線客服

通過扣子搭建的智能體可以一鍵發布為 Chat SDK&#xff0c;快速部署到你的自建網站中&#xff0c;作為在線智能客服面向網站的用戶提供 AI 答疑服務。本文檔介紹通過 Chat SDK 搭建網頁版在線客服的詳細操作步驟。 場景說明 網站作為企業和組織與用戶互動的重要平臺&#xff…

flask靜態資源與模板頁面、模板用戶登錄案例

案例代碼 import flask# template_folder 模板文件夾(靜態頁面 html頁面渲染) # static_folder 靜態資源文件夾主要存放的是類似靜態數據、音頻、視頻、圖片等 app flask.Flask(__name__, static_folderstatic, template_foldertemplate)app.route(/) def index():# render_t…

【工具教程】識別PDF中文字內容,批量識別文字并保存到Excel表格中的操作步驟和方法

在日常辦公和文件管理中&#xff0c;我們常常會遇到需要處理大量 PDF 文件的情況。有時&#xff0c;為了更好地管理和查找這些文件&#xff0c;需要根據 PDF 文件中特定區域的文字內容對文件進行重命名。例如&#xff0c;在企業檔案管理中&#xff0c;合同文件可能需要根據合同…