微服務治理

来源:https://www.cnblogs.com/zhenghongxin/archive/2019/05/01/10800354.html
-Advertisement-
Play Games

微服務遠程調用可能有如下問題: 註冊中心宕機; 服務提供者B有節點宕機; 服務消費者A和註冊中心之間的網路不通; 服務提供者B和註冊中心之間的網路不通; 服務消費者A和服務提供者B之間的網路不通; 服務提供者B有些節點性能變慢; 服務提供者B短時間內出現問題。 註冊中心宕機; 服務提供者B有節點宕機 ...


微服務遠程調用可能有如下問題:

  • 註冊中心宕機;

  • 服務提供者B有節點宕機;

  • 服務消費者A和註冊中心之間的網路不通;

  • 服務提供者B和註冊中心之間的網路不通;

  • 服務消費者A和服務提供者B之間的網路不通;

  • 服務提供者B有些節點性能變慢;

  • 服務提供者B短時間內出現問題。

常用的服務治理手段:

節點管理

服務調用失敗一般是由兩類原因引起的,一類是服務提供者自身出現問題,如伺服器宕機、進程意外退出等;一類是網路問題,如服務提供者、註冊中心、服務消費者這三者任意兩者之間的網路出現問題。

無論是服務提供者自身出現問題還是網路發生問題,都有兩種節點管理手段。

1. 註冊中心主動摘除機制

這種機制要求服務提供者定時的主動向註冊中心彙報心跳,註冊中心根據服務提供者節點最近一次彙報心跳的時間與上一次彙報心跳時間做比較,如果超出一定時間,就認為服務提供者出現問題,繼而把節點從服務列表中摘除,並把最近的可用服務節點列表推送給服務消費者。

2. 服務消費者摘除機制

雖然註冊中心主動摘除機制可以解決服務提供者節點異常的問題,但如果是因為註冊中心與服務提供者之間的網路出現異常,最壞的情況是註冊中心會把服務節點全部摘除,導致服務消費者沒有可用的服務節點調用,但其實這時候服務提供者本身是正常的。所以,將存活探測機制用在服務消費者這一端更合理,如果服務消費者調用服務提供者節點失敗,就將這個節點從記憶體中保存的可用服務提供者節點列表中移除。

負載均衡 

一般情況下,服務提供者節點不是唯一的,多是以集群的方式存在,尤其是對於大規模的服務調用來說,服務提供者節點數目可能有上百上千個。由於機器採購批次的不同,不同服務節點本身的配置也可能存在很大差異,新採購的機器CPU和記憶體配置可能要高一些,同等請求量情況下,性能要好於舊的機器。對於服務消費者而言,在從服務列表中選取可用節點時,如果能讓配置較高的新機器多承擔一些流量的話,就能充分利用新機器的性能。這就需要對負載均衡演算法做一些調整。

常用的負載均衡演算法主要包括以下幾種。

1. 隨機演算法

顧名思義就是從可用的服務節點中隨機選取一個節點。一般情況下,隨機演算法是均勻的,也就是說後端服務節點無論配置好壞,最終得到的調用量都差不多。

2. 輪詢演算法 

就是按照固定的權重,對可用服務節點進行輪詢。如果所有服務節點的權重都是相同的,則每個節點的調用量也是差不多的。但可以給某些硬體配置較好的節點的權重調大些,這樣的話就會得到更大的調用量,從而充分發揮其性能優勢,提高整體調用的平均性能。

3. 最少活躍調用演算法

這種演算法是在服務消費者這一端的記憶體里動態維護著同每一個服務節點之間的連接數,當調用某個服務節點時,就給與這個服務節點之間的連接數加1,調用返回後,就給連接數減1。然後每次在選擇服務節點時,根據記憶體里維護的連接數倒序排列,選擇連接數最小的節點發起調用,也就是選擇了調用量最小的服務節點,性能理論上也是最優的。

 4. 一致性Hash演算法

指相同參數的請求總是發到同一服務節點。當某一個服務節點出現故障時,原本發往該節點的請求,基於虛擬節點機制,平攤到其他節點上,不會引起劇烈變動。

這幾種演算法的實現難度也是逐步提升的,所以選擇哪種節點選取的負載均衡演算法要根據實際場景而定。如果後端服務節點的配置沒有差異,同等調用量下性能也沒有差異的話,選擇隨機或者輪詢演算法比較合適;如果後端服務節點存在比較明顯的配置和性能差異,選擇最少活躍調用演算法比較合適。

服務路由

對於服務消費者而言,在記憶體中的可用服務節點列表中選擇哪個節點不僅由負載均衡演算法決定,還由路由規則確定。

所謂的路由規則,就是通過一定的規則如條件表達式或者正則表達式來限定服務節點的選擇範圍。 

為什麼要制定路由規則呢?主要有兩個原因。 

1. 業務存在灰度發佈的需求

比如,服務提供者做了功能變更,但希望先只讓部分人群使用,然後根據這部分人群的使用反饋,再來決定是否做全量發佈。這個時候,就可以通過類似按尾號進行灰度的規則限定只有一定比例的人群才會訪問新發佈的服務節點。 

2. 多機房就近訪問的需求

