Eureka 都掛了,微服務還能調通嗎?

2021-10-10 04:12:37 字數 3043 閱讀 8194

如果你做過微服務開發,這個面試題應該能夠立馬答出來,如果你沒做過微服務開發,但是學過一些 spring cloud 元件的用法,這個問題可能要稍微想一下,但是也應該能夠答出來。

今天就來和大家說說這個問題。

這種問題,聽別人講 n 遍,不如自己手動實踐一遍記得清楚。

服務調通之後,接下來關閉 eureka,注意不要關閉服務提供者和服務消費者,關閉之後,繼續用服務消費者呼叫服務提供者,這個時候你會驚奇的發現,服務竟然還能調通!

為什麼 eureka 關閉後服務還能呼叫呢?我們先來看一張簡單的服務呼叫圖:

我來說一下這個流程:

eureka 作為乙個服務註冊中心啟動。

provider 和 consumer 分別作為服務啟動,並且註冊到 eureka 上面去,以 provider 為例,provider 註冊時會告訴 eureka,我叫 provider,我的位址是 xx.xx.xx.xx,我的埠是 xx,我的 xx 是 xx,就是說,provider 會將自己的一些元資料資訊告訴 eureka;同理,consumer 也是如此。

接下來,consumer 要呼叫 provider 的介面,但是它不知道 provider 的位址是什麼,他只知道要呼叫的服務叫 provider,於是 consumer 找到 eureka,從 eureka 上查詢出來 provider 的具體位址和埠,這個具體的位址和埠,可能是乙個,也可能是多個(集群化部署)。

consumer 獲取到 provider 的位址和埠之後,接下來就直接去呼叫 provider 了。

所以,我們說一旦 eureka 掛了,微服務是可以調通的,但是是有前提的

什麼前提?就是 provider 的位址沒變!如果 provider 換了乙個 ip 位址或者埠,這個時候,consumer 就無法及時感知到這種變化,就會調不通。當 eureka 沒有掛掉的時候,provider 的 ip 變化這種事情,可以通過 eureka 讓 consumer 感知到,進而對呼叫位址作出調整,現在 eureka 掛了,consumer 就無法感知了。

文章既然都寫到這兒了,我們就來順便說下 spring cloud 在這裡涉及到的一些原理。

eureka 本身可以分為兩大部分,eureka server 和 eureka client。

我們先來看 eureka server:

eureka server 主要對外提供了三個功能:

服務註冊,所有的服務都註冊到 eureka server 上面來,這是 eureka 基本功能。

提供登錄檔,登錄檔就是所有註冊上來服務的乙個列表,eureka 內部通過乙個二層快取機制來維護這個登錄檔。eureka client 在呼叫服務時,需要獲取這個登錄檔,一般來說,這個登錄檔會快取下來,如果快取失效,則直接獲取最新的登錄檔。

同步狀態,eureka client 通過註冊、心跳等機制,和 eureka server 同步當前客戶端的狀態,以便 eureka client 能夠及時感知到變化。

服務要註冊到 eureka 上面去,這種註冊本身就是乙個 http 請求,但是自己手寫註冊過程的話太過於繁瑣,eureka client 可以幫助我們簡化註冊過程。

一般來說,eureka client 有這樣一些功能:

服務註冊

服務提供者將自己註冊到服務註冊中心(eureka server),需要注意,所謂的服務提供者,只是乙個業務上的劃分,本質上他就是乙個 eureka client。當 eureka client 向 eureka server 註冊時,他需要提供自身的一些元資料資訊,例如 ip 位址、埠、名稱、執行狀態等等,將來服務消費者獲取到的也是這些資訊。

獲取註冊資訊

eureka client 從 eureka server 上獲取服務的註冊資訊,並將其快取在本地,這句是關鍵。

當 eureka client 在需要呼叫遠端服務時,會從該資訊中查詢遠端服務所對應的 ip 位址、埠等資訊。eureka client 上快取的服務註冊資訊會定期更新(30 秒),如果 eureka server 返回的登錄檔資訊與本地快取的登錄檔資訊不同的話,eureka client 會自動處理。

這裡,也涉及到兩個屬性:

乙個是是否允許獲取登錄檔資訊:eureka.client.fetch-registry=true

另乙個是 eureka client 上快取的服務註冊資訊,定期更新的時間間隔,預設 30 秒,可以通過如下屬性自行修改:eureka.client.registry-fetch-interval-seconds=30

服務續約

eureka client 註冊到 eureka server 上之後,預設情況下,eureka client 每隔 30 秒就要向 eureka server 傳送一條心跳訊息,來告訴 eureka server 我還在執行。

如果 eureka server 連續 90 秒都有沒有收到 eureka client 的續約訊息(連續三次沒傳送),它會認為 eureka client 已經掉線了,會將掉線的 eureka client 從當前的服務註冊列表中剔除。

eureka.instance.lease-renewal-interval-in-seconds表示服務的續約時間,預設是 30 秒。

eureka.instance.lease-expiration-duration-in-seconds表示服務失效時間,預設是 90 秒。

服務下線

服務下線當 eureka client 下線時,它會主動傳送一條訊息,告訴 eureka server ,我下線啦。

從上面的介紹可以看出,eureka client 會自動拉取、更新以及快取 eureka server 中的資訊,這樣,即使 eureka server 所有節點都宕機,eureka client 依然能夠獲取到想要呼叫服務的位址(前提是服務位址沒有發生變化)。

好了,本文就先說這麼多,其實東西不難,感興趣的小夥伴感覺去試試吧~

微服務 Eureka 的介紹

部落格引用處 以下內容在原有部落格基礎上進行補充或更改,謝謝這些大牛的部落格指導 基於eureka的服務治理 服務發現和註冊和eureka 服務的註冊與發現 關係呼叫說明 eureka簡介 eureka是spring cloud netflix微服務套件中的一部分,可以與springboot構建的微...

微服務 Eureka實戰配置

學習思路 專案實踐 服務註冊 續租 下線 自我保護,ratelimiter實現分析 實際使用中的坑 eureka專案簡單點說就是乙個配置 首先引入jar包 org.springframework.cloud spring cloud starter netflix eureka server 如果需...

微服務 Eureka註冊中心

我們來解決微服務的第一問題,服務的管理。服務中心對外提供服務,需要對外暴露自己的位址。而consumer 呼叫者 需要記錄服務提供者的位址。將來位址出現變更,還需要及時更新。這在服務較少的時候並不覺得有什麼,但是在現在日益複雜的網際網路環境,乙個專案肯定會拆分出十幾,甚至數十個微服務。此時如果還人為...