日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

作者 | 波哥

審校 | 重樓

出品 | 51CTO技術棧(微信號:blog51cto)

在微服務架構中,服務發現和注冊是確保各個微服務之間通信和協作的核心組件?.NETflix Eureka作為一款開源的服務發現和注冊工具,在現代分布式系統中扮演著重要角色。本文將從代碼層面深入探討Netflix Eureka的底層實現原理,為讀者詳細呈現其內部運行機制。

Netflix Eureka由Eureka服務器和Eureka客戶端兩部分構成。它們協同工作,構建了一個完整的服務發現和注冊系統。

一、Eureka服務器

Eureka服務器負責存儲和管理所有已注冊的服務實例信息,保證服務發現的準確性。Eureka服務器的核心是InstanceRegistry、LeaseManager和SelfPreservationFilter。下面結合代碼詳細介紹下這幾個核心組件。

1.InstanceRegistry(實例注冊表)

實例注冊表負責存儲所有已注冊的服務實例信息,包括它們的元數據,如實例ID、主機名、端口等。從代碼層面來看,InstanceRegistry是一個包含了實例信息的內存數據結構,通常使用ConcurrentHashMap來存儲,當一個新的服務實例注冊時,InstanceRegistry 的 register 方法被調用,將該實例信息添加到注冊表中;當一個服務實例不再可用,需要從Eureka服務器取消注冊時,InstanceRegistry 的 cancel 方法被調用,從注冊表中移除該實例信息。具體的功能包括:

注冊服務實例:register 方法負責將服務實例注冊到注冊表。

取消注冊服務實例:cancel 方法用于從注冊表中移除不再可用的實例。

獲取服務實例信息:getInstancesById 方法用于獲取特定服務的所有實例信息。

2.LeaseManager(租約管理器)

租約管理器負責管理實例的租約,租約是Eureka服務器中的一個重要概念,用于確保實例的健康狀態。在代碼層面,LeaseManager維護了一個租約的集合,并提供了操作租約的方法,主要包括:

注冊實例并創建租約:register 方法負責為新注冊的實例創建租約。

續約租約:renew 方法用于更新租約的到期時間,延長租約的有效期。

移除租約:cancel 方法負責在實例取消注冊時移除租約。

在服務實例注冊時,LeaseManager 的 register 方法被調用,創建一個新的租約,并將其添加到租約管理器中。在服務實例定期發送心跳續約請求時,LeaseManager 的 renew 方法被調用,更新租約的到期時間,確保租約的有效性。當一個服務實例取消注冊時,LeaseManager 的 cancel 方法被調用,從租約管理器中移除相應的租約。

下面是具體方法內容:

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

3.SelfPreservationFilter(自我保護過濾器)

自我保護機制是Netflix Eureka服務器(服務端)中的一項重要功能。它旨在確保在網絡抖動等異常情況下,Eureka服務器不會過早地剔除正常運行的服務實例,從而保持服務的可用性和穩定性。

當Eureka服務器開啟自我保護機制時,它會監測心跳續約失敗的實例數量。如果在某個時間段內,心跳續約失敗的實例數量超過了預定的閾值,Eureka服務器將進入自我保護模式。在自我保護模式下,Eureka服務器不會剔除任何正常運行的實例,以免影響整個系統的穩定性。這是為了避免在網絡抖動等情況下,誤判正常實例失效。

需要注意的是,雖然自我保護機制保護了Eureka服務器上的服務注冊表,但在自我保護模式下,Eureka服務器將不再從已注冊的實例中移除長時間未續約的實例,這可能會導致注冊表中存在已經下線或失效的實例。因此,自我保護機制只是應對短期網絡問題的臨時解決方案,當問題解決后,Eureka服務器會自動退出自我保護模式,重新恢復正常的剔除機制。

在代碼層面,SelfPreservationFilter定期計算心跳續約失敗的比例,根據配置啟動或關閉自我保護模式。SelfPreservationFilter 是一個在后臺運行的線程,定期檢查注冊表中的實例健康狀態。它會周期性地計算心跳續約失敗的比例,當心跳續約失敗比例超過一定閾值時,會啟動自我保護模式,以防止錯誤地移除正常的服務實例。如果心跳續約失敗比例降低到一定程度,會關閉自我保護模式。具體功能包括:

  • 統計心跳續約失敗比例:calculateThresholdBreachCount 方法統計失敗的心跳續約比例。
  • 啟動/關閉自我保護模式:disable 和 enable 方法分別用于啟動和關閉自我保護模式。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

二、Eureka客戶端

