微服務(wù)框架核心源碼深度解析筆記注冊(cè)中心_第1頁(yè)
微服務(wù)框架核心源碼深度解析筆記注冊(cè)中心_第2頁(yè)
微服務(wù)框架核心源碼深度解析筆記注冊(cè)中心_第3頁(yè)
微服務(wù)框架核心源碼深度解析筆記注冊(cè)中心_第4頁(yè)
微服務(wù)框架核心源碼深度解析筆記注冊(cè)中心_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

5比較一致性算-無(wú)有無(wú)有支支支支支不支支支不支不支支支三、Eureka源碼解析預(yù)備Eureka的異地多異地多活一般是指在不同城市建立獨(dú)立活是相對(duì)于主備關(guān)系中的熱備而言的。熱備是指?jìng)浞輽C(jī)房隨時(shí)全量備份著主機(jī)的數(shù)據(jù),但平時(shí)不支撐業(yè)務(wù)需求,即不對(duì)外提供服務(wù)。只有在主機(jī)房出現(xiàn)故障時(shí)才會(huì)切換到備份機(jī)房,由備份機(jī)房對(duì)外提供服務(wù)。也就是說(shuō),平時(shí)只有主機(jī)房是活的。多活則是指這些機(jī)房間屬于主從關(guān)系,即這些機(jī)房平時(shí)都支撐業(yè)務(wù)需求,都對(duì)外提供服務(wù),相互備Region與Eureka中具有Region與AvailabilityZone(簡(jiǎn)稱AZ)概念,都是云計(jì)算中為了方便不同地理區(qū)域中用戶的使用,大型云服務(wù)提供商一般會(huì)根據(jù)用戶需求量在不同的城市、省份、國(guó)家或洲創(chuàng)建不同的大型云計(jì)算機(jī)房。這些不同區(qū)域機(jī)房間一般是不能“內(nèi)網(wǎng)連通”的。這些區(qū)域就稱為一個(gè)eion。這里存在一個(gè)問(wèn)題:同一eion機(jī)房是如何實(shí)現(xiàn)同域容災(zāi)的?為了增強(qiáng)容災(zāi)能力,在一個(gè)eion中又設(shè)置了不同的vailailiyZone。這些Z間實(shí)現(xiàn)了內(nèi)網(wǎng)連通,且用戶可以根據(jù)自己所在的具置自動(dòng)選擇同域中的不同Z。當(dāng)用戶所要的Z出現(xiàn)問(wèn)題后,系統(tǒng)會(huì)自動(dòng)切換到其它可用的Z。例如,WS將全球劃分為了很多的ion,例如東部區(qū)、西部區(qū)、歐洲區(qū)、非洲敦區(qū)、亞太區(qū)等。像ra系統(tǒng)架構(gòu)圖中的sas-c、sa-d、s-a1e就是seas1這個(gè)eion中的c、、三個(gè)AZ。Eureka中的Region與Zone配需bj-1與bj-2,每個(gè)AZ中有三臺(tái)EurekaServerh1與h2兩臺(tái)主機(jī)提供的都是相同的Srvi服務(wù),根據(jù)地理位置的不同,這兩臺(tái)主機(jī)分別到了距離自己最近的不同Z的raSrr。ServerAZbj-1ServerAZbj-2ZuulAZbj-1ZuulAZbj-2ServiceAZbj-1ServiceAZbj-2當(dāng)一個(gè)rio有多個(gè)zon時(shí),微服務(wù)調(diào)用應(yīng)用時(shí)優(yōu)先調(diào)用同one內(nèi)的應(yīng)用。原因是ra 置re-sameoneerea,默認(rèn)為ru。當(dāng)同zon中的應(yīng)用均不可用時(shí),才會(huì)調(diào)用其它one中的服務(wù)。指定Region配對(duì)于本地ion中的所有服務(wù)均不可用時(shí),可以指定從ion獲取。不過(guò)這種情況獲取到的結(jié)果可能與從本地ion獲取的結(jié)果不同,除非這些Rion實(shí)現(xiàn)了跨域數(shù)據(jù)。若要想從ion獲取服務(wù),客戶端需要通過(guò)設(shè)置如上屬性指定eion,并在altone中這些域中aSrr的地址。四、 源碼解1 源碼的重要該類(lèi)用于保存一個(gè)微服務(wù)主機(jī)的信息。一個(gè)該類(lèi)實(shí)例就代表了一個(gè)微服務(wù)主機(jī)。該主機(jī)到raSrr就是將其IstaIo寫(xiě)入到了ra表,且被其它Srer到的該Srr的信息也是這個(gè)IstaIo。//記錄當(dāng)前InstanceInfo在Server端被修改的時(shí)間privatevolatileLong//記錄當(dāng)前InstanceInfo 端被修改的時(shí)間privatevolatileLong//記錄當(dāng) 在Server端的狀privatevolatileInstanceStatusstatus=//該狀態(tài)用于計(jì)算 在Server端的狀態(tài)status(在 提交請(qǐng)求與Renew續(xù)約請(qǐng)求時(shí))privatevolatileInstanceStatusoverriddenStatus=1publicenumInstanceStatus2UP,//Readytoreceive3DOWN,//Donotsendtraffic-healthcheckcallback4STARTING,//Justaboutstarting-initializationstobedone5//send6OUT_OF_SERVICE,//Intentionallyshutdownfor789publicstaticInstanceStatustoEnum(String{if(s!=null)tryreturn}catch(IllegalArgumentExceptione)//ignoreandfallthroughto InstanceStatus.valueOf:{},defaultingto{}",s,UNKNOWN); return // 重寫(xiě)了euqals()方法:只要兩個(gè)InstanceInfo的instanceId相同,那么這兩InstanceInfo就相publicbooleanequals(Objectobj)if(this==obj)return if(obj==null)return if(getClass()!=obj.getClass())return InstanceInfoother=(InstanceInfo)//獲取到Stringid=if(id==null)if(other.getId()!=null)return //比較兩個(gè)}elseif(!id.equals(other.getId()))return return //保存著當(dāng)前name所指定的微服務(wù)名稱的所有privatefinalSet<InstanceInfo>privatefinalAtomicReference<List<InstanceInfo>>key為instanceId,value為privatefinalMap<String,InstanceInfo>instancesMap;7該類(lèi)封裝了來(lái)自于EurekaServer的所有信息。我們可以稱其為“客戶端表”。只所以要強(qiáng)調(diào)“客//key為微服務(wù)名稱,value為privatefinalMap<String,Application>SpringCloud中Eureka與EurekaServer的通信,及EurekaServer間的通信,均采用的是Jersey框Jrsy框架是一個(gè)開(kāi)源的RSTl框架,實(shí)現(xiàn)了JRS規(guī)范。該框架的作用與SpringMC是相同的,其也是用戶提交RI后,在處理器中進(jìn)行路由匹配,路由到指定的業(yè)務(wù)。這個(gè)路由功能同樣也是通過(guò)處理器完成的,只不過(guò)這里的處理器不叫otrollr,而叫sore。1*A<em>jersey</em>resourcethathandlesoperationsfora**@authorKarthikRanganathan,Greg*@Produces({"application/xml","application/json"})publicclassInstanceResource{2 解析中的重要 封裝配置文件中的兩個(gè)屬性的類(lèi)Eureka其的是ereka. 前輟的配置信息。這個(gè)類(lèi)已經(jīng)被@orationroris注解,所這些配置信息可以被自動(dòng)封裝并到容器。其的是ereka.isan的屬性值。這個(gè)類(lèi)也已經(jīng)被@oratiorories注解了,所以這些配置信息可以被自動(dòng)封裝并到容器。 到Server的信息也會(huì)自動(dòng)變更到EurekaServer的表3 源碼解定時(shí)更新“客戶端表”解1#2privatebooleanfetchRegistry(boolean {Stopwatchtracer=FETCH_REGISTRY_TIMER.start();56

