溫馨提示×

溫馨提示×

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

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

SpringCloud組件中Eureka的原理是什么

發(fā)布時(shí)間:2021-06-18 16:37:52 來源:億速云 閱讀:195 作者:Leah 欄目:大數(shù)據(jù)

SpringCloud組件中Eureka的原理是什么,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。


1. Eureka服務(wù)治理原理分析

    1. 關(guān)于服務(wù)注冊:

(1)前面說過,服務(wù)注冊中心會維護(hù)一個(gè)服務(wù)清單表,該清單表中存儲了所有的服務(wù)名以及該服務(wù)名對應(yīng)的所有服務(wù)實(shí)例信息(比如IP地址、端口號等),很快可以想到服務(wù)清單應(yīng)該是一個(gè)Map結(jié)構(gòu)。

(2)然后,服務(wù)提供者會通過Eureka客戶端與服務(wù)中心(即Eureka服務(wù)端)進(jìn)行服務(wù)注冊,這個(gè)過程實(shí)際上就是將自己的服務(wù)名、IP地址、端口號等信息發(fā)送到服務(wù)注冊中心進(jìn)行保存。

    2. 關(guān)于服務(wù)發(fā)現(xiàn)(或者說服務(wù)同步):

(1)服務(wù)注冊中心與服務(wù)提供方:

    服務(wù)提供方注冊到服務(wù)注冊中心后,會與服務(wù)中心始終保持一個(gè)服務(wù)清單同步,即通過Eureka客戶端,獲取到Eureka服務(wù)端中的所有服務(wù)清單數(shù)據(jù),這個(gè)主要通過配置的注冊中心地址來實(shí)現(xiàn)

eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/

所以在單機(jī)服務(wù)注冊中心的情況下,一旦服務(wù)注冊中心掛了,就無法保證服務(wù)發(fā)現(xiàn)的準(zhǔn)確性,但依舊能做的服務(wù)發(fā)現(xiàn)的,因?yàn)榉?wù)清單數(shù)據(jù)會緩存一份到服務(wù)提供方本地,即使服務(wù)注冊中心掛了,依舊能通過這份緩存數(shù)據(jù)來進(jìn)行服務(wù)發(fā)現(xiàn)以及調(diào)用,但是準(zhǔn)確性就不能保證了,有可能某個(gè)服務(wù)已經(jīng)下線或者上線了一個(gè)新的服務(wù)實(shí)例,都是無法感知到的。

    或者說,是Eureka服務(wù)端將服務(wù)清單數(shù)據(jù)同步到各個(gè)Eureka客戶端中,這樣就會保證某個(gè)服務(wù)下線或上線能夠及時(shí)的被其他服務(wù)感知到,就能保證服務(wù)發(fā)現(xiàn),但問題是Eureka的這種服務(wù)清單數(shù)據(jù)同步方式會導(dǎo)致數(shù)據(jù)一致性比較差。

(2)Eureka服務(wù)注冊中心集群:Eureka的集群模式說白了,就是將服務(wù)注冊中心本身也看做一個(gè)服務(wù),集群中的服務(wù)注冊中心節(jié)點(diǎn)之間互相注冊,就能夠同步節(jié)點(diǎn)之間的服務(wù)清單,保證高可用性,即使某個(gè)服務(wù)注冊中心節(jié)點(diǎn)掛了,其余服務(wù)注冊中心節(jié)點(diǎn)也能進(jìn)行服務(wù)治理。

    3. 關(guān)于服務(wù)續(xù)約:

    服務(wù)注冊后,服務(wù)提供方還必須要時(shí)時(shí)向服務(wù)注冊中心進(jìn)行一次“心跳”請求,該請求用來告訴服務(wù)注冊中心自己還“活著”,防止Eureka對該服務(wù)執(zhí)行服務(wù)剔除,將該服務(wù)從服務(wù)列表中排除。這就是服務(wù)續(xù)約操作。

    服務(wù)續(xù)約有兩個(gè)重要配置屬性,可以依據(jù)項(xiàng)目需要進(jìn)行調(diào)整

eureka.instance.lease-expiration-duration-in-seconds=90
eureka.instance.lease-renewal-interval-in-seconds=30

eureka.instance.lease-expiration-duration-in-seconds,該參數(shù)表示設(shè)置判斷服務(wù)失效的時(shí)間,單位為秒,默認(rèn)90秒

eureka.instance.lease-renewal-interval-in-seconds參數(shù)表示設(shè)置服務(wù)續(xù)約任務(wù)的調(diào)用間隔時(shí)間,也就是多久進(jìn)行一次服務(wù)續(xù)約請求,單位為秒,默認(rèn)30秒

這兩個(gè)參數(shù)配置其實(shí)需要注意一下,因?yàn)榧偃缱缘姆?wù)非常多,達(dá)到數(shù)百個(gè),而且每個(gè)服務(wù)都部署了上百個(gè)實(shí)例,那么可以算算每天僅僅是服務(wù)治理所進(jìn)行的日請求次數(shù)就能達(dá)到上千萬次。以一個(gè)例子來進(jìn)行簡單的計(jì)算,

  • 以默認(rèn)參數(shù)來說,100個(gè)服務(wù)部署在20個(gè)服務(wù)器上,那么就相當(dāng)于一共有2000個(gè)服務(wù)實(shí)例。

  • 每個(gè)服務(wù)實(shí)例每分鐘請求2次拉取注冊表,每分鐘請求2次發(fā)送心跳,也就是每分鐘4次請求服務(wù)注冊中心,2000個(gè)服務(wù)實(shí)例服務(wù)注冊中心每分鐘會有8000次請求。每秒大概估算為150次左右

  • 那么一天就會對服務(wù)注冊中心進(jìn)行8000*24*60=1152萬次請求,也就是每天千萬級請求量。

所以這兩個(gè)配置參數(shù)也是需要進(jìn)行適當(dāng)調(diào)整的。至于為什么服務(wù)注冊中心能夠承受千萬級日請求量,后面分析源碼在詳細(xì)介紹。

    4. 服務(wù)下線:在整個(gè)系統(tǒng)運(yùn)行過程中,某個(gè)服務(wù)可能會由于各種各樣的原因?qū)е洛礄C(jī)下線,此時(shí)對于那些服務(wù)調(diào)用者來說,肯定是不能去調(diào)用這些服務(wù)的,所以服務(wù)中心就必須對這些下線的服務(wù)進(jìn)行剔除。

    5. 對于服務(wù)消費(fèi)者:服務(wù)消費(fèi)者實(shí)際上通常也是一個(gè)服務(wù),服務(wù)消費(fèi)者和服務(wù)提供者一樣,需要通過Eureka客戶端來獲取服務(wù)注冊中心的可用服務(wù)清單,然后才能依據(jù)清單進(jìn)行服務(wù)調(diào)用,具體的調(diào)用以及配置在后面結(jié)合Ribbon和Feign進(jìn)行講解。服務(wù)消費(fèi)者主要需要配置兩個(gè)參數(shù)

  • eureka.client.registry-fetch-interval-seconds=30:該參數(shù)表示從服務(wù)注冊中心更新服務(wù)清單的時(shí)間間隔,單位是秒,默認(rèn)為每30秒獲取一次。

  • eureka.client.fetch-registry=true:該參數(shù)表是否獲取服務(wù)清單,該參數(shù)必須為true,也默認(rèn)為true

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI