如何優化Spring Cloud微服務註冊中心架構?

来源:https://www.cnblogs.com/yuxiang1/archive/2019/03/05/10480292.html
-Advertisement-
Play Games

作者: 石杉的架構筆記 1、再回顧:什麼是服務註冊中心? 先回顧一下什麼叫做服務註冊中心? 顧名思義,假設你有一個分散式系統,裡面包含了多個服務,部署在不同的機器上,然後這些不同機器上的服務之間要互相調用。 舉個現實點的例子吧,比如電商系統里的訂單服務需要調用庫存服務,如下圖所示。 現在的問題在於, ...


作者: 石杉的架構筆記

1、再回顧:什麼是服務註冊中心?

先回顧一下什麼叫做服務註冊中心?

顧名思義,假設你有一個分散式系統,裡面包含了多個服務,部署在不同的機器上,然後這些不同機器上的服務之間要互相調用。

舉個現實點的例子吧,比如電商系統里的訂單服務需要調用庫存服務,如下圖所示。

現在的問題在於,訂單服務在192.168.31.154這台機器上,庫存服務在192.137.1.33這台機器上。

現在訂單服務是想要調用庫存服務,但是他並不知道庫存服務在哪台機器上啊!畢竟人家都是在不同機器上的。

所以這個時候就需要服務註冊中心出場了,這個時候你的系統架構中需要引入獨立部署在一臺機器上的服務註冊中心,如下圖所示。

然後訂單服務、庫存服務之類的兄弟,都需要配置上服務註冊中心部署在哪台機器上,比如192.168.31.45這台機器。

接著訂單服務、庫存服務他們自己啟動的時候,就得發送請求到到服務註冊中心上去進行服務註冊。

也就是說,得告訴服務註冊中心,自己是哪個服務,然後自己部署在哪台機器上。

然後服務註冊中心會把大家註冊上來的信息放在註冊表裡,如下圖。

接著訂單服務假如想要調用庫存服務,那麼就找服務註冊中心問問:能不能告訴我庫存服務部署在哪台機器上?

服務註冊中心是知道這個信息的,所以就會告訴訂單服務:庫存服務部署在192.1371.133這台機器上,你就給這台機器發送請求吧。

然後,訂單服務就可以往庫存服務的那台機器發送請求了,完成了服務間的調用。

整個過程,如下圖所示:

上述就是服務註冊中心的作用、地位以及意義,現在大家應該知道服務註冊中心的作用了吧。

好!接著我們就來看看Consul作為服務註冊中心,他的架構設計原理是什麼?

 

2、Consul服務註冊中心的整體架構

如果要基於Consul作為服務註冊中心,那麼首先必須在每個服務所在的機器上部署一個Consul Agent,作為一個服務所在機器的代理。

然後還得在多台機器上部署Consul Server,這就是核心的服務註冊中心。

這個Consul Agent可以用來收集你的服務信息然後發送給Consul Server,還會對你的服務不停的發送請求檢查他是否健康。

然後你要發現別的服務的時候,Consul Agent也會幫你轉發請求給Consul Server,查詢其他服務所在機器。

Consul Server一般要求部署3~5台機器,以保證高可用以及數據一致性。

他們之間會自動實現數據同步,而且Consul Server集群會自動選舉出一臺機器作為leader,其他的Consul Server就是follower。

咱們看下麵的圖,先感受一下這個Consul他整體的架構。

3、Consul如何通過Raft協議實現強一致性?

首先上篇文章:尷尬了!Spring Cloud微服務註冊中心Eureka 2.x停止維護了咋辦?已經說了,Eureka服務註冊中心是不保證數據一致性的。

這樣的話,很可能你註冊的服務,其他人是發現不了的,或者很遲才能發現。

OK,那麼這裡就來討論一下Consul是如何實現數據一致性的。

首先,大家知道Consul Server是部署集群的,而且他會選舉出來一臺Server作為Leader。

接下來各個服務發送的註冊請求都會落地給Leader,由Leader同步給其他Follower。

所以首先第一點,Leader Server是絕對有最新的服務註冊信息的,是不是?

比如庫存服務發起註冊了,那麼Leader Server上一定有庫存服務的註冊信息。

接著如果比如訂單服務要發現庫存服務的話,這個查詢請求會發送給Leader Server。

這樣服務註冊和發現,都是通過一臺Leader Server來進行的,就可以保證服務註冊數據的強一致性了,大家看下圖。

接著大家想,假如說庫存服務在註冊的時候數據剛寫到Leader Server,結果Leader Server就宕機了,這時候怎麼辦?

