溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud的底層架構(gòu)原理

發(fā)布時間:2021-08-31 15:36:29 來源:億速云 閱讀:274 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Spring Cloud的底層架構(gòu)原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring Cloud的底層架構(gòu)原理”吧!

Eureka

首先,我們得說說服務注冊中心 Eureka 了,它應該是SpringCloud 技術(shù)棧中最核心的東西。

服務注冊與發(fā)現(xiàn)怎么實現(xiàn)的

服務注冊與發(fā)現(xiàn)是 Eureka 中最核心的東西。

比如現(xiàn)在我們有一個服務消費者 服務A,和兩個節(jié)點的服務提供者,服務B。服務A 和服務B 在啟動的時候都會向注冊中心進行服務注冊。

服務A 也會定時從服務注冊中心定時去拉取服務注冊表信息到本地來,這個過程叫服務發(fā)現(xiàn),默認是30S 一次,當然了可以自己去配置。

如下圖:

Spring Cloud的底層架構(gòu)原理

實際上當服務在拉取服務注冊表的時候,其實客戶端不是直接從 Eureka 中的 服務注冊表中獲取數(shù)據(jù)的。

Eureka 做了二級緩存,第一級叫做 ReadOnly 緩存,二級叫做 ReadWrite 緩存。

客戶端會直接從ReadOnly 緩存中讀取注冊表信息。

當服務在進行注冊的時候,先往服務注冊表中寫入注冊信息,服務注冊表更新了,立馬會同步一份數(shù)據(jù)到 ReadWrite 緩存中去。

那什么時候 ReadWrite 緩存中的數(shù)據(jù)會到 ReadOnly 緩存中去?

此時有一個定時任務會定時去檢查 ReadWrite 是否跟  ReadOnly 不一致,不一致就把數(shù)據(jù)同步到 ReadOnly 中去。

這個定時任務也默認是 30S。也可以自己配置。

Spring Cloud的底層架構(gòu)原理

大家可以考慮一下,這么做的好處是什么,為什么要這么去做二級緩存?

這么做的好處在于,優(yōu)化并發(fā)讀寫的沖突。

如果服務進行注冊的時候,同時有服務來讀去注冊表信息,就會存在頻繁的讀寫加鎖的操作,寫的時候就不能讀,導致性能下降,所以我們需要避免大量的讀寫都去操作一個表。

那么有了這兩層,其實大部分的讀操作都會走 ReadOnly 緩存。只需要定時把 ReadWrite 緩存中的數(shù)據(jù)寫入到 ReadOnly 就好了。

 
心跳與故障檢測

服務注冊中心還有一個很重要的功能就是 心跳與故障檢查。心跳跟故障檢測其實就是為了知道注冊上來的這些服務是不是還活著的。

Eureka 還會開啟一個定時任務定時去檢查心跳,默認也是30秒,也可以自己設置。

當出現(xiàn)機器故障沒有在約定的時間間隔內(nèi)上報自己的狀態(tài),那么Eureka 就會把這臺機器剔除注冊表,同時更新到 ReadWrite 緩存中去。如圖:

Spring Cloud的底層架構(gòu)原理

但是把數(shù)據(jù)從ReadWrite 緩存同步到 ReadOnly 緩存是有時間間隔的。當服務消費者A 也只有等待下一次請求更新的時候才會把自己列表里面的服務給更新掉。

所以有時候會出現(xiàn)你注冊上去的服務經(jīng)過及時秒才被服務消費者發(fā)現(xiàn),或者服務的某個節(jié)點出現(xiàn)故障,沒有及時剔除掉。這里就是同步機制的時間差問題。

以上就是 Eureka 的核心運行原理了。

 

Feign & Ribbon

Feign,它其實就是對一個接口打了一個注解,它會針對這個注解標注的接口生成動態(tài)代理對象,然后針對你的 feign 的動態(tài)代理代理對象去調(diào)用他方法的時候,此時會在底層生成,http 協(xié)議格式的請求如:/order/create?productId=1

Feign底層的使用的HTTP 通信框架 HttpClient ,先會使用 Ribbon 從本地的 Eureka 注冊表的緩存里面取出要調(diào)用服務的機器列表出來,然后根據(jù)負載均衡算法,選擇一臺機器出來,然后針對選擇出來的機器發(fā)送 Http 請求過去。

 

Zuul

Zuul 配置請求路徑與服務的對應關(guān)系,你的請求到網(wǎng)關(guān),他就直接查找到匹配的服務,然后就直接把請求轉(zhuǎn)發(fā)給那個服務的某臺機器, Ribbon 從 Eureka 本地緩存列表里面獲取一臺機器,然后通過負載均衡算法選擇一臺,把請求直接用 http 通信框架發(fā)送到指定的機器上面去。

 

Hystrix

在微服務的架構(gòu)中,會存在很多的服務調(diào)用,如果一個服務出現(xiàn)故障,就很容易導致整個調(diào)用鏈發(fā)生故障,發(fā)生服務雪崩的情況。

例如,當一個服務出現(xiàn)故障,或者超時的問題,但是服務調(diào)用方不知道,一直在發(fā)送請求過去,那么等待的請求越來越多,形成任務積壓,最終導致服務崩潰,癱瘓。

Hystrix 的出現(xiàn)就是為了解決這種問題。它提供了服務降級、服務熔斷、線程和信號隔離、請求緩存、請求合并以及服務監(jiān)控等強大功能。

Hystrix使用艙壁模式實現(xiàn)線程池的隔離,它會為每一個依賴服務創(chuàng)建一個獨立的線程池,這樣就算某個依賴服務出現(xiàn)延遲過高的情況,也只是對該依賴服務的調(diào)用產(chǎn)生影響,而不會拖慢其他的依賴服務。


到此,相信大家對“Spring Cloud的底層架構(gòu)原理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI