Spring?Cloud?Eureka(全面解析)?大白話
Eureka大白話解析
筆記補(bǔ)錄:
1.Eureka 介紹
Spring Cloud Eureka 是 Spring Cloud Netflix 微服務(wù)套件的一部分,基于 Netflix Eureka 做了二次封裝,主要負(fù)責(zé)實(shí)現(xiàn)微服務(wù)架構(gòu)中的服務(wù)治理功能。
服務(wù)治理是微服務(wù)架構(gòu)中必不可少的一部分,阿里開(kāi)源的 Dubbo 框架就是針對(duì)服務(wù)治理的。服務(wù)治理必須要有一個(gè)注冊(cè)中心,除了用 Eureka 作為注冊(cè)中心外,我們還可以使用 Consul、Etcd、Zookeeper 等來(lái)作為服務(wù)的注冊(cè)中心。
Eureka 由兩部分組成:服務(wù)端和客戶端,服務(wù)端就是注冊(cè)中心,用來(lái)接收其它的服務(wù)注冊(cè),客戶端是一個(gè)java客戶端,用來(lái)注冊(cè),并可以實(shí)現(xiàn)負(fù)載均衡等功能。 Eureka 的搭建和集群請(qǐng)點(diǎn)擊查看這篇文章。
Eureka圖解如下:
從圖中可以看出Eureka有三個(gè)角色:
Eureka Server
:注冊(cè)中心Eureka Provider
:服務(wù)提供者Eureka Consumer
:服務(wù)消費(fèi)者
注冊(cè)中心就是管理所有服務(wù)的信息和狀態(tài),12306 就好比一個(gè)注冊(cè)中心,顧客就好比調(diào)用的客戶端,當(dāng)他們需要坐火車時(shí),就會(huì)在 12306 網(wǎng)站上查詢余票,有票就可以購(gòu)買(mǎi),然后獲取火車的車次、時(shí)間等,最后出發(fā)。程序也是一樣,當(dāng)你需要調(diào)用某一個(gè)服務(wù)的時(shí)候,你會(huì)先去 Eureka 中去拉取服務(wù)列表,查看你調(diào)用的服務(wù)在不在其中,在的話就拿到服務(wù)地址、端口等信息,然后調(diào)用。
注冊(cè)中心帶來(lái)的好處就是,不需要知道有多少提供方,你只需要關(guān)注注冊(cè)中心即可,就像顧客不必關(guān)心有多少火車在開(kāi)行,只需要去 12306 網(wǎng)站上看有沒(méi)有票就可以了。
為什么 Eureka 比 Zookeeper 更適合作為注冊(cè)中心呢?主要是因?yàn)?Eureka 是基于 AP 原則構(gòu)建的,而 ZooKeeper 是基于 CP 原則構(gòu)建的。在分布式系統(tǒng)領(lǐng)域有個(gè)著名的 CAP 定理,即 C 為數(shù)據(jù)一致性;A 為服務(wù)可用性;P 為服務(wù)對(duì)網(wǎng)絡(luò)分區(qū)故障的容錯(cuò)性。這三個(gè)特性在任何分布式系統(tǒng)中都不能同時(shí)滿足,最多同時(shí)滿足兩個(gè)。Zookeeper 有一個(gè) Leader,而且在這個(gè) Leader 無(wú)法使用的時(shí)候通過(guò) Paxos(ZAB)算法選舉出一個(gè)新的 Leader。這個(gè) Leader 的任務(wù)就是保證寫(xiě)數(shù)據(jù)的時(shí)候只向這個(gè) Leader 寫(xiě)入,Leader 會(huì)同步信息到其他節(jié)點(diǎn)。通過(guò)這個(gè)操作就可以保證數(shù)據(jù)的一致性。
想要保證 AP 就要用 Eureka,想要保證 CP 就要用 Zookeeper。
Dubbo 中大部分都是基于 Zookeeper 作為注冊(cè)中心的。Spring Cloud 中當(dāng)然首選 Eureka。
2. Eureka 的工作細(xì)節(jié)
2.1 Eureka Server
Eureka Server主要對(duì)外提供了三個(gè)功能:
- 服務(wù)注冊(cè),所有的服務(wù)都注冊(cè)到Eureka Server上面來(lái)
- 提供注冊(cè)表,注冊(cè)表就是所有注冊(cè)上來(lái)服務(wù)的一個(gè)列表,Eureka Client在調(diào)用服務(wù)時(shí),需要獲取這個(gè)注冊(cè)表,一般來(lái)說(shuō),這個(gè)注冊(cè)表會(huì)緩存下來(lái),如果緩存失效,則直接獲取最新的注冊(cè)表
- 同步狀態(tài),Eureka Client 通過(guò)注冊(cè)、心跳等機(jī)制,和Eureka Server同步當(dāng)前客戶端的狀態(tài)
2.2 Eureka Client
Eureka Client 主要是來(lái)簡(jiǎn)化每一個(gè)服務(wù)和Eureka Server 之間的交互。Eureka Client 會(huì)自動(dòng)拉取、更新以及緩存Eureka Server 中的信息,這樣,即便Eureka Server 所有節(jié)點(diǎn)都宕機(jī),Eureka Client 依然能夠獲取到想要調(diào)服務(wù)的地址(但是地址可能不準(zhǔn)確)。
2.2.1 服務(wù)注冊(cè)
服務(wù)提供者將自己注冊(cè)到服務(wù)注冊(cè)中心(Eureka Server),需要注意,所渭的服務(wù)提供者,只是一個(gè)業(yè)務(wù)上的劃分,本質(zhì)上他就是一個(gè) Eureka Client 。當(dāng) Eureka Client 向 Eureka Server 注冊(cè)時(shí),他需要提供自身的一些元數(shù)據(jù)信息,例如IP地址、端囗、名稱、運(yùn)行狀態(tài)等等。
2.2.2 服務(wù)續(xù)約
Eureka Client 注冊(cè)到 Eureka Server 上之后,事情還沒(méi)有結(jié)束,剛剛開(kāi)始而已。注冊(cè)成功后,默認(rèn)情況下,Eureka Client 每隔30秒就要向 Eureka Server 發(fā)送一條心跳消息,來(lái)告訴Eureka Server 我還在運(yùn)行。如果 Eureka Server 連續(xù)90秒有沿有收到Eureka Client 的續(xù)約消息(連續(xù)三次沒(méi)發(fā)送),它會(huì)認(rèn)為Eureka Client已經(jīng)線了,會(huì)將掉線的Eureka Client從當(dāng)前的服務(wù)注冊(cè)列表中剔除。
服務(wù)續(xù)約,有兩個(gè)相關(guān)的屬性(一般不建議修改):
# 表示服務(wù)的續(xù)約時(shí)間,默認(rèn)是30秒 eureka.instance.lease-renewal-intetval-in-seconds=30 # 服務(wù)失效時(shí)間,默認(rèn)是90秒 eureka.instance.lease-expiration-duration-in-seconds=90
2.2.3 服務(wù)下線
當(dāng) Eureka Client 下線時(shí),它會(huì)主動(dòng)發(fā)送一條消息,告訴Eureka Server,我下線了。
2.2.4 獲取注冊(cè)表信息
Eureka Client 從Eureka Server 上獲取服務(wù)的注冊(cè)信息,將其緩存在本地。本地客戶端在需要調(diào)用遠(yuǎn)程服務(wù)時(shí),會(huì)從該信息中查找遠(yuǎn)程服務(wù)所對(duì)應(yīng)的IP地址、端囗等信息。Eureka Client 上緩存的服務(wù)注冊(cè)信息會(huì)定期更新(30秒),如果 Eureka Server 返回的注冊(cè)表信息與本地緩存的注冊(cè)表信息不同的話,Eureka Client 會(huì)自動(dòng)處理。
這里,也涉及至兩個(gè)屬性,一個(gè)是是否允許獲取注冊(cè)表信息:
eureka.client.fetch-registry=true
Eureka Client 上緩存的服務(wù)注冊(cè)信息,定期更新的時(shí)間間隔,默認(rèn)30秒:
eureka.client.registry-fetch-interval-seconds=30
Eureka分區(qū)策略
第一步:背景和概念介紹
背景:用戶量比較大或者用戶地理位置分布范圍很廣的項(xiàng)目,一般都會(huì)有多個(gè)機(jī)房。這個(gè)時(shí)候如果上線springCloud服務(wù)的話,我們希望一個(gè)機(jī)房?jī)?nèi)的服務(wù)優(yōu)先調(diào)用同一個(gè)機(jī)房?jī)?nèi)的服務(wù),當(dāng)同一個(gè)機(jī)房的服務(wù)不可用的時(shí)候,再去調(diào)用其它機(jī)房的服務(wù),以達(dá)到減少延時(shí)的作用。
概念:region:能夠簡(jiǎn)單理解為地理上的分區(qū)。好比亞洲地區(qū),或者華北地區(qū),再或者北京地區(qū)等等,沒(méi)有具體大小的限制,根據(jù)項(xiàng)目具體的狀況,能夠自行劃分region。 zone:能夠簡(jiǎn)單理解為 region 內(nèi)的具體機(jī)房,好比說(shuō) region 劃分為華北地區(qū),而后華北地區(qū)有兩個(gè)機(jī)房,就能夠在此 region 之下劃分出 zone1、zone2 兩個(gè) zone eureka 也借用了 region 和 zone 的概念架構(gòu)
如圖所示,有一個(gè) region:華北地區(qū),下面有兩個(gè)機(jī)房,機(jī)房A 和機(jī)房Burl
- 每一個(gè)機(jī)房?jī)?nèi)有一個(gè) Eureka Server 集群 和兩個(gè)服務(wù)提供者 ServiceA 和 ServerB
- 如今假設(shè) serverA 須要調(diào)用 ServerB 服務(wù),按照就近原則,serverA 會(huì)優(yōu)先調(diào)用同一個(gè) zone 內(nèi)的 ServiceB,當(dāng) ServiceB 不可用時(shí),才會(huì)去調(diào)用另外一個(gè) zone 內(nèi)的 ServiceBcode
第二步:相關(guān)參數(shù)介紹
服務(wù)注冊(cè)相關(guān):
eureka: client: # 盡可能向同一區(qū)域的 eureka 注冊(cè),默認(rèn)為true prefer-same-zone-eureka: true #地區(qū) region: huabei availability-zones: huabei: zone-1,zone-2 service-url: zone-1: http://Eureka的Ip地址:8761/eureka/ zone-2: http://Eureka的Ip地址:8761/eureka/
當(dāng)存在多個(gè)注冊(cè)中心時(shí),選擇邏輯為cdn
- 若是 prefer-same-zone-eureka 為 false,按照 service-url 下的 list 取第一個(gè)注冊(cè)中心來(lái)注冊(cè),并和其維持心跳檢測(cè),再也不向list內(nèi)的其它的注冊(cè)中心注冊(cè)和維持心跳。server只有在第一個(gè)注冊(cè)失敗的狀況下,才會(huì)依次向其它的注冊(cè)中心注冊(cè),總共重試3次,若是3個(gè)service-url都沒(méi)有注冊(cè)成功,則注冊(cè)失敗。blog
注冊(cè)失敗后每隔一個(gè)心跳時(shí)間,會(huì)再次嘗試。it
- 若是 prefer-same-zone-eureka 為true,先經(jīng)過(guò) region 取 availability-zones 內(nèi)的第一個(gè)zone,而后經(jīng)過(guò)這個(gè)zone取 service-url 下的list,并向list內(nèi)的第一個(gè)注冊(cè)中心進(jìn)行注冊(cè)和維持心跳,再也不向list內(nèi)的其它的注冊(cè)中心注冊(cè)和維持心跳。只有在第一個(gè)注冊(cè)失敗的狀況下,才會(huì)依次向其它的注冊(cè)中心注冊(cè),總共重試3次,若是3個(gè)service-url都沒(méi)有注冊(cè)成功,則注冊(cè)失敗。注冊(cè)失敗后每隔一個(gè)心跳時(shí)間,會(huì)再次嘗試。
為了保證服務(wù)注冊(cè)到同一個(gè) zone 的注冊(cè)中心,必定要注意 availability-zones 的順序,必須把同一 zone 寫(xiě)在最前面
eureka: instance: # 服務(wù)和注冊(cè)中心的心跳間隔時(shí)間,默認(rèn)為30s lease-renewal-interval-in-seconds: 30 # 服務(wù)和注冊(cè)中心的心跳超時(shí)時(shí)間,默認(rèn)為90s lease-expiration-duration-in-seconds: 90 metadata-map: # 當(dāng)前服務(wù)所屬的 zone zone: zone1
- 服務(wù)消費(fèi)者和服務(wù)提供者分別屬于哪一個(gè)zone,均是經(jīng)過(guò) eureka.instance.metadata-map.zone 來(lái)斷定的。
- 服務(wù)消費(fèi)者會(huì)先經(jīng)過(guò) ribbon 去注冊(cè)中心拉取一份服務(wù)提供者的列表,而后經(jīng)過(guò) eureka.instance.metadata-map.zone 指定的 zone 進(jìn)行過(guò)濾,過(guò)濾以后若是同一個(gè) zone 內(nèi)的服務(wù)提供者有多個(gè)實(shí)例,則會(huì)輪流調(diào)用。
- 只有在同一個(gè) zone 內(nèi)的全部服務(wù)提供者都不可用時(shí),才會(huì)調(diào)用其它zone內(nèi)的服務(wù)提供者。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Ajax實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了jQuery ajax實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能幫助到你2021-07-07jmeter接口測(cè)試教程及接口測(cè)試流程詳解(全網(wǎng)僅有)
Jmeter是由Apache公司開(kāi)發(fā)的一個(gè)純Java的開(kāi)源項(xiàng)目,即可以用于做接口測(cè)試也可以用于做性能測(cè)試。本文給大家分享jmeter接口測(cè)試教程及接口測(cè)試流程,感興趣的朋友跟隨小編一起看看吧2021-12-12Java?Web實(shí)現(xiàn)簡(jiǎn)易圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?Web實(shí)現(xiàn)簡(jiǎn)易圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Java網(wǎng)絡(luò)編程基礎(chǔ)用法詳解
網(wǎng)絡(luò)編程是指編寫(xiě)運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過(guò)網(wǎng)絡(luò)連接起來(lái),本文將帶大家詳細(xì)了解Java的網(wǎng)絡(luò)編程,文中有相關(guān)的代碼示例,需要的朋友可以參考下2023-05-05lambda表達(dá)式與傳統(tǒng)接口函數(shù)實(shí)現(xiàn)方式對(duì)比詳解
這篇文章主要為大家介紹了lambda表達(dá)式與傳統(tǒng)接口函數(shù)實(shí)現(xiàn)方式對(duì)比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家度偶多進(jìn)步早日升職加薪2022-03-03