Martian-cloud傳染機制的原理是什么,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來,先為鎮(zhèn)安等服務(wù)建站,鎮(zhèn)安等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為鎮(zhèn)安企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
常規(guī)的分布式采用的是【生產(chǎn)者->注冊中心->消費者】模型,生產(chǎn)者將接口給注冊中心,消費者從注冊中心發(fā)現(xiàn)其他的服務(wù),實現(xiàn)調(diào)用
傳染機制就是丟棄注冊中心,可以把接口看做病毒,服務(wù)看做是人,服務(wù)之間只要有直接或者間接的聯(lián)系,最終都會被染上病毒(接口)
假如現(xiàn)在有三個服務(wù)
此時,需要發(fā)布這三個服務(wù),那我們可以先規(guī)劃下,將他們連在一起,連在一起的意思是在配置里寫好誰連誰。
連接方式可以是這樣【圖1】
也可以是這樣【圖2】
也可以是這樣【圖3】
總之,只要別讓任何服務(wù)落單就行,隨便怎么連,你甚至可以來一個五花大綁(不過不建議)
-----------------------------------------------------------------
連接以后就到發(fā)布階段了,那么發(fā)布的時候,這些服務(wù)之間會發(fā)生什么呢?
我們拿【圖1】來舉例
1. 首先我們啟動A服務(wù),啟動后由于其他服務(wù)還未啟動,所以A連接不到B,所以此時A的本地接口緩存表是空的,如下圖
2. 為了避免大家覺得過程過于理想,所以接下來我啟動C,而不是啟動B
C啟動后,由于B還沒啟動,所以他無法被發(fā)現(xiàn),此時他是孤立的,所以本地緩存的接口依然如下:
3. 接下來就是啟動B了,當(dāng)B啟動后,會立刻被A發(fā)現(xiàn),所以A會從B獲取一次接口,此時本地緩存如下:
A獲取到接口以后還會再做一件事,那就是發(fā)廣播,流程如下:
由于本地緩存的是接口,而很多接口都來自同一個服務(wù),所以需要從本地緩存中先提取出這些服務(wù)的ip和端口號
經(jīng)過了第1步以后,會得到一批ip和端口號(按照本示例來說,提取出來的就是B的ip和端口) A會將自己的所有接口(是自己的所有接口,不是本地緩存的接口)廣播給這批IP和端口號,(按照本示例來說,A會把自己的接口廣播給B)
經(jīng)過廣播以后,此時本地接口緩存變成了下面這樣:
上面是A發(fā)現(xiàn)B的過程,那么C的接口如何傳染給別人呢?
我們剛才都是用【圖1】在舉例,所以在【圖1】我們可以看出B連接的是C,所以當(dāng)B啟動時,除了被A發(fā)現(xiàn)完成上面講述的一系列流程,他還會去發(fā)現(xiàn)C,發(fā)現(xiàn)C以后,他會從C獲取一次接口,所以本地緩存如下:
B拿到接口后,依然會像A一樣發(fā)起一次廣播,廣播以后本地緩存就變成了這樣:
接下來就有意思了,A和C是如何傳染的?
很簡單,我們先來回顧一下 服務(wù)啟動時的過程:
從連接的服務(wù)上獲取接口【如果服務(wù)已經(jīng)啟動了,那就是隨機從本地緩存的接口中提取一個服務(wù),去獲取那個服務(wù)上緩存的接口】
給這些服務(wù)發(fā)起廣播【已經(jīng)被廣播過的服務(wù)直接忽略】
其實,這個流程是輪詢的,并不是一次性的, 所以接下來就輪到A再次執(zhí)行這個過程了,當(dāng)他再次執(zhí)行這個過程的時候,他會從B獲取到C的接口,然后將自己的接口廣播給C,所以此刻變成了這樣:
這樣一來,所有的服務(wù)都被對方發(fā)現(xiàn)了。
1. 首先是自私機制
所謂的自私機制,就是每個服務(wù)只顧自己,不管別人,每個服務(wù)如果發(fā)現(xiàn)自己本地緩存的接口連接不上,那就會從本地把他下掉,至于別人,他是不管的。
2. 投票機制
這是每個服務(wù)的內(nèi)部投票,跟外面無關(guān),如果一個服務(wù)發(fā)現(xiàn)他本地緩存的某個接口連接不上,那么他就會給這個接口指向的服務(wù)投一票,讓它從本機下線,當(dāng)調(diào)通后會把票數(shù)清0,當(dāng)票數(shù)積累到一定程度時,這個服務(wù)的所有接口都會被從當(dāng)前服務(wù)上清理掉?!久總€服務(wù)都有一套這樣的機制,來維護(hù)自己的本地接口緩存】
3. 如果(下線某個服務(wù)的決定)是誤判怎么辦
有一個補償機制,就是每個服務(wù)在下掉別的服務(wù)的時候,都會給被下掉的那個服務(wù)發(fā)一個通知,讓他把自己從已廣播列表中移除(比如A服務(wù)調(diào)不通B服務(wù)的接口,當(dāng)票數(shù)累積到一定程度后,A會把B的接口全部清理掉,清理后A會給B發(fā)一個通知,讓B把A從已廣播列表移除,這樣如果B服務(wù)沒掛,那么B在下一次輪詢時 會把接口重新廣播給A)
如果B服務(wù)明明沒掛,但是A服務(wù)連續(xù)調(diào)不通,而且連下線通知都無法通知到B服務(wù),那我只能說B服務(wù)活該了,即使是誤判也比留著報錯影響性能好吧。
4. 調(diào)不通的情況有很多,不一定是服務(wù)掛了,那么什么樣的情況會給服務(wù)投下線票
很簡單,當(dāng)調(diào)用接口時,出現(xiàn)了以下三種異常,就會投票
ConnectException ,連接不上,這不是404之類的,而是根本連不上這個ip:port
UnknownHostException,無法解析地址,提供的 ip:port 無法被解析識別
SocketTimeoutException,連接超時,不是read time out,而是 connect time out
5. 然后是垃圾回收機制
垃圾回收很簡單,就是定時去本地緩存中掃描出被下線的服務(wù)的接口,然后刪除掉。
上面這這一套機制,可以保證當(dāng)服務(wù)宕機以后,接口會自動從其他的服上下線
假如B掛了,這個鏈條就斷了,傳染是否會受影響呢?
其實不會,因為這個鏈條 只是啟動時有用,啟動后就作廢了,拿A來說,A只有啟動時會去B獲取接口,下次輪詢的時候,是從本地緩存的接口中隨機挑選一個服務(wù) 去獲取,所以鏈條不會斷。
至于廣播,也是廣播給本地緩存的服務(wù),并不是配置的這個服務(wù)。
所以宕機是不會影響接口傳染的
很簡單,只需要將他連接到正在運行的 任意一個服務(wù)上即可,很快它就會渾身染滿病毒(接口)
關(guān)于Martian-cloud傳染機制的原理是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
本文標(biāo)題:Martian-cloud傳染機制的原理是什么
網(wǎng)站路徑:http://muchs.cn/article16/igesdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、App設(shè)計、網(wǎng)站內(nèi)鏈、移動網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)