try//Ifthedeltaisdisabledorifitisthefirsttime,789

//Applicationsapplications=if( ||(applications==||== ||(applications.getVersion()==-1))//applicationdoesnothavelatestlibrarysupportingdelta ("Disabledeltaproperty:{}", ("Singlevipregistryrefreshproperty:{}", ("fullregistryfetch:{}", ("Applicationisnull:{}",(applications== ("RegisteredApplicationssizeiszero:1 service- #客戶端人服務(wù)端更新表的時(shí)間間隔,默認(rèn)為registry-fetch-interval-seconds:#指定從server更 表的最大時(shí)間間隔指數(shù)(倍數(shù)),默認(rèn)為cache-refresh-executor-exponential-back-off-bound: delta= if(delta==null) logger.warn("Theserverdoesnotallowthedeltarevisiontobeappliedbecauseitisnotsafe." +"Hencegotthefull}else currentUpdateGeneration+1)){ logger.debug("Gotdeltaupdatewithappshashcode{}",StringreconcileHashCode=if(fetchRegistryUpdaock.tryLock())try//這里要將從Server獲取到的所有變更信息更新到本地緩存。這些更//來(lái)自于兩類(lèi)Region:本地Region與Region。而本地緩存也分//兩類(lèi):緩存本地Region的applications與緩存所有的//冊(cè)信息的map(key為Region,value為該Region表reconcileHashCode}finally}}else logger.warn("Cannotacquireupdatelock,aborting //Thereisadiffinnumberofinstancesforsome if(!reconcileHashCode.equals(delta.getAppsHashCode())||Config.shouldLogDeltaDiff()){ thismakesaremoteCall }else logger.warn("Notupdatingapplicationdeltaasanotherthreadisupdatingitalready"); logger.debug("Ignoringdeltaupdatewithappshashcode{},asanotherthreadisupdatingitalready",delta.getAppsHashCode()); 定時(shí)更 信息給#publicvoidrefreshLeaseInfoIfRequired()LeaseInfoleaseInfo=if(leaseInfo==null) intcurrentLeaseDuration= intcurrentLeaseRenewal=//這是迭代穩(wěn)定性的變化使//這是迭代穩(wěn)定性的變化使LeaseInfonewLeaseInfo=}}迭代穩(wěn)定性:一般情況下,對(duì)于多線程操作的共享數(shù)組/集合,我們?cè)趯?duì)其元素進(jìn)行修改操作時(shí),不要直接對(duì)該數(shù)組集合進(jìn)行操作,而是重新創(chuàng)建一個(gè)臨時(shí)的數(shù)組集合,將原數(shù)組集合中的數(shù)據(jù)給臨時(shí)數(shù)組集合,然后再對(duì)這個(gè)臨時(shí)數(shù)組集合執(zhí)行修改操作。執(zhí)行完畢組集合賦值給原數(shù)組集合。這個(gè)操作是為了保證迭代穩(wěn)定性。當(dāng)然,這里的操作要保證互斥(加鎖)總在應(yīng)用啟動(dòng)時(shí)就可以直接進(jìn)行reistr,不過(guò),需要提前在配置文件中配置在ree時(shí),如果srr端返回的是NOT_FOUND,則提交reiser() 4服務(wù)離線源碼解服務(wù)下架:,無(wú)需請(qǐng)求1 31 3注意,從SpringCloud2020.0.0版本開(kāi)始,服務(wù)平滑上下線的終端由service-registry變更為可以通過(guò)直接向EurekaServer提交不同的請(qǐng)求的方式來(lái)實(shí)現(xiàn)指定服務(wù)離線操作。服務(wù)下架:通過(guò)向eurekaserver發(fā)送DELETE請(qǐng)求來(lái)刪除指定的服務(wù)服務(wù)下線:通過(guò)向eurekaserver發(fā)送PUT請(qǐng)求來(lái)修改指定 特殊狀態(tài)用戶提交的狀態(tài)修改請(qǐng)求中指定的狀態(tài),除了IstaIo的內(nèi)置枚舉類(lèi)IstatatsANCEL_ERRIDE狀態(tài)。若用戶提交的狀態(tài)為ACEL_ERRIE,則會(huì)通過(guò)Jrsy向Srvr提交一個(gè)DELETE請(qǐng)求,用于在Srr端將對(duì)應(yīng)IstaIo的orrideSats修改為UKON,即刪除了原來(lái)的orridenStats的狀態(tài)值。此時(shí),該發(fā)送的心跳Srer是不接收的。Srr會(huì)向該返回404。五、EurekaServer源碼解析1EurekaSever解析分析通過(guò)EurekaServer的依賴我們從spring.factories中找到EurekaServer的自動(dòng)配置類(lèi)該配置類(lèi)具有一個(gè)條件注解:要求必須要有一個(gè)reaSererMareron?guration.Marr打開(kāi) 打開(kāi)這個(gè)注解,其是一個(gè)復(fù)合注解,該注解中導(dǎo)入了一個(gè)類(lèi)raSrerMareroratioMarer實(shí)例。在這個(gè)EurekaServer自動(dòng)配置類(lèi)啟動(dòng)后,其會(huì)創(chuàng)建一個(gè)很重要的實(shí)例,InstanceRegistry。該實(shí)例及其處 狀態(tài)修改請(qǐng)?zhí)幚砜蛻舳藙h除overridden狀態(tài)請(qǐng) 注意,并沒(méi)有將該從表中進(jìn)行刪處理客戶端續(xù)約請(qǐng)?zhí)幚砜蛻舳讼录苷?qǐng)對(duì)比處理刪除overridden狀態(tài)請(qǐng) 修改表中該的處理下架請(qǐng)求完成的主要任將 修改表中該的處理客戶端請(qǐng)將 寫(xiě)入到this.numberOfRenewsPerMinThreshold= *(60.0/serverConfig.getExpected*4(客戶端數(shù)量*(60/心跳間隔)*自我保護(hù)開(kāi)啟的閾值因子5(客戶端數(shù)量*每個(gè)客戶端每分鐘發(fā)送心跳的數(shù)量*閾值因子6(所有客戶端每分鐘發(fā)送的心跳數(shù)量*閾值因子7=當(dāng)前Server開(kāi)啟自我保護(hù)機(jī)制的每分鐘最跳數(shù)一旦自我保護(hù)機(jī)制開(kāi)啟了,那么就將當(dāng)前Server保護(hù)了起來(lái),即當(dāng)前server表中的所有均不會(huì)過(guò)期,即當(dāng)沒(méi)有指定時(shí)間內(nèi)(默認(rèn)90秒)發(fā)送續(xù)約,也不會(huì)將其從表中刪除。為什么?就是為了保證server的可用性,即保證AP。 sSendingRenews設(shè)置的越大,當(dāng)前Server開(kāi)啟自我保護(hù)機(jī)制的每分鐘最小心跳數(shù)量就越大,就越容易發(fā)生自我保護(hù)。處理客戶端全量請(qǐng)問(wèn)題問(wèn)題ralacMap的數(shù)據(jù)來(lái)自于readriacMap,但readriachMap中的數(shù)據(jù)若發(fā)生了變更,那么ralacMap中的數(shù)據(jù)一定也

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論