您好,登錄后才能下訂單哦!
這篇文章主要講解了“Eureka掛了微服務(wù)還能調(diào)通嗎”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Eureka掛了微服務(wù)還能調(diào)通嗎”吧!
1.實踐一下
這種問題,聽別人講 N 遍,不如自己手動實踐一遍記得清楚。
大家可以快速搭建一個 Eureka 服務(wù)注冊中心,然后搭建一個服務(wù)消費者和服務(wù)提供者,將兩個服務(wù)注冊到 Eureka 上去,最后在服務(wù)消費者上面簡單的調(diào)用一下服務(wù)提供者。這個過程很簡單,相信大家稍微學(xué)過 Spring Cloud 的小伙伴都能搞定,如果搞不定,可以參考松哥的視頻(Spring Boot + Vue + Spring Cloud 系列視頻教程))。
服務(wù)調(diào)通之后,接下來關(guān)閉 Eureka,注意不要關(guān)閉服務(wù)提供者和服務(wù)消費者,關(guān)閉之后,繼續(xù)用服務(wù)消費者調(diào)用服務(wù)提供者,「這個時候你會驚奇的發(fā)現(xiàn),服務(wù)竟然還能調(diào)通!」
2.原因分析
為什么 Eureka 關(guān)閉后服務(wù)還能調(diào)用呢?我們先來看一張簡單的服務(wù)調(diào)用圖:
我來說一下這個流程:
Eureka 作為一個服務(wù)注冊中心啟動。
Provider 和 Consumer 分別作為服務(wù)啟動,并且注冊到 Eureka 上面去,以 provider 為例,provider 注冊時會告訴 eureka,我叫 provider,我的地址是 xx.xx.xx.xx,我的端口是 xx,我的 xx 是 xx,就是說,provider 會將自己的一些元數(shù)據(jù)信息告訴 eureka;同理,consumer 也是如此。
接下來,consumer 要調(diào)用 provider 的接口,但是它不知道 provider 的地址是什么,他只知道要調(diào)用的服務(wù)叫 provider,于是 consumer 找到 eureka,從 eureka 上查詢出來 provider 的具體地址和端口,這個具體的地址和端口,可能是一個,也可能是多個(集群化部署)。
consumer 獲取到 provider 的地址和端口之后,接下來就直接去調(diào)用 provider 了。
從上面一個流程圖中,大家可以看出來,一旦 consumer 獲取到 provider 的具體地址,接下來的調(diào)用其實就沒有 eureka 什么事了。
所以,我們說一旦 Eureka 掛了,微服務(wù)是可以調(diào)通的,「但是是有前提的」。
什么前提?就是 provider 的地址沒變!如果 provider 換了一個 IP 地址或者端口,這個時候,consumer 就無法及時感知到這種變化,就會調(diào)不通。當(dāng) Eureka 沒有掛掉的時候,provider 的 IP 變化這種事情,可以通過 Eureka 讓 consumer 感知到,進而對調(diào)用地址作出調(diào)整,現(xiàn)在 Eureka 掛了,consumer 就無法感知了。
文章既然都寫到這兒了,我們就來順便說下 Spring Cloud 在這里涉及到的一些原理。
3.相關(guān)原理
Eureka 本身可以分為兩大部分,Eureka Server 和 Eureka Client。
我們先來看 Eureka Server:
3.1 Eureka Server
Eureka Server 主要對外提供了三個功能:
服務(wù)注冊,所有的服務(wù)都注冊到 Eureka Server 上面來,這是 Eureka 基本功能。
提供注冊表,注冊表就是所有注冊上來服務(wù)的一個列表,Eureka 內(nèi)部通過一個二層緩存機制來維護這個注冊表。Eureka Client 在調(diào)用服務(wù)時,需要獲取這個注冊表,一般來說,這個注冊表會緩存下來,如果緩存失效,則直接獲取最新的注冊表。
同步狀態(tài),Eureka Client 通過注冊、心跳等機制,和 Eureka Server 同步當(dāng)前客戶端的狀態(tài),以便 Eureka Client 能夠及時感知到變化。
3.2 Eureka Client
服務(wù)要注冊到 Eureka 上面去,這種注冊本身就是一個 HTTP 請求,但是自己手寫注冊過程的話太過于繁瑣,Eureka Client 可以幫助我們簡化注冊過程。
一般來說,Eureka Client 有這樣一些功能:
服務(wù)注冊
服務(wù)提供者將自己注冊到服務(wù)注冊中心(Eureka Server),需要注意,所謂的服務(wù)提供者,只是一個業(yè)務(wù)上的劃分,本質(zhì)上他就是一個 Eureka Client。當(dāng) Eureka Client 向 Eureka Server 注冊時,他需要提供自身的一些元數(shù)據(jù)信息,例如 IP 地址、端口、名稱、運行狀態(tài)等等,將來服務(wù)消費者獲取到的也是這些信息。
獲取注冊信息
Eureka Client 從 Eureka Server 上獲取服務(wù)的注冊信息,「并將其緩存在本地」,這句是關(guān)鍵。
當(dāng) Eureka Client 在需要調(diào)用遠(yuǎn)程服務(wù)時,會從該信息中查找遠(yuǎn)程服務(wù)所對應(yīng)的 IP 地址、端口等信息。Eureka Client 上緩存的服務(wù)注冊信息會定期更新(30 秒),如果 Eureka Server 返回的注冊表信息與本地緩存的注冊表信息不同的話,Eureka Client 會自動處理。
這里,也涉及到兩個屬性:
一個是是否允許獲取注冊表信息:eureka.client.fetch-registry=true。
另一個是 Eureka Client 上緩存的服務(wù)注冊信息,定期更新的時間間隔,默認(rèn) 30 秒,可以通過如下屬性自行修改:eureka.client.registry-fetch-interval-seconds=30。
服務(wù)續(xù)約
Eureka Client 注冊到 Eureka Server 上之后,默認(rèn)情況下,Eureka CLient 每隔 30 秒就要向 Eureka Server 發(fā)送一條心跳消息,來告訴 Eureka Server 我還在運行。
如果 Eureka Server 連續(xù) 90 秒都有沒有收到 Eureka Client 的續(xù)約消息(連續(xù)三次沒發(fā)送),它會認(rèn)為 Eureka Client 已經(jīng)掉線了,會將掉線的 Eureka Client 從當(dāng)前的服務(wù)注冊列表中剔除。
這里有兩個相關(guān)的屬性(一般不建議修改):
eureka.instance.lease-renewal-interval-in-seconds 表示服務(wù)的續(xù)約時間,默認(rèn)是 30 秒。
eureka.instance.lease-expiration-duration-in-seconds 表示服務(wù)失效時間,默認(rèn)是 90 秒。
服務(wù)下線
服務(wù)下線當(dāng) Eureka Client 下線時,它會主動發(fā)送一條消息,告訴 Eureka Server ,我下線啦。
感謝各位的閱讀,以上就是“Eureka掛了微服務(wù)還能調(diào)通嗎”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Eureka掛了微服務(wù)還能調(diào)通嗎這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。