微服務高可用方案

来源:https://www.cnblogs.com/lossingdawn/archive/2019/07/22/11223577.html
-Advertisement-
Play Games

微服務高可用方案 一、微服務的高可用 在註冊中心、配置中心高可用方案之前,瞭解一下註冊中心的工作原理,下麵分為兩個部分來解釋,一是註冊中心和各個微服務的註冊表的獲取與同步,二是註冊中心如何去維護註冊表。 1.1、註冊表的獲取與同步 Eureka Server和Eureka Client之間的關係,通 ...


微服務高可用方案

一、微服務的高可用

在註冊中心、配置中心高可用方案之前,瞭解一下註冊中心的工作原理,下麵分為兩個部分來解釋,一是註冊中心和各個微服務的註冊表的獲取與同步,二是註冊中心如何去維護註冊表。

1.1、註冊表的獲取與同步

Eureka Server和Eureka Client之間的關係,通過註冊表來維護,而註冊表的通過Eureka Server集中化管理,每個Client在本地進行註冊表的緩存,通過周期性的任務拉取最新的註冊表信息。簡單的示例圖如下。

img

根據上圖所展示的流程,可以瞭解到註冊中心與微服務之間的基本聯繫的流程:

1.服務A啟動時,向Eureka Server註冊自己的相關信息

2.當服務B向Eureka Server拉取最新的註冊表時,就可以拿到服務A的一臺機器註冊信息

3.服務A的另外兩台機器再去註冊,服務B 30s後再次去拉取時,就會得到服務A的三台機器的註冊信息

4.服務A、每30s向Eureka Server發送一次心跳信息,表明自己的註冊信息還是有效的

以上是註冊中心與微服務之間交互的大體流程,在具體的實踐中,Eureka Server會提供多級緩存,其中的註冊表的信息的獲取與同步,又會有細微的差別。

1.Eureka Server的註冊表直接基於純記憶體,即在記憶體里維護了一個數據結構。

2.各個服務的註冊、服務下線、服務故障,全部會在記憶體里維護和更新這個註冊表。

3.各個服務每隔30秒拉取註冊表的時候,Eureka Server就是直接提供記憶體里存儲的有變化的註冊表數據給他們就可以了。

4.同樣,每隔30秒發起心跳時,也是在這個純記憶體的Map數據結構里更新心跳時間。

Eureka Server的註冊表是純記憶體處理的,因此處理速度會很快,同時提供 readWriteCacheMap 和 readOnlyCacheMap 做緩存,保障了頻繁讀寫不會衝突。示意圖如下。

img

上圖介紹了Eureka Server多級緩存的工作原理:

1.當第一臺服務A註冊時,它的註冊信息會更新到記憶體的註冊表中,如果 readWriteCacheMap 中有相應的信息,則過期掉,如果沒有則不做操作

2.當服務B去拉取註冊表信息時,先找 readOnlyCacheMap ,沒有再找 readWriteCacheMap ,再沒有就去記憶體的註冊表查找註冊信息,查到就更新到 readWriteCacheMap 中,返回給服務B,服務B的註冊表中,就會有一臺服務A的機器註冊信息

3.readOnlyCacheMap 和 readWriteCacheMap 之間的同步是有一個後臺的定時任務,每隔30s去同步一次,緩存同步任務

4.第二台服務A註冊時,更新記憶體的註冊表,同時把 readWriteCacheMap 過期掉

5.在緩存同步任務執行之前服務B去拉取註冊表時,都是從 readOnlyCacheMap 中拿到數據,新的註冊表的信息,不會被服務B拿到

6.30s後,緩存同步任務會同步 readWriteCacheMap 和 readOnlyCacheMap 中的數據,把readOnlyCacheMap 中的註冊表過期掉,這時服務B就會找 readWriteCacheMap 拿數據,readWriteCacheMap 從記憶體中拿到數據後緩存,返回給服務B,服務B的註冊表中,就會有兩台服務A的機器註冊信息

7.在下一個30s,緩存同步任務把 readWriteCacheMap 同步到 readOnlyCacheMap 之前, readOnlyCacheMap 沒有第二台服務A的註冊緩存,因此都是從 readWriteCacheMap 中取到最新數據

註:

readOnlyCacheMap 緩存更新的定時器時間間隔,預設為30秒

readWriteCacheMap 緩存過期時間,預設為 180 秒

由以上流程說明可知,Eureka Server採取了多級緩存策略,同時最新的註冊表生效有30s的時延。多級緩存機制的優點是什麼:

1.儘可能保證了記憶體註冊表數據不會出現頻繁的讀寫衝突問題。

2.並且進一步保證對Eureka Server的大量請求,都是快速從純記憶體走,性能極高。

1.2、註冊中心維護微服務的註冊表

Eureka Client與註冊表相關的行為如下所示:

1.服務註冊(Registry)——初始化時執行一次,向服務端註冊自己服務實例節點信息包括ip、埠、實例名等,基於POST請求。

2.服務續約(renew)——預設每隔30s向服務端PUT一次,保證當前服務節點狀態信息實時更新,不被服務端失效剔除。

3.更新已經註冊服務列表(fetchRegistry)——預設每隔30s從服務端GET一次增量版本信息,然後和本地比較併合並,保證本地能獲取到其他節點最新註冊信息。

4.服務下線(cancel)——在服務shutdown的時候,需要及時通知服務端把自己剔除,以避免客戶端調用已經下線的服務。

