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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

5比較一致性算-無有無有支支支支支不支支支不支不支支支三、Eureka源碼解析預備Eureka的異地多異地多活一般是指在不同城市建立獨立活是相對于主備關系中的熱備而言的。熱備是指備份機房隨時全量備份著主機的數(shù)據(jù),但平時不支撐業(yè)務需求,即不對外提供服務。只有在主機房出現(xiàn)故障時才會切換到備份機房,由備份機房對外提供服務。也就是說,平時只有主機房是活的。多活則是指這些機房間屬于主從關系,即這些機房平時都支撐業(yè)務需求,都對外提供服務,相互備Region與Eureka中具有Region與AvailabilityZone(簡稱AZ)概念,都是云計算中為了方便不同地理區(qū)域中用戶的使用,大型云服務提供商一般會根據(jù)用戶需求量在不同的城市、省份、國家或洲創(chuàng)建不同的大型云計算機房。這些不同區(qū)域機房間一般是不能“內網(wǎng)連通”的。這些區(qū)域就稱為一個eion。這里存在一個問題:同一eion機房是如何實現(xiàn)同域容災的?為了增強容災能力,在一個eion中又設置了不同的vailailiyZone。這些Z間實現(xiàn)了內網(wǎng)連通,且用戶可以根據(jù)自己所在的具置自動選擇同域中的不同Z。當用戶所要的Z出現(xiàn)問題后,系統(tǒng)會自動切換到其它可用的Z。例如,WS將全球劃分為了很多的ion,例如東部區(qū)、西部區(qū)、歐洲區(qū)、非洲敦區(qū)、亞太區(qū)等。像ra系統(tǒng)架構圖中的sas-c、sa-d、s-a1e就是seas1這個eion中的c、、三個AZ。Eureka中的Region與Zone配需bj-1與bj-2,每個AZ中有三臺EurekaServerh1與h2兩臺主機提供的都是相同的Srvi服務,根據(jù)地理位置的不同,這兩臺主機分別到了距離自己最近的不同Z的raSrr。ServerAZbj-1ServerAZbj-2ZuulAZbj-1ZuulAZbj-2ServiceAZbj-1ServiceAZbj-2當一個rio有多個zon時,微服務調用應用時優(yōu)先調用同one內的應用。原因是ra 置re-sameoneerea,默認為ru。當同zon中的應用均不可用時,才會調用其它one中的服務。指定Region配對于本地ion中的所有服務均不可用時,可以指定從ion獲取。不過這種情況獲取到的結果可能與從本地ion獲取的結果不同,除非這些Rion實現(xiàn)了跨域數(shù)據(jù)。若要想從ion獲取服務,客戶端需要通過設置如上屬性指定eion,并在altone中這些域中aSrr的地址。四、 源碼解1 源碼的重要該類用于保存一個微服務主機的信息。一個該類實例就代表了一個微服務主機。該主機到raSrr就是將其IstaIo寫入到了ra表,且被其它Srer到的該Srr的信息也是這個IstaIo。//記錄當前InstanceInfo在Server端被修改的時間privatevolatileLong//記錄當前InstanceInfo 端被修改的時間privatevolatileLong//記錄當 在Server端的狀privatevolatileInstanceStatusstatus=//該狀態(tài)用于計算 在Server端的狀態(tài)status(在 提交請求與Renew續(xù)約請求時)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 // 重寫了euqals()方法:只要兩個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 //比較兩個}elseif(!id.equals(other.getId()))return return //保存著當前name所指定的微服務名稱的所有privatefinalSet<InstanceInfo>privatefinalAtomicReference<List<InstanceInfo>>key為instanceId,value為privatefinalMap<String,InstanceInfo>instancesMap;7該類封裝了來自于EurekaServer的所有信息。我們可以稱其為“客戶端表”。只所以要強調“客//key為微服務名稱,value為privatefinalMap<String,Application>SpringCloud中Eureka與EurekaServer的通信,及EurekaServer間的通信,均采用的是Jersey框Jrsy框架是一個開源的RSTl框架,實現(xiàn)了JRS規(guī)范。該框架的作用與SpringMC是相同的,其也是用戶提交RI后,在處理器中進行路由匹配,路由到指定的業(yè)務。這個路由功能同樣也是通過處理器完成的,只不過這里的處理器不叫otrollr,而叫sore。1*A<em>jersey</em>resourcethathandlesoperationsfora**@authorKarthikRanganathan,Greg*@Produces({"application/xml","application/json"})publicclassInstanceResource{2 解析中的重要 封裝配置文件中的兩個屬性的類Eureka其的是ereka. 前輟的配置信息。這個類已經被@orationroris注解,所這些配置信息可以被自動封裝并到容器。其的是ereka.isan的屬性值。這個類也已經被@oratiorories注解了,所以這些配置信息可以被自動封裝并到容器。 到Server的信息也會自動變更到EurekaServer的表3 源碼解定時更新“客戶端表”解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- #客戶端人服務端更新表的時間間隔,默認為registry-fetch-interval-seconds:#指定從server更 表的最大時間間隔指數(shù)(倍數(shù)),默認為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獲取到的所有變更信息更新到本地緩存。這些更//來自于兩類Region:本地Region與Region。而本地緩存也分//兩類:緩存本地Region的applications與緩存所有的//冊信息的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()); 定時更 信息給#publicvoidrefreshLeaseInfoIfRequired()LeaseInfoleaseInfo=if(leaseInfo==null) intcurrentLeaseDuration= intcurrentLeaseRenewal=//這是迭代穩(wěn)定性的變化使//這是迭代穩(wěn)定性的變化使LeaseInfonewLeaseInfo=}}迭代穩(wěn)定性:一般情況下,對于多線程操作的共享數(shù)組/集合,我們在對其元素進行修改操作時,不要直接對該數(shù)組集合進行操作,而是重新創(chuàng)建一個臨時的數(shù)組集合,將原數(shù)組集合中的數(shù)據(jù)給臨時數(shù)組集合,然后再對這個臨時數(shù)組集合執(zhí)行修改操作。執(zhí)行完畢組集合賦值給原數(shù)組集合。這個操作是為了保證迭代穩(wěn)定性。當然,這里的操作要保證互斥(加鎖)總在應用啟動時就可以直接進行reistr,不過,需要提前在配置文件中配置在ree時,如果srr端返回的是NOT_FOUND,則提交reiser() 4服務離線源碼解服務下架:,無需請求1 31 3注意,從SpringCloud2020.0.0版本開始,服務平滑上下線的終端由service-registry變更為可以通過直接向EurekaServer提交不同的請求的方式來實現(xiàn)指定服務離線操作。服務下架:通過向eurekaserver發(fā)送DELETE請求來刪除指定的服務服務下線:通過向eurekaserver發(fā)送PUT請求來修改指定 特殊狀態(tài)用戶提交的狀態(tài)修改請求中指定的狀態(tài),除了IstaIo的內置枚舉類IstatatsANCEL_ERRIDE狀態(tài)。若用戶提交的狀態(tài)為ACEL_ERRIE,則會通過Jrsy向Srvr提交一個DELETE請求,用于在Srr端將對應IstaIo的orrideSats修改為UKON,即刪除了原來的orridenStats的狀態(tài)值。此時,該發(fā)送的心跳Srer是不接收的。Srr會向該返回404。五、EurekaServer源碼解析1EurekaSever解析分析通過EurekaServer的依賴我們從spring.factories中找到EurekaServer的自動配置類該配置類具有一個條件注解:要求必須要有一個reaSererMareron?guration.Marr打開 打開這個注解,其是一個復合注解,該注解中導入了一個類raSrerMareroratioMarer實例。在這個EurekaServer自動配置類啟動后,其會創(chuàng)建一個很重要的實例,InstanceRegistry。該實例及其處 狀態(tài)修改請?zhí)幚砜蛻舳藙h除overridden狀態(tài)請 注意,并沒有將該從表中進行刪處理客戶端續(xù)約請?zhí)幚砜蛻舳讼录苷垖Ρ忍幚韯h除overridden狀態(tài)請 修改表中該的處理下架請求完成的主要任將 修改表中該的處理客戶端請將 寫入到this.numberOfRenewsPerMinThreshold= *(60.0/serverConfig.getExpected*4(客戶端數(shù)量*(60/心跳間隔)*自我保護開啟的閾值因子5(客戶端數(shù)量*每個客戶端每分鐘發(fā)送心跳的數(shù)量*閾值因子6(所有客戶端每分鐘發(fā)送的心跳數(shù)量*閾值因子7=當前Server開啟自我保護機制的每分鐘最跳數(shù)一旦自我保護機制開啟了,那么就將當前Server保護了起來,即當前server表中的所有均不會過期,即當沒有指定時間內(默認90秒)發(fā)送續(xù)約,也不會將其從表中刪除。為什么?就是為了保證server的可用性,即保證AP。 sSendingRenews設置的越大,當前Server開啟自我保護機制的每分鐘最小心跳數(shù)量就越大,就越容易發(fā)生自我保護。處理客戶端全量請問題問題ralacMap的數(shù)據(jù)來自于readriacMap,但readriachMap中的數(shù)據(jù)若發(fā)生了變更,那么ralacMap中的數(shù)據(jù)一定也

溫馨提示

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

評論

0/150

提交評論