在微服務應用啟動時,Eureka客戶端將自身的實例信息注冊到Eureka服務器,并從服務器獲取其他服務實例信息,實現服務的發現和負載均衡。它包括DiscoveryClient(服務發現客戶端)、InstanceInfo(實例信息)、EurekaHttpClient(Eureka HTTP客戶端)三個核心組件,下面詳細介紹每個組件:

1.DiscoveryClient(服務發現客戶端)

從Eureka服務器獲取服務實例信息,并緩存在本地。它提供了getInstances、getServices等方法,支持負載均衡和服務發現。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

其中getInstances 方法用于在服務調用前獲取特定服務的所有實例信息,實現動態的服務發現。getNextServerFromEureka 方法在服務調用時被調用,實現負載均衡邏輯,選擇要調用的服務實例;而refreshRegistry 方法定期刷新注冊表信息,以確保實例信息的最新性。

2.InstanceInfo(實例信息)

在應用啟動時,Eureka客戶端創建InstanceInfo對象,包含實例的元數據。它在服務實例啟動時創建并初始化,存儲了該實例的基本信息,如實例ID、主機名、端口和狀態。它通過HTTP請求將元數據注冊到Eureka服務器。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

3.EurekaHttpClient(Eureka HTTP客戶端)

它用于客戶端與Eureka服務器的通信,發送注冊、續約、取消注冊等HTTP請求,獲取注冊表信息。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

其中:

  • register 方法在服務實例啟動時調用,向Eureka服務器注冊實例信息。
  • renew 方法定期發送心跳續約請求,保持實例的健康狀態。
  • cancel 方法在服務實例關閉或取消注冊時調用,向Eureka服務器發送取消注冊請求。
  • getInstances 方法在服務發現過程中被調用,向Eureka服務器請求特定服務的實例信息。
  • refreshRegistry 方法周期性地刷新注冊表信息,以保持信息的準確性。

三、流程梳理

下面筆者大概梳理了下幾個主要流程:

1、服務注冊流程

  • Eureka客戶端創建InstanceInfo對象,包含實例元數據。
  • 客戶端通過HTTP請求將InstanceInfo注冊到Eureka服務器的InstanceRegistry。
  • LeaseManager創建租約,管理續約周期和到期時間。

2、心跳續約流程

  • Eureka客戶端定期發送心跳續約請求,維持租約有效。
  • LeaseManager更新租約到期時間,確保租約不會過期。
  • Eureka服務器根據心跳續約來監測實例的健康狀態。

3、服務發現與負載均衡流程

  • Eureka客戶端通過DiscoveryClient獲取其他服務實例信息。
  • 客戶端根據負載均衡策略選擇一個實例。
  • 客戶端發起HTTP請求,實現服務調用和負載均衡。

四、實例演示

現在,讓我們通過實際演示來了解如何使用Eureka服務端和客戶端。

1、Eureka服務端演示:

創建Eureka Server:首先,創建一個Spring Boot項目,并添加Eureka Server依賴。

配置文件:在Application.yml中,進行基本的配置,如端口和Eureka Server配置。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

啟動類:創建啟動類,并添加@EnableEurekaServer注解。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

運行應用:啟動Eureka Server應用,訪問http://localhost:8761,將看到Eureka的控制臺。

2、Eureka客戶端演示:

  • 創建Eureka Client:創建另一個Spring Boot項目,并添加Eureka Client依賴。
  • 配置文件:在application.yml中,配置Eureka Client信息。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

創建Controller:創建一個簡單的Controller用于演示服務調用。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

啟動類:創建啟動類,并添加@EnableDiscoveryClient注解。

微服務設計必看:深度解析Netflix Eureka的底層實現圖片

  • 運行應用:啟動Eureka Client應用,訪問http://localhost:8761,將看到Eureka的控制臺,顯示有一個已注冊的客戶端。
  • 服務調用:在瀏覽器中訪問http://localhost:8080/hello,將會調用Eureka Client的Controller方法,并得到響應。

Netflix Eureka在微服務架構中扮演著重要角色,支持服務發現和注冊。Eureka的底層實現涵蓋了服務注冊、心跳續約、自我保護機制、服務發現和負載均衡等關鍵功能。通過深入代碼層面的分析,我們可以更清晰地理解這些功能是如何在底層實現的。 

作者介紹:

波哥,互聯行業從業10余年,先后擔任項目總監及架構師。目前專攻技術,喜歡研究技術原理。技術全面,主攻JAVA,精通JVM底層機制及Spring全家桶底層框架原理,熟練掌握當前主流的中間件、服務網格等技術原理。

分享到:
標簽:微服
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定