那麼此時這條註冊數據就丟失了,訂單服務就沒法發現那個庫存服務了。沒關係,這裡Consul會基於Raft協議來解決這個問題。

首先,庫存服務註冊到Leader Server的時候,會採取Raft協議,要求必須讓Leader Server把這條註冊數據複製給大部分的Follower Server才算成功。

這就保證了,如果你認為自己註冊成功了,那麼必然是多台Consul Server都有這條註冊數據了。

如果你剛發送給Leader Server他自己就宕機了,那麼這次註冊會認為失敗。

此時,Consul Server集群會重新選舉一個Leader Server出來,你需要再次重新註冊。

這樣就可以保證你註冊成功的數據絕對不會丟,然後別人發現服務的時候一定可以從Leader Server上獲取到最新的強一致的註冊數據。

整個過程,如下圖所示:

上面的圖就可以看到,只要你註冊的時候基於Raft協議強制同步到大多數Server,哪怕是Leader掛了,也會選舉新的Leader。

這樣就可以讓別人從新的Leader Server來發現你這個服務,所以數據是絕對強一致的。

 

4、Consul如何通過Agent實現分散式健康檢查?

最後說說Consul是如何通過各個服務機器上部署Agent來實現分散式健康檢查的。

集中式的心跳機制,比如傳統的Eureka,是讓各個服務都必須每隔一定時間發送心跳到Eureka Server。

如果一段時間沒收到心跳,那麼就認為這個服務宕機了。

但是這種集中式的心跳機制會對Eureka Server造成較大的心跳請求壓力,實際上平時Eureka Server接收最多的請求之一就是成千上萬服務發送過來的心跳請求。

 

所以Consul在這塊進行了架構優化,引入了Agent概念。

每個機器上的Consul Agent會不斷的發送請求檢查服務是否健康,是否宕機。如果服務宕機了,那麼就會通知Consul Server。

怎麼樣?是不是發現各個服務自己不用再發送心跳請求去Server了?減小了Server這部分的壓力吧?

沒錯,這就是Consul基於Agent實現的分散式健康檢查機制,可以大幅度的減小Server端的壓力。

這樣一來,哪怕你就部署個三五台機器,可以輕鬆支持成千上萬個服務。

咱們再來一張圖,一起來看看:

 

免費Java資料領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分散式、大數據、機器學習等技術。
傳送門:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q


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

-Advertisement-
Play Games
更多相關文章
  • 對伯樂線上所有文章進行爬取 使用scrapy框架 jobbolen.py 解決方案: 由於將一個字元串傳遞給數組導致錯誤 將jobbolen.py中的front_image改成[front_image] ...
  • 1:下載 ElasticSearch 鏡像 2:創建 ElasticSearch 容器: 啟動成功後在瀏覽器地址欄輸入:http://宿主機ip:9200 出現如下,表示啟動成功 3:但是如果 Java 使用 9300 埠連接ES 會出現如下錯誤 4:修改docker容器中的配置文件: 進入 co ...
  • 1. 首先新建文件夾media 後 在項目setting中具體配置: 在 setting 中的 TEMPLATES 下的 OPTIONS 中的 context_processors 中追加: TEMPLATES = [ { 'DIRS': [os.path.join(BASE_DIR, 'templ ...
  • python中根據字元串導入模塊module 需要導入importlib,使用其中的import_module方法 import importlib modname = 'datetime' datetime_module = importlib.import_module(modname) pri ...
  • 一、Redis Cluster集群簡介 Redis Cluster是Redis官方提供的分散式解決方案,在3.0版本後推出的,有效地解決了Redis分散式的需求,當一個節點掛了可以快速的切換到另一個節點,當遇到單機記憶體、併發等瓶頸時,可以採用分散式方案要解決問題。 二、集群原理 Redis Clus ...
  • 1.final、finally、finally final—修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變數或方法聲明為final,可以保證它們在使用中不被改變。被聲明為fin ...
  • 問題:對於integer對象,當比較2=2的時候,返回的值是true還是false?當比較2000=2000的時候,返回的值是true還是false? 回答:當比較2=2的時候,返回的值是true;當比較2000=2000的時候,返回的值是false。 理由:equal比較是兩個值的大小是否能夠相等 ...
  • 過程解析: 1.首先執行int[] arr={3,5,6,1,7,9,0},遇到數組先執行等式右邊的,{3,5,6,1,7,9,0}會在堆記憶體中開闢一塊空間,分成7小塊,下標分別從0~6,先進行系統初始化,系統預設初始值均為0,然後將程式初始值3,5,6,1,7,9,0分別賦值給7塊小空間,在堆記憶體 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...