今天同一個(gè)大牛聊天耗啦,聊到微服務(wù)的發(fā)布這個(gè)話(huà)題凿菩。就以我司微服務(wù)架構(gòu)為例,我們是使用spring cloud來(lái)構(gòu)建的帜讲,各微服務(wù)之間注冊(cè)于發(fā)現(xiàn)是通過(guò)consul組件來(lái)完成衅谷,各微服務(wù)通過(guò)心跳同consul保持聯(lián)系。那么問(wèn)題來(lái)了似将,我們發(fā)布的過(guò)程中获黔,發(fā)布的間隙,總會(huì)造成當(dāng)前發(fā)布處在發(fā)布過(guò)程中而造成服務(wù)不可用或者調(diào)用的超時(shí)在验,這個(gè)問(wèn)題如何解決玷氏。
想想現(xiàn)階段,確實(shí)會(huì)存在此類(lèi)的問(wèn)題腋舌,但是由于業(yè)務(wù)量較少盏触,這種問(wèn)題造成的影響其實(shí)還不明顯,但是對(duì)于體量大一些比如說(shuō)阿里,騰訊赞辩,滴滴這種雌芽,出現(xiàn)此類(lèi)問(wèn)題影響的可能會(huì)是成千上萬(wàn)的用戶(hù),那么這個(gè)問(wèn)題就變成了必須要解決的問(wèn)題辨嗽。
對(duì)于大數(shù)據(jù)量的項(xiàng)目發(fā)布世落,一般情況下回逐臺(tái)發(fā)布,因?yàn)槿绻瑫r(shí)發(fā)布糟需,那么此時(shí)你的這個(gè)服務(wù)整體都是不可用的岛心,所以肯定不行。即使這樣也是遠(yuǎn)遠(yuǎn)不夠的篮灼,因?yàn)槌R?jiàn)的微服務(wù)的并非真正進(jìn)行遠(yuǎn)程調(diào)用的時(shí)候才會(huì)拉取配置中心的數(shù)據(jù)忘古,而是定時(shí)同步,比如說(shuō)設(shè)置的時(shí)間為30s诅诱。比如說(shuō)A服務(wù)調(diào)用B服務(wù)髓堪,B服務(wù)有兩個(gè)事例分別是b1與b2,A服務(wù)剛從consul上同步了B的服務(wù)的信息娘荡,此時(shí)b1掛掉了干旁,那么對(duì)于A來(lái)說(shuō)是無(wú)感知的(未到下次同步的時(shí)間),那么此時(shí)調(diào)用的時(shí)候就會(huì)有問(wèn)題(這種情況可能出現(xiàn)在發(fā)布炮沐,也有可能出現(xiàn)在日常生活中争群,他就是突然DOWN掉了)。
情景描述完了大年,再說(shuō)一下解決换薄。兩種方式,第一種翔试,重寫(xiě)調(diào)用的策略轻要,當(dāng)發(fā)現(xiàn)b1調(diào)用有問(wèn)題的時(shí)候,嘗試使用b2來(lái)調(diào)用垦缅。這種方式多了一次調(diào)用冲泥,好在撐過(guò)下次同步的時(shí)間就好了(更新數(shù)據(jù)了)。第二種方式是大牛提供的壁涎,比較精妙一點(diǎn)凡恍,叫做“服務(wù)假死”。比如說(shuō)我想要重啟b1,那么b1發(fā)送一個(gè)死亡的消息給到consul,實(shí)際上沒(méi)有死怔球,那么A服務(wù)調(diào)用到b1時(shí)還是可以提供服務(wù)(因?yàn)槭羌偎溃┙涝汀5鹊较麓瓮降臅r(shí)間拉取B服務(wù)的列表就只用b2沒(méi)有b1了,因?yàn)閏onsul認(rèn)為b1死了庞溜。也就是說(shuō)當(dāng)b1發(fā)出假死信號(hào)后革半,一個(gè)查詢(xún)周期之內(nèi)碑定,服務(wù)正常提供流码,一個(gè)周期之外又官,因?yàn)闆](méi)有這個(gè)節(jié)點(diǎn)的信息了,所以當(dāng)然可以重啟了漫试,對(duì)系統(tǒng)來(lái)說(shuō)也是沒(méi)有影響的六敬。
這個(gè)思考到了這里就接近了尾聲,解決這個(gè)問(wèn)題的思路還有很多驾荣,如果有更好的外构,不妨給出你的,咱們一起討論播掷。