官术网_书友最值得收藏!

5.4 Eureka核心概念

5.4.1 服務注冊

服務注冊是一個服務生命周期的起點,在服務實例啟動的時候,它會向注冊中心發送一條注冊指令。服務注冊指令包含以下幾個主要內容:

1. 服務名稱

服務名稱通常默認是應用名稱(也就是Spring的配置項中配置的application.name),我們也可以指定一個自定義的服務名,它用來告訴注冊中心當前注冊的服務名稱。

2. 尋址信息

尋址信息是當前服務實例的網絡地址信息,比如hostname、IP地址和端口號,調用方服務在獲取目標服務地址之后才能發起調用。本機測試往往采用IP地址加端口號的配置方式,在線上生產環境中往往采用DNS域名即hostname的方式,這樣可以有效防止內網IP地址漂移,從而導致服務地址失效。

3. 服務狀態

服務狀態包括可用、不可用、初始化、已下線等。

4. 注冊時間

注冊時間是指服務實例向注冊中心發起注冊的時間。

服務注冊所包含的信息量不多,并不會占用太多存儲空間,因此一個注冊中心實例就可以為大量服務節點提供服務治理功能。盡管如此,我們在高可用的架構之下,仍然需要將注冊中心搭建成一個集群,集群內的注冊中心會將本地的服務注冊表同步到其他注冊中心,服務實例只要向一個注冊中心發送注冊指令,這條指令就會被同步給整個注冊中心集群。

5.4.2 服務發現

Eureka屬于一個客戶端負載均衡的服務治理系統,由消費者來決定向哪一個生產者發起調用請求。在這個模式下,消費者服務就要知道所有已注冊的機器的地址信息。為了保證消費者在本地有最新的服務器列表,消費者服務每隔一段時間都要從注冊中心讀取最新的服務地址和狀態,然后刷新本地的服務器列表,這個周而復始的過程就叫作服務發現。

服務在注冊中心的狀態碼如下:

UP:服務處于正常運行階段。

DOWN:服務已下線。

STARTING:服務正在啟動中。

OUT_OF_SERVICE:服務強制下線。

UNKNOWN:未知狀態。

5.4.3 服務續約和服務下線

服務節點可能存在非正常下線的情況,比如由于網絡問題導致無法提供服務,那么注冊中心就要知道當前服務是否處于可用狀態,并將服務狀態寫入本地注冊表中。這樣,服務消費者就可以通過服務發現機制從注冊表中獲取處于可用狀態的服務器列表。

注冊中心獲取服務狀態的方案有兩種,一種是注冊中心定時發起HealthCheck檢查,另一種是由客戶端定時上報自己的狀態到注冊中心。Eureka采取的是第二種方案,每隔一段時間(這個時間間隔是可配置的),服務節點就會向注冊中心發送一個“心跳包”,上報當前節點的最新狀態,我們稱這個過程為“服務續約”。

服務下線是由服務提供者主動發起的下線指令,注冊中心在收到服務下線指令后,會將這臺服務器標記成“Down”的狀態。

5.4.4 服務剔除

正常運行的服務每隔一段時間都會主動發起服務續約,在一些異常情況下(比如服務無響應或者由于網絡原因導致心跳包無法送達注冊中心),如果注冊中心在規定時間內始終沒有收到服務續約的請求,那么它將對服務做自動下線處理。我們將這個過程稱為“服務剔除”,服務剔除是由注冊中心發起的一項定時任務,用來清除不可用的服務實例。

5.4.5 服務自保

在實際的生產環境中,服務剔除有可能會“誤殺”正常服務,比如某個機房產生了短暫的網絡抖動,導致所有服務實例與注冊中心之間的網絡通信短暫不可用,但這些服務實例仍然可以對外部用戶提供服務。在這種極端情況下,如果我們開啟了服務剔除功能,那么就有可能將所有服務剔除下線,造成大范圍宕機。

Eureka內部有一套服務自保機制,它會在運行期持續統計過去15分鐘內服務續約的成功率,如果成功率低于85%(該項數值可以在配置文件中指定),那么將主動開啟服務自保模式,在注冊中心處于自保模式期間,服務剔除功能將不再生效。由此可見,服務剔除和服務自保在同一時刻只能有一個功能生效,我們可以通過配置項關閉服務自保功能。

主站蜘蛛池模板: 团风县| 双鸭山市| 烟台市| 红原县| 奉化市| 河池市| 夏津县| 临西县| 竹溪县| 古浪县| 武清区| 宝山区| 双流县| 内丘县| 红桥区| 本溪| 黑龙江省| 绍兴市| 衡阳县| 金沙县| 阆中市| 水城县| 安龙县| 龙海市| 桐庐县| 清远市| 海丰县| 冷水江市| 福泉市| 乐山市| 清水县| 宣恩县| 河津市| 青河县| 田东县| 浙江省| 城市| 自贡市| 金坛市| 岳池县| 阳新县|