據我所知,大部分業務規模中等及以上的互聯網公司,為了業務的高可用性,都會將自己的業務部署在不止一個IDC中。這個時候就存在一個問題,不同IDC之間的訪問由於要跨IDC,通過專線訪問,尤其是IDC相距比較遠時延遲就會比較大,比如北京和廣州的專線延遲一般在30ms左右,這對於某些延時敏感性的業務是不可接受的,所以就要一次服務調用儘量選擇同一個IDC內部的節點,從而減少網路耗時開銷,提高性能。這時一般可以通過IP段規則來控制訪問,在選擇服務節點時,優先選擇同一IP段的節點。

那麼路由規則該如何配置呢?根據我的實際項目經驗,一般有兩種配置方式。

1. 靜態配置

就是在服務消費者本地存放服務調用的路由規則,在服務調用期間,路由規則不會發生改變,要想改變就需要修改服務消費者本地配置,上線後才能生效。

2. 動態配置

這種方式下,路由規則是存在註冊中心的,服務消費者定期去請求註冊中心來保持同步,要想改變服務消費者的路由配置,可以通過修改註冊中心的配置,服務消費者在下一個同步周期之後,就會請求註冊中心來更新配置,從而實現動態更新。

服務容錯 

服務調用並不總是一定成功的,可能因為服務提供者節點自身宕機、進程異常退出或者服務消費者與提供者之間的網路出現故障等原因。對於服務調用失敗的情況,需要有手段自動恢復,來保證調用成功。

常用的手段主要有以下幾種。

  • FailOver:失敗自動切換。就是服務消費者發現調用失敗或者超時後,自動從可用的服務節點列表總選擇下一個節點重新發起調用,也可以設置重試的次數。這種策略要求服務調用的操作必須是冪等的,也就是說無論調用多少次,只要是同一個調用,返回的結果都是相同的,一般適合服務調用是讀請求的場景。

  • FailBack:失敗通知。就是服務消費者調用失敗或者超時後,不再重試,而是根據失敗的詳細信息,來決定後續的執行策略。比如對於非冪等的調用場景,如果調用失敗後,不能簡單地重試,而是應該查詢服務端的狀態,看調用到底是否實際生效,如果已經生效了就不能再重試了;如果沒有生效可以再發起一次調用。

  • FailCache:失敗緩存。就是服務消費者調用失敗或者超時後,不立即發起重試,而是隔一段時間後再次嘗試發起調用。比如後端服務可能一段時間內都有問題,如果立即發起重試,可能會加劇問題,反而不利於後端服務的恢復。如果隔一段時間待後端節點恢復後,再次發起調用效果會更好。

  • FailFast:快速失敗。就是服務消費者調用一次失敗後,不再重試。實際在業務執行時,一般非核心業務的調用,會採用快速失敗策略,調用失敗後一般就記錄下失敗日誌就返回了。

對服務容錯不同策略的描述中,可以看出它們的使用場景是不同的,一般情況下對於冪等的調用,可以選擇FailOver或者FailCache,非冪等的調用可以選擇FailBack或者FailFast。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一起學Android之Handler,簡單介紹Handler的相關知識點以及初步應用,僅供學習分享使用。 ...
  • NSProxy需要實現哪些方法?為什麼 - forwardingTargetForSelector: 被註釋了? ...
  • 本文同步自http://javaexception.com/archives/77 背景: 在上一篇文章中,給出了一種複製QQ效果的方案,今天就來講講換一種方式實現。主要依賴的是一個開源項目https://github.com/shangmingchao/PopupList。 解決辦法: Popup ...
  • [TOC] 註冊博客園賬號有一個多月了, 一直想優化一下自己的博客頁面. 在首頁瀏覽時候發現一位博主的頁面挺乾凈整潔的, 而且他分享了製作的思路, 於是下定決心美化一番. 本文將介紹美化的思路, 並貼上所有代碼, 俗話說授之以魚也要授之以漁. 一. 感謝熱心博主分享的攻略 致謝要寫在前面, 這位博主 ...
  • 一、前言 隨著前端業務的不斷發展,頁面交互邏輯的不斷提高,讓數據和界面實現分離漸漸被提了出來。JavaScript的MVC思想也流行了起來,在這種背景下,基於node.js的模板引擎也隨之出現。 什麼是模板引擎? 它用於解析動態數據和靜態頁面所生成的視圖文件,將原本靜態的數據變為動態,快速地實現頁面 ...
  • 通過渲染一張DEM的具體例子,瞭解在WebGL中顏色渲染的過程。 ...
  • 公司用的架構,在此找了資料作為記錄復看所用: 什麼是Service Mesh? Service Mesh的概念最早是由Buoyant公司的CEO William Morgan在一篇文章里提出,他給出的服務網格的定義是: A service mesh is a dedicated infrastruc ...
  • 服務路由的應用場景 分組調用。一般來講,為了保證服務的高可用性,實現異地多活的需求,一個服務往往不止部署在一個數據中心,而且出於節省成本等考慮,有些業務可能不僅在私有機房部署,還會採用公有雲部署,甚至採用多家公有雲部署。服務節點也會按照不同的數據中心分成不同的分組,這時對於服務消費者來說,選擇哪一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...