Eureka Client是通過Jersey Client基於Http協議與Eureka Server交互來註冊服務、續約服務、取消服務、服務查詢等。同時,Server端還會維護一份服務實例清單,並每隔90s對未續約的實例進行失效剔除。

Eureka Server有一個自我保護機制,當網路發生故障時,客戶端與服務端不通,這是需要啟動Eureka Server的自我保護機制,這樣不會剔除服務,當網路恢復時,退出自我保護。自我保護有兩個參數,最後一分鐘收到的心跳數(Renews (last min))、期望收到的心跳數(Renews threshold),當Renews threshold > Renews (last min) 時,進入自我保護模式。

Renews (last min) = 實例數 * 2 #實例數算上Eureka Server自註冊服務

Renews threshold = Renews (last min) * 0.85 # 0.85可配置

下圖的註冊中有10個實例:

img

推薦多個Eureka Server部署時,開啟自我保護

eureka.client.register-with-eureka = true

1.3、分散式註冊中心

瞭解了註冊中心的工作原理,下麵開始研究分散式服務,多註冊中心、多服務實例的情況。

當微服務僅向一臺註冊中心註冊時,當這個註冊中心發生故障時,新服務無法繼續註冊上去,舊服務的註冊信息,緩存在其他註冊中心和客戶端中,依舊可以使用,當重啟之後,無法向註冊中心註冊,也是無法使用的。

因此構建高可用的註冊中心時,需要交叉註冊,每個註冊中心既當服務端,又當客戶端,向其他註冊中心註冊自己,同時微服務需要向每個註冊中心進行註冊,由註冊中心自己過濾互備,防止單個註冊中心故障而導致只往它上面註冊微服務重啟後不可用。示意圖如下所示。

img

目前註冊中心與配置中心集中在一起,可拆可不拆,對整體影響不大,拆分是為了註冊中心和配置中心相互間不影響。gitlab部署在某一臺機器上,所有config共用,由於gitlab的原因,導致config的分散式存在單點故障的隱患。每個config分別用獨立的gitlab,又給運維帶來極大的不便。後期採用apollo,用資料庫存儲配置,利用資料庫的分散式優勢替代gitlab,來解決單點故障的問題。

1.4、註冊中心壓測

根據壓測調研,8核4G的Eureka Server在處理1000個服務實例時,沒有任何壓力,在預設情況下,可以處理7000個實例,超出的會超時報錯,在修改tomcat的配置之後,最多可以承載8000實例,此時CPU基本滿載。

升級註意事項:

1、Eureka Server之間相互註冊,Eureka Client需要在每個Server上都註冊一邊

2、Eureka Server開啟自我保護

3、Eureka Client的實例數不超過1000個

參考:

[1] https://www.jianshu.com/p/ae4f0c8b8135

[2] https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html

[3] http://springcloud.cn/view/31


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

-Advertisement-
Play Games
更多相關文章
  • 實現nginx日誌按照時間分割存儲 backups_log.sh 將sh腳本加入到定時任務中,每天23:59執行 添加定時任務 註意事項: 1.在沒有執行kill -USR1 nginx_pid 之前,即便已經對文件執行了mv命令也只是改變了文件的名稱,nginx還是會向新命名的文件中照常寫入日誌數 ...
  • 1. 模式 在一定環境中解決某一問題的方案,包括三個基本元素:問題、解決方案和環境。 2. 設計模式 (1)設計模式是一套反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解,保證代碼可靠性。毫無疑問,設計模式於系統是多贏的。 (2)設計模 ...
  • 互聯網公司容器集群大規模運維應用的雲運維難點思路核心模塊今天先到這兒,希望對技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能感興趣的文章: 領導人怎樣帶領好團隊構建創業公司突擊小團隊國際化環境下系統架構演化微服務架構設計視頻直播平臺的系統... ...
  • 舉個慄子 問題描述 畫一個小人,有頭、身體、兩手、兩腳就可以了。 簡單實現 人類 測試 測試結果 存在問題 畫人的時候,頭身手腳是必不可少的,不管什麼人物,開發時是不能少的。但上面測試代碼中時各部分堆積起來,很容易漏寫,比如導致健全的人物卻少了一條“腿”。而且如果需要在別的地方用這些畫小人的程式怎麼 ...
  • 第一篇博客(無關技術) 第一篇博客不知從何入手,有寫博客的想法是因為想要記錄自己學習Java的歷程及總結,2019年7月21,寫這篇博客的時間是大三的暑假。 由於大學是學的軟體工程,所以日後想要從事IT行業,大一學的一門語言是C基礎,大三學的一門語言是Java,後續感覺在學校也學了很多關於電腦相關 ...
  • Java面試題經常會問的問題 面試官Q1:請問StringBuffer和StringBuilder有什麼區別? 這是一個老生常談的話題,筆者前幾年每次面試都會被問到,作為基礎面試題,被問到的概率百分之八九十。下麵我們從面試需要答到的幾個知識點來總結一下兩者的區別有哪些? 繼承關係? 如何實現的擴容?... ...
  • 看到一篇非常全面的SQL優化文章,在開發的工作中往往不考慮性能上的缺失(在一開始的時候數據量不大也看不出速度上的區別)。但寫的越多越應該規範一下寫法。 原文鏈接:http://www.jfox.info/SQL-you-hua.html By Lee - Last updated: 星期五, 五月 ...
  • 最近在網上偶然看到此題: 有兩個序列a,b,大小都為n,序列元素的值任意整形數,無序; 要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小 經過一番思索,我試著用窮舉法來解一下這道題,大概思路如下: 1、分別求a,b序列元素之和sum_a、sum_b2、算出min = ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...