www.e4938.cn-老师你下面太紧了拔不出来,99re8这里有精品热视频免费,国产第一视频一区二区三区,青青草国产成人久久

<button id="60qo0"></button>

<strike id="60qo0"></strike>
<del id="60qo0"></del>
<fieldset id="60qo0"><menu id="60qo0"></menu></fieldset>
  • 如何有效提升團(tuán)隊(duì)的微服務(wù)落地能力?

    2018-01-08 15:35:41 原文來(lái)自微信公眾號(hào):Docker  點(diǎn)擊量: 評(píng)論 (0)
    微服務(wù)體系的發(fā)展并不是一蹴而就的,經(jīng)過了2014年前后的低潮期,微服務(wù)概念頂層的泡沫逐漸褪去,那些真正能夠在企業(yè)落地的實(shí)踐在一輪又

        微服務(wù)體系的發(fā)展并不是一蹴而就的,經(jīng)過了2014年前后的低潮期,微服務(wù)概念頂層的泡沫逐漸褪去,那些真正能夠在企業(yè)落地的實(shí)踐在一輪又一輪的大浪淘沙后被甄別、沉淀。這篇文章希望討論一些在團(tuán)隊(duì)中實(shí)行微服務(wù)架構(gòu)時(shí)值得考慮的『增值項(xiàng)目』,它們中的一些看起來(lái)已經(jīng)是理所應(yīng)當(dāng)?shù)模硪恍┧坪鹾臀⒎?wù)并沒有必然的關(guān)聯(lián),但許多經(jīng)驗(yàn)?zāi)軌蜃C明這些項(xiàng)目都是保障微服務(wù)系統(tǒng)長(zhǎng)期運(yùn)作并最大化發(fā)揮其Scale Out能力值得投入的高附加值實(shí)踐。

    持續(xù)交付

        對(duì)于微服務(wù)的成功實(shí)施,團(tuán)隊(duì)持續(xù)交付能力是至關(guān)重要的衡量指標(biāo)。在由上百個(gè)服務(wù)組成的復(fù)雜系統(tǒng)中,如果所有服務(wù)都按照人為指定發(fā)布周期進(jìn)行整體交付,很容易出現(xiàn)由于細(xì)小的失誤導(dǎo)致大面積線上故障。

        持續(xù)交付實(shí)踐要求每個(gè)獨(dú)立服務(wù)都具有完備的交付流水線,在流水線的末端隨時(shí)能提供當(dāng)時(shí)最新的可工作、可交付的產(chǎn)品。持續(xù)交付通常會(huì)配合自動(dòng)化的測(cè)試和部署手段,從而減少功能代碼提交到上線的端到端時(shí)間。這就使得每個(gè)獨(dú)立服務(wù)能按照各自不同的節(jié)奏進(jìn)行發(fā)布,并且將自己的發(fā)布狀態(tài)可視化出來(lái)。

        采用盡可能精簡(jiǎn)且穩(wěn)定的分支策略也是使得持續(xù)交付流程能夠順利實(shí)施的關(guān)鍵,我們提倡使用單主干的分支策略(Trunk Based Development)。在單主干的開發(fā)方式中,除了一個(gè)用于持續(xù)開發(fā)和集成的『主干分支』(通常即Master分支)和一系列依據(jù)發(fā)布周期創(chuàng)建的發(fā)布分支以外,應(yīng)該避免創(chuàng)建其他的Long-lived分支。如果有多個(gè)功能需要開發(fā),則推薦采用特性開關(guān)(Feature Toggle)的方法來(lái)控制它們的發(fā)布時(shí)機(jī)。當(dāng)然,單主干策略是允許存在短生命周期特性分支的(短于一周),有時(shí)這些小分支甚至無(wú)需提交到遠(yuǎn)程倉(cāng)庫(kù)中。下面這是一幅經(jīng)典的單主干分支策略示意圖。

    A1HKVXsfHNkyprpUfYBDjMuzVibBRibhMFW2r7tP39bVtrMwTMyyDXoibZ2iaJ9laOyiajDJXSGibTRw5tq93QG2XExQ

        值得指出的是,在劃分得當(dāng)?shù)奈⒎?wù)系統(tǒng)中,同一個(gè)服務(wù)需要同時(shí)進(jìn)行開發(fā)的特性通常不會(huì)多于兩到三個(gè)(否則應(yīng)該考慮這個(gè)服務(wù)是否承擔(dān)了過多的職責(zé))。因此即使在不需要特性開關(guān)和其他額外開發(fā)工作量的情況下,已經(jīng)可以比較好的實(shí)現(xiàn)每個(gè)功能點(diǎn)的獨(dú)立發(fā)布和測(cè)試,這反向說明了微服務(wù)架構(gòu)對(duì)于持續(xù)交付的實(shí)施也是十分友好的。

        除了嚴(yán)格的單主干,一種常見的變式是多主干策略,典型的是一個(gè)開發(fā)分支加幾個(gè)固定的發(fā)布分支,通常用于無(wú)需維護(hù)多個(gè)發(fā)布版本的SaaS服務(wù)交付。這種模式的優(yōu)點(diǎn)是能夠?qū)l(fā)布流水線目標(biāo)環(huán)境和分支顯示的關(guān)聯(lián)起來(lái),例如『Develop分支』對(duì)應(yīng)集成環(huán)境,『Release分支』對(duì)應(yīng)驗(yàn)收環(huán)境和正式環(huán)境。下圖展示了一組與此模式下的持續(xù)交付流水線。

    A1HKVXsfHNkyprpUfYBDjMuzVibBRibhMFzR6IB3uHRQszscpXhkZCxEFdvwibAreCOXpPF7ic213XFIHsuOeeyHZg

        保持每個(gè)服務(wù)高頻率的集成和交付,會(huì)使得有故障的功能在很短的反饋周期內(nèi)被發(fā)現(xiàn),在快速迭代發(fā)布的前提下做到整個(gè)系統(tǒng)發(fā)布井然有序。這樣的氛圍不僅有利于改善代碼的質(zhì)量,而且能夠提高開發(fā)士氣,頻繁的發(fā)布上線也有利于增強(qiáng)團(tuán)隊(duì)對(duì)產(chǎn)品的榮譽(yù)感和自信心。

    全功能團(tuán)隊(duì)

        全功能團(tuán)隊(duì)是DevOps運(yùn)動(dòng)所倡導(dǎo)的一種產(chǎn)品團(tuán)隊(duì)組織結(jié)構(gòu),通過將不同角色的業(yè)務(wù)和技術(shù)成員納入到團(tuán)隊(duì),組成具備端到端交付和運(yùn)營(yíng)能力的完整單元。

        康威定律闡述了開發(fā)團(tuán)隊(duì)的組織結(jié)構(gòu)和其設(shè)計(jì)的產(chǎn)品結(jié)構(gòu)之間具有的相似關(guān)系。許多的實(shí)踐結(jié)果也表明,將全功能團(tuán)隊(duì)實(shí)踐應(yīng)用在微服務(wù)產(chǎn)品中帶來(lái)的收益,要遠(yuǎn)遠(yuǎn)超過它在傳統(tǒng)模塊化開發(fā)的產(chǎn)品中所帶來(lái)的收益。這是因?yàn)槲⒎?wù)的架構(gòu)中的所有服務(wù)真正具備獨(dú)立運(yùn)行和獨(dú)立運(yùn)營(yíng)的能力,從本質(zhì)上來(lái)說就是一個(gè)端到端的子業(yè)務(wù)產(chǎn)品。

        這種架構(gòu)和團(tuán)隊(duì)的影響是雙向的。一方面,微服務(wù)的運(yùn)營(yíng)結(jié)構(gòu)要求團(tuán)隊(duì)具有高內(nèi)聚的自主管理能力。另一方面,全功能團(tuán)隊(duì)也為特定服務(wù)進(jìn)行獨(dú)立技術(shù)選型提供了更靈活的發(fā)揮空間。服務(wù)與團(tuán)隊(duì)通常是多對(duì)一的關(guān)系,每個(gè)團(tuán)隊(duì)管理的是一組相互關(guān)聯(lián)緊密的服務(wù)群,并且可以在必要的情況下對(duì)服務(wù)進(jìn)行進(jìn)一步拆分。在實(shí)際的實(shí)踐中推薦采用例如接口網(wǎng)關(guān)(API Gateway)等方式對(duì)一組具有業(yè)務(wù)意義的服務(wù)接口進(jìn)行聚合,從而保證局部服務(wù)結(jié)構(gòu)變化不會(huì)直接影響服務(wù)的消費(fèi)方的調(diào)用。

        值得一說的是,在一些傳統(tǒng)企業(yè)內(nèi)的IT部門劃分,往往已經(jīng)按照職能分為開發(fā)團(tuán)隊(duì)、運(yùn)維團(tuán)隊(duì)、運(yùn)營(yíng)團(tuán)隊(duì),甚至單獨(dú)的測(cè)試團(tuán)隊(duì)。在這樣的企業(yè)中很難快速完成全功能團(tuán)隊(duì)的轉(zhuǎn)變,因此在實(shí)施微服務(wù)架構(gòu)過程中比較容易走偏。對(duì)于這種情況可以采用逐步演進(jìn)的轉(zhuǎn)換方式,具體途徑主要有兩種。

        第一種方式是進(jìn)行項(xiàng)目試點(diǎn)。對(duì)于習(xí)慣了按功能分層、分塊的『實(shí)現(xiàn)接口開發(fā)』式的組織,即使勉強(qiáng)湊齊每個(gè)角色的人組在一起也難以成為真正具備端到端交付能力的團(tuán)隊(duì)。因此與其做得徒有其表,不如找出項(xiàng)目中一些全局意識(shí)比較到位的成員,對(duì)特定的項(xiàng)目進(jìn)行試點(diǎn),然后逐步擴(kuò)大,將這種端到端的責(zé)任和意識(shí)帶入到更多的項(xiàng)目中去。試點(diǎn)的項(xiàng)目應(yīng)該是以實(shí)施現(xiàn)有系統(tǒng)的一個(gè)獨(dú)立業(yè)務(wù)功能點(diǎn)為目標(biāo),而不是開發(fā)與企業(yè)主線系統(tǒng)無(wú)關(guān)的短期產(chǎn)品,否則容易出現(xiàn)試點(diǎn)項(xiàng)目很成功,但項(xiàng)目結(jié)束便不了了之的結(jié)果。

        第二種方式是先從分開發(fā)團(tuán)隊(duì)入手,縱向劃分項(xiàng)目。這是對(duì)全功能團(tuán)隊(duì)的一種妥協(xié)式的引入方式,即在開發(fā)團(tuán)隊(duì)中首先改變系統(tǒng)架構(gòu)橫向分層、局部分塊的開發(fā)模式,依據(jù)業(yè)務(wù)功能進(jìn)行上至外部接口、下至業(yè)務(wù)數(shù)據(jù)的獨(dú)立服務(wù)拆分,但并不急于在開發(fā)團(tuán)隊(duì)中引入諸如測(cè)試、運(yùn)維、業(yè)務(wù)等角色的成員。這種項(xiàng)目劃分雖然在一定程度上為微服務(wù)架構(gòu)執(zhí)行制造了條件,但從長(zhǎng)遠(yuǎn)來(lái)看,并不能為團(tuán)隊(duì)進(jìn)行自主的技術(shù)棧和基礎(chǔ)設(shè)施選型、以及業(yè)務(wù)數(shù)據(jù)的利用提供足夠的空間。

    自動(dòng)化運(yùn)維

        自動(dòng)化運(yùn)維是實(shí)施持續(xù)交付的必要前提,因此也可以說是采用微服務(wù)架構(gòu)的必要前提。但這里所說的自動(dòng)化運(yùn)維,不僅僅包含持續(xù)交付所需的服務(wù)部署時(shí)『一鍵操作』能力,更重要的是運(yùn)維基礎(chǔ)設(shè)施構(gòu)建的自動(dòng)化、以及服務(wù)災(zāi)備、恢復(fù)的自動(dòng)化。微服務(wù)架構(gòu)最初受到追捧的一個(gè)原因是它靈活的『局部Scale Out』能力,以功能點(diǎn)為單元的擴(kuò)展、收縮,這對(duì)于具有業(yè)務(wù)周期性的服務(wù)而言更加重要。但一些企業(yè)在自身基礎(chǔ)設(shè)施自動(dòng)化不到位的情況下盲目實(shí)施微服務(wù),期望通過其實(shí)現(xiàn)復(fù)雜架構(gòu)的解構(gòu),結(jié)果在面對(duì)突發(fā)線上事故時(shí)出現(xiàn)雪崩式的連鎖反應(yīng),情急之下也只能手工恢復(fù)重建,耽誤大量時(shí)間。

     

        實(shí)施自動(dòng)化運(yùn)維涉及的工具有很多,例如Ansible、SaltStack、Terraform,甚至Docker都可以看做是自動(dòng)化運(yùn)維的一部分。這當(dāng)中大多數(shù)工具都提供有定義操作行為的領(lǐng)域DSL,它們通常是一些配置式語(yǔ)言或腳本語(yǔ)言,因此自動(dòng)化運(yùn)維也涉及到代碼的編寫。與開發(fā)項(xiàng)目代碼不同的地方在于,自動(dòng)化運(yùn)維的代碼大多不是長(zhǎng)期運(yùn)行的,很多代碼也許只在特定場(chǎng)景使用一次,然后就會(huì)非常長(zhǎng)時(shí)間無(wú)人問津,直到某些緊急情況才會(huì)再次需要用到。此外,運(yùn)維的代碼本身并不直接具有業(yè)務(wù)價(jià)值,這些因素導(dǎo)致它們往往沒有被很好的管理起來(lái)。

        下面以采用Ansible或SaltStack這類通用自動(dòng)化工具為例,介紹一些在實(shí)踐中需要注意的地方。

        首先是運(yùn)維腳本應(yīng)該通過Git或SVN這樣的版本管理工具進(jìn)行歸類和管理。通常來(lái)說,推薦將特定服務(wù)部署的Ansible或SaltStack YAML腳本文件與服務(wù)本身的代碼放在同一個(gè)代碼倉(cāng)庫(kù)中,方便開發(fā)人員在必要時(shí)候快速的修改它。然后將基礎(chǔ)設(shè)施管理的YAML腳本文件放在單獨(dú)的代碼倉(cāng)庫(kù),方便復(fù)用和查找。但這樣可能帶來(lái)的問題是,在實(shí)際使用時(shí)可能會(huì)需要同時(shí)獲取兩個(gè)代碼倉(cāng)庫(kù)的腳本以獲得完整的部署功能,因此如果使用的其他配套工具對(duì)多倉(cāng)庫(kù)支持不佳,也可以將所有運(yùn)維腳本在同一個(gè)倉(cāng)庫(kù)管理。

        其次,應(yīng)該在持續(xù)交付流水線上使用服務(wù)部署的自動(dòng)化工具,從而實(shí)現(xiàn)快速的交付上線。在條件允許的情況下,還應(yīng)該在流水線上直接配備自動(dòng)化的災(zāi)備恢復(fù)任務(wù)入口,以及定期的對(duì)這些恢復(fù)腳本進(jìn)行測(cè)試和演練。

        最后,雖然我們鼓勵(lì)每個(gè)團(tuán)隊(duì)使用適合自身業(yè)務(wù)的技術(shù)棧進(jìn)行開發(fā),但對(duì)于運(yùn)維工具的選擇通常讓同一個(gè)產(chǎn)品的各服務(wù)采用統(tǒng)一技術(shù)棧比較合適(例如不要混用Ansible和SaltStack的腳本)。這個(gè)建議主要考慮到運(yùn)維工作可能會(huì)有較多跨團(tuán)隊(duì)協(xié)作,以及故障恢復(fù)場(chǎng)景下的快速救災(zāi)操作,統(tǒng)一的技術(shù)棧能為運(yùn)維人員節(jié)約掉工具切換的時(shí)間。

    服務(wù)高可用

        由于微服務(wù)系統(tǒng)中存在著眾多跨服務(wù)調(diào)用,任何一個(gè)服務(wù)都不能假設(shè)自己可以隨意的停機(jī)一段時(shí)間而不對(duì)系統(tǒng)的整體功能造成影響。但在現(xiàn)實(shí)情況中,正常的服務(wù)升級(jí)或意外的故障都有可能造成服務(wù)短暫或長(zhǎng)時(shí)間的中斷,這種中斷輕則引起局部功能不可用,重則導(dǎo)致連鎖反應(yīng)造成重大事故。這些都是在架構(gòu)設(shè)計(jì)時(shí)候就應(yīng)該予以考慮的問題。應(yīng)對(duì)這兩類情況的方法分別是對(duì)服務(wù)采用高可用的部署方式,和進(jìn)行不離線的部署。實(shí)現(xiàn)服務(wù)高可用的方法有很多,常見的有:L7負(fù)載均衡、DNS負(fù)載均衡、服務(wù)發(fā)現(xiàn)、同步/異步消息隊(duì)列等。

     

        L7負(fù)載均衡即在OSI網(wǎng)絡(luò)模型應(yīng)用層進(jìn)行的軟件負(fù)載均衡,例如Nginx和HAProxy都屬于這類。這些L7負(fù)載均衡通常帶有后端服務(wù)檢查的能力,會(huì)自動(dòng)屏蔽掉不可用的后端服務(wù),從而在一部分服務(wù)出現(xiàn)故障時(shí)候,請(qǐng)求仍然能被正常運(yùn)行的后端服務(wù)接收。

        DNS負(fù)載均衡是利用了DNS服務(wù)可以為同一個(gè)域名配置多個(gè)解析地址,且配置多個(gè)地址后,每次解析域名時(shí)輪詢著將配置的地址返回給請(qǐng)求方,這個(gè)特性稱為DNS輪詢。實(shí)際上DNS輪詢僅僅是一種特殊的負(fù)載均衡技術(shù),本身并不具有檢測(cè)服務(wù)狀態(tài)、提供后端服務(wù)高可用的功能。但一些新出現(xiàn)的開源DNS產(chǎn)品,例如SkyDNS和Consul將DNS服務(wù)與服務(wù)發(fā)現(xiàn)技術(shù)進(jìn)行了結(jié)合,具有自動(dòng)移除不可訪問的解析地址的功能,這使得DNS負(fù)載均衡也可以被用于實(shí)現(xiàn)服務(wù)的高可用了。

        服務(wù)發(fā)現(xiàn)是一種基于注冊(cè)和查詢服務(wù)信息的鍵值數(shù)據(jù)庫(kù)服務(wù)。提供服務(wù)的一方將自己的名稱和IP地址注冊(cè)到服務(wù)發(fā)現(xiàn)的服務(wù)端,使用服務(wù)的一方則通過服務(wù)發(fā)現(xiàn)的服務(wù)端進(jìn)行查詢,然后將實(shí)際請(qǐng)求發(fā)送給查詢到的目標(biāo)IP地址。服務(wù)發(fā)現(xiàn)的服務(wù)端會(huì)負(fù)責(zé)檢測(cè)每個(gè)注冊(cè)服務(wù)的運(yùn)行狀態(tài),及時(shí)移除出現(xiàn)故障的服務(wù),并在每次收到查詢時(shí)從符合名稱的服務(wù)中任意返回一個(gè)作為結(jié)果。

        消息隊(duì)列則是一種采用中間媒介解耦服務(wù)提供者和消費(fèi)者的方法。服務(wù)之間通過發(fā)布和訂閱消息進(jìn)行交互,所有的消息通過隊(duì)列進(jìn)行分發(fā)和中轉(zhuǎn)。這種結(jié)構(gòu)使得消息隊(duì)列本身成為所有數(shù)據(jù)通信的瓶頸,與微服務(wù)的去中心化思想相悖,因此并不推薦在大型微服務(wù)系統(tǒng)中采用。

    不離線部署

        不離線部署是確保服務(wù)隨時(shí)能發(fā)布的必要措施,也是微服務(wù)架構(gòu)團(tuán)隊(duì)需要關(guān)注的一種能力。在實(shí)際應(yīng)用中,除了一些天生支持不離線部署的技術(shù)棧,如Erlang,多數(shù)的服務(wù)是原生不支持熱升級(jí)的。對(duì)于這些服務(wù),通常來(lái)說可根據(jù)服務(wù)『是否能遞進(jìn)式升級(jí)』和『是否具有長(zhǎng)任務(wù)』的特性,分成三種類型:『不能遞進(jìn)升級(jí)的服務(wù)』,『能遞進(jìn)升級(jí)、無(wú)長(zhǎng)任務(wù)的服務(wù)』,以及『能遞進(jìn)升級(jí)、有長(zhǎng)任務(wù)的服務(wù)』,分別采用不同策略進(jìn)行。這里先介紹一下服務(wù)的『遞進(jìn)式升級(jí)』和『具有長(zhǎng)任務(wù)』。

     

        遞進(jìn)式升級(jí)(Rolling Update)是指將集群中的服務(wù)劃成多個(gè)分組,每次只升級(jí)其中的一個(gè)分組,然后依次進(jìn)行,直到所有服務(wù)都升級(jí)完成的過程。采用遞進(jìn)式升級(jí)會(huì)使得集群中的服務(wù)有一段時(shí)間同時(shí)存在新舊兩個(gè)版本。

        長(zhǎng)任務(wù)指是接收到請(qǐng)求后需要花費(fèi)幾秒、甚至幾小時(shí)才能執(zhí)行完的任務(wù),例如一些涉及大量計(jì)算或需要遠(yuǎn)程同步調(diào)用的事務(wù)。具有長(zhǎng)任務(wù)的服務(wù)都有『運(yùn)行中』和『空閑』這樣的運(yùn)行狀態(tài)。當(dāng)服務(wù)處于『運(yùn)行中』的時(shí)候,中斷它可能導(dǎo)致意外的結(jié)果。一般來(lái)說在Linux中停止服務(wù)的流程是先向服務(wù)發(fā)送一個(gè)TERM信號(hào),使其正常結(jié)束,若是信號(hào)發(fā)送幾秒后,服務(wù)仍然在運(yùn)行,才會(huì)發(fā)送KILL信號(hào)將它強(qiáng)行終止。處理短任務(wù)的服務(wù)通常可以在接收到TERM信號(hào)后及時(shí)停止,因此不存在這種風(fēng)險(xiǎn)。這里應(yīng)該將『無(wú)長(zhǎng)任務(wù)的服務(wù)』與『無(wú)狀態(tài)的服務(wù)』加以區(qū)分,后者指的是服務(wù)對(duì)每次請(qǐng)求的處理,不依賴于其他請(qǐng)求。即服務(wù)處理一次請(qǐng)求所需的全部信息,要么都包含在這個(gè)請(qǐng)求里,要么可以從外部獲取到(比如說數(shù)據(jù)庫(kù)),服務(wù)器本身不存儲(chǔ)任何信息。通常來(lái)說,微服務(wù)架構(gòu)中的服務(wù)一定是無(wú)狀態(tài)的,但不一定是無(wú)長(zhǎng)任務(wù)的。

        如果服務(wù)不能采用遞進(jìn)式的升級(jí),不論其是否具有長(zhǎng)任務(wù),藍(lán)綠部署都是一種十分推薦的部署方式。藍(lán)綠部署的做法是同時(shí)準(zhǔn)備一組線上運(yùn)行的服務(wù)器,以及一組用于下次部署的服務(wù)器,兩組服務(wù)器具有相同的數(shù)量和配置。執(zhí)行部署時(shí),先將新的服務(wù)部署到?jīng)]有放到線上運(yùn)行的那組服務(wù)器上,等到部署全部完成,直接將負(fù)載均衡的流量導(dǎo)向到剛剛這組服務(wù)器上,從而使得兩組服務(wù)器的角色互換。下一次進(jìn)行部署的時(shí)候,則換用另外一組服務(wù)器執(zhí)行部署,然后將負(fù)載均衡切換回來(lái)。這個(gè)過程如下圖所示:

    A1HKVXsfHNkyprpUfYBDjMuzVibBRibhMFZckm2iaRzpEVMjjhqPc2UrXZEOSfy5wFstEgz7kBAGYs9iaVHBicgb9aw

        藍(lán)綠部署的優(yōu)點(diǎn)在于新舊服務(wù)的切換是瞬間完成的,并且當(dāng)流量切換到另一組服務(wù)器上之后,原先的那組服務(wù)器可以繼續(xù)運(yùn)行,這樣即使上面有未完成的任務(wù)也不會(huì)被強(qiáng)行中斷,如果升級(jí)后的版本發(fā)現(xiàn)了比較嚴(yán)重的問題,也可以快速的切換回原先的版本。而它的缺點(diǎn)也十分明顯,那就是會(huì)占用比實(shí)際需要多一倍的服務(wù)器作為下次部署的備用機(jī)器。

        一些前端服務(wù)可能會(huì)屬于這類情況,我們也許不希望在升級(jí)的過程中,一部分用戶看到是新的頁(yè)面,另一部分看到還是舊的頁(yè)面。另外對(duì)于Nginx這類負(fù)載均衡工具,后端服務(wù)的健康檢查并非是實(shí)時(shí)生效的,有可能出現(xiàn)服務(wù)已經(jīng)離線,但請(qǐng)求仍然被分發(fā)到這個(gè)主機(jī)的情況,因此采用負(fù)載均衡作為高可用方案的服務(wù),藍(lán)綠部署也是比較可取的方式。

        如果服務(wù)的數(shù)量比較多,并且允許同時(shí)存在兩個(gè)運(yùn)行的版本,那么采用遞進(jìn)式升級(jí)方式則會(huì)更加節(jié)省資源。以每次升級(jí)一個(gè)節(jié)點(diǎn)的遞進(jìn)方式為例,當(dāng)升級(jí)開始后,我們首先停止所有服務(wù)節(jié)點(diǎn)中的任意一個(gè),將它進(jìn)行升級(jí),然后讓它重新加入集群,接著從剩下的服務(wù)節(jié)點(diǎn)從再任意選擇一個(gè),直到最后一個(gè)服務(wù)也被升級(jí)完成。這個(gè)過程不需要增加額外的服務(wù)器資源,只要待升級(jí)的服務(wù)具有兩個(gè)以上的節(jié)點(diǎn),就不會(huì)對(duì)服務(wù)的整體功能造成中斷。遞進(jìn)式升級(jí)的過程如下圖所示:

    A1HKVXsfHNkyprpUfYBDjMuzVibBRibhMFzNcvcgVCC2oFF79ianyshfuiaMV8jBHwTHlNibEgjWrerq1BUuoJ2TU0w

        顯然如果服務(wù)本身是不能被隨時(shí)停止的,那么這種簡(jiǎn)單的遞進(jìn)升級(jí)就不能很好的滿足了。此時(shí)我們需要對(duì)服務(wù)的調(diào)度進(jìn)行干涉,以采用服務(wù)發(fā)現(xiàn)的高可用方式為例,下圖展示了一種『帶狀態(tài)檢查的遞進(jìn)式升級(jí)』策略進(jìn)行服務(wù)部署。

    A1HKVXsfHNkyprpUfYBDjMuzVibBRibhMFibjPnwSgWot2VmKLYGlH9fQwcHZ1BlabyGLWbbPC7xmGgqic2kbxFwCQ

        這種升級(jí)方法具有普通遞進(jìn)式升級(jí)的相似優(yōu)勢(shì),但在集群中有個(gè)別服務(wù)執(zhí)行任務(wù)時(shí)間很長(zhǎng),始終處于『運(yùn)行中』狀態(tài)的情況下,將使得升級(jí)過程阻塞,大大的延長(zhǎng)服務(wù)部署的時(shí)間。事實(shí)上,長(zhǎng)任務(wù)的服務(wù)通常都可以被改造成為批處理式的服務(wù)(Batch-Task Service),批處理式服務(wù)的升級(jí)只需要直接將服務(wù)執(zhí)行文件替換,從根本上簡(jiǎn)化了升級(jí)難度。

    監(jiān)控告警

        內(nèi)存不足、磁盤耗盡、網(wǎng)絡(luò)中斷、服務(wù)失效,這些天災(zāi)人禍隨時(shí)可能殃及產(chǎn)品的服務(wù)集群。很難想象,在一個(gè)龐大的微服務(wù)系統(tǒng)中,如果沒有合適的監(jiān)控和告警設(shè)施,服務(wù)的運(yùn)營(yíng)會(huì)變得多么混亂不堪。

        對(duì)微服務(wù)系統(tǒng)進(jìn)行監(jiān)控主要需要考慮兩個(gè)方面:基礎(chǔ)設(shè)施的監(jiān)控和應(yīng)用服務(wù)的監(jiān)控。

        基礎(chǔ)設(shè)施的監(jiān)控通常由部署在每個(gè)節(jié)點(diǎn)上的數(shù)據(jù)采集端、集中式的數(shù)據(jù)匯聚端、以及數(shù)據(jù)展示、數(shù)據(jù)分析和告警通知等部分組成。而監(jiān)控告警系統(tǒng)的實(shí)施中,還需要結(jié)合團(tuán)隊(duì)的運(yùn)維自動(dòng)化能力,選擇合適的技術(shù)棧進(jìn)行。開源的Promethus和InfluxDB都是值得考慮的工具。

        應(yīng)用服務(wù)的監(jiān)控通常需要依據(jù)具體的開發(fā)技術(shù)棧進(jìn)行選擇,例如Java Spring Boot的服務(wù)可以用Spring Boot Admin、Nodejs的服務(wù)則可用node-monitor和pm2等,此外也有一些通用的開源工具,例如Monit。應(yīng)用服務(wù)的監(jiān)控除了需要能夠比較好完成故障的告警外,一些監(jiān)控工具還能嘗試自動(dòng)恢復(fù)故障服務(wù)的運(yùn)行,這些措施都能有效的增加服務(wù)的可靠性。

    容器化

        容器是一種能夠加速促進(jìn)團(tuán)隊(duì)DevOps水平的虛擬化技術(shù)。它通過把服務(wù)和系統(tǒng)依賴全量打包的鏡像格式,將運(yùn)行環(huán)境的設(shè)計(jì)提前到了開發(fā)階段,并且實(shí)現(xiàn)了開發(fā)、測(cè)試、線上環(huán)境的高度一致。由于容器屏蔽了不同服務(wù)運(yùn)行時(shí)的差異性,使得基于這種方式進(jìn)行服務(wù)的大規(guī)模部署和調(diào)度變得簡(jiǎn)單。具體來(lái)說體現(xiàn)在以下幾個(gè)方面:首先是運(yùn)行環(huán)境的隔離。在虛擬機(jī)時(shí)代,由于每個(gè)業(yè)務(wù)依賴的系統(tǒng)環(huán)境不同,服務(wù)器之間無(wú)法通用。各個(gè)業(yè)務(wù)都需要獨(dú)立管理服務(wù)運(yùn)行環(huán)境,還往往造成多個(gè)服務(wù)同時(shí)運(yùn)行的沖突,和各個(gè)運(yùn)行環(huán)境不一致等問題。容器為每個(gè)服務(wù)提供隔離的運(yùn)行環(huán)境,即使在同一個(gè)服務(wù)器上運(yùn)行多種運(yùn)行時(shí)相互有沖突的服務(wù)也不會(huì)出問題。

        其次是精細(xì)的資源分配。通過虛擬機(jī)分配服務(wù)資源時(shí),為了簡(jiǎn)化管理,通常不論服務(wù)實(shí)際使用多少CPU和內(nèi)存資源,都只能從固定的主機(jī)類型中挑選一種,按主機(jī)的個(gè)數(shù)計(jì)費(fèi)。容器能夠很好的實(shí)現(xiàn)面向資源池的服務(wù)管理,各個(gè)服務(wù)可以根據(jù)并發(fā)進(jìn)程數(shù)、CPU和內(nèi)存用量等資源計(jì)費(fèi),實(shí)現(xiàn)更加精細(xì)的資源管理。

        此外,容器還有利于資源的動(dòng)態(tài)調(diào)整。過去企業(yè)里的服務(wù)器資源一般是按計(jì)劃分配的,有的部門為了避開繁瑣的資源申請(qǐng)流程,一次性申請(qǐng)大量資源囤積備用,造成浪費(fèi)。容器的面向資源池特性,使得企業(yè)能夠?qū)⑺杏?jì)算資源進(jìn)行運(yùn)行時(shí)動(dòng)態(tài)調(diào)整,實(shí)現(xiàn)按計(jì)劃分配到按需分配的轉(zhuǎn)變。業(yè)務(wù)只需適應(yīng)流量負(fù)載的變化。在負(fù)載高峰期快速增加資源,保證業(yè)務(wù)服務(wù)質(zhì)量,在負(fù)載低峰期釋放資源給其它服務(wù),提高集群資源利用率。

        容器將部署、運(yùn)行的方式和業(yè)務(wù)很好的進(jìn)行了解耦,目前已經(jīng)有許多成熟的基于容器設(shè)計(jì)的開源調(diào)度框架,例如SwarmKit、Kubernetes、Mesos、Rancher等。由于微服務(wù)架構(gòu)天生具有集群的特性,采用這些框架能夠極大的簡(jiǎn)化服務(wù)部署和運(yùn)維的工作量。

    小結(jié)

        成功的實(shí)施微服務(wù)架構(gòu)需要設(shè)計(jì)的不僅僅是架構(gòu)本身,還有圍繞整個(gè)服務(wù)集群的所有基礎(chǔ)設(shè)施和團(tuán)隊(duì)的自主性文化。從實(shí)踐的角度上說,本文所提到的這些方面也遠(yuǎn)不是微服務(wù)所需要考慮的全部。還有很多沒有提到的實(shí)踐,同樣是值得采納的,只是它們相對(duì)而言并非那么要緊。比如灰度發(fā)布,在微服務(wù)體系中也具有很大的運(yùn)用空間。

        每一個(gè)精心設(shè)計(jì)的企業(yè)級(jí)架構(gòu)背后,都蘊(yùn)含了相當(dāng)?shù)膹?fù)雜性,微服務(wù)亦是如此。優(yōu)秀的架構(gòu)并不能讓軟件的復(fù)雜度憑空消失,而是通過更加合理的拆分和約束,使得軟件結(jié)構(gòu)更加容易匹配業(yè)務(wù)、適應(yīng)變化,從而在規(guī)模化的同時(shí)保持高度的響應(yīng)力。架構(gòu)不是銀彈,離開了必要的實(shí)踐前提,空談微服務(wù),猶如東施效顰,期望拆了服務(wù)就能為企業(yè)帶來(lái)受益,無(wú)疑于空中樓閣的笑話而已。

     

    大云網(wǎng)官方微信售電那點(diǎn)事兒

    責(zé)任編輯:售電衡衡

    免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
    我要收藏
    個(gè)贊
    ?
    神马影院网址| 国产成人Av一区二区| 青青草99久久精品国产综合| 韩国三级中文字幕HD久久精品| 99久久丫E6| 樱花官网官方入门网站2023| 亚洲熟女色乱一区二区| 三年片在线观看免费观看大全小说| 无码国产伦一区二区三区视频| 好吊妞国产日韩无码精品|