<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你能讀懂微服務(wù)架構(gòu)深度解析:架構(gòu)設(shè)計(jì)背后的哲學(xué)嗎?

          共 4284字,需瀏覽 9分鐘

           ·

          2022-02-26 00:40

          架構(gòu)設(shè)計(jì)哲學(xué)

          如果說軟件開發(fā)的本質(zhì)是不斷挖掘問題領(lǐng)域中隱藏的錯(cuò)綜復(fù)雜性,那么架構(gòu)解決的問題就是如何管理這些復(fù)雜性。而在軟件領(lǐng)域,最為復(fù)雜的軟件實(shí)體莫過于軟件操作系統(tǒng)。從數(shù)以千計(jì)的工程師參與開發(fā)的UNIX操作系統(tǒng)到Linux開源系統(tǒng)的成功,越來越多的人開始關(guān)注和思考UNIX技術(shù)背后隱藏的設(shè)計(jì)哲學(xué)。

          UNIX設(shè)計(jì)哲學(xué)概括為一句話就是“小而專注”??梢哉f,微服務(wù)架構(gòu)理念和UNIX設(shè)計(jì)哲學(xué)一脈相承,微服務(wù)將UNIX設(shè)計(jì)哲學(xué)中的核心準(zhǔn)則通過概念的抽象,描述成了更加通用的架構(gòu)風(fēng)格和設(shè)計(jì)原則。下面,讓我們跟隨經(jīng)典重新認(rèn)識(shí)在AT&T公司誕生的UNIX操作系統(tǒng)和它背后的設(shè)計(jì)哲學(xué),所謂“溫故而知新”,這些經(jīng)典思想能加深我們對(duì)微服務(wù)架構(gòu)的認(rèn)識(shí)和理解。

          小即是美

          在軟件的設(shè)計(jì)開發(fā)過程中,軟件系統(tǒng)的規(guī)模很容易膨脹,工程師喜歡將紛繁復(fù)雜的功能全部堆積在一個(gè)程序中,這樣的好處是代碼唾手可得。然而,根據(jù)二八法則,實(shí)際運(yùn)行中的代碼其實(shí)往往只占到我們代碼量的20%。所以,切忌將大而全的工程作為我們的目標(biāo),相反,我們應(yīng)該將功能設(shè)計(jì)成為實(shí)用且簡(jiǎn)潔的小程序。

          在我的職業(yè)生涯中,經(jīng)歷過很多設(shè)計(jì)復(fù)雜、規(guī)模龐大的單體系統(tǒng)。有的是基于C++編程語言的后端大型系統(tǒng),有的是使用J2EE-XML編程風(fēng)格、交織著龐大功能模塊的巨石型應(yīng)用,這些項(xiàng)目通常由10人以上的研發(fā)團(tuán)隊(duì)負(fù)責(zé),動(dòng)輒百人/月的開發(fā)計(jì)劃。這種大型單體系統(tǒng)在上線后,時(shí)常發(fā)生系統(tǒng)內(nèi)存溢出、系統(tǒng)宕機(jī)等問題,讓開發(fā)人員心驚膽戰(zhàn)。往往一個(gè)小問題會(huì)影響整個(gè)系統(tǒng)的正常運(yùn)行,排查解決過程需要檢查整個(gè)工程的代碼邏輯,開發(fā)人員疲于解決生產(chǎn)上線后的各種問題和Bug修復(fù)。

          事實(shí)證明,我們需要將龐大、復(fù)雜的系統(tǒng)分解成小程序。正如UNIX系統(tǒng)中強(qiáng)調(diào)的KISS(Keep it Simple and Stupid)原則,可以說整個(gè)UNIX系統(tǒng)都是由數(shù)目眾多的小程序組合完成各種復(fù)雜的操作系統(tǒng)功能的。每個(gè)小程序只完成其中一小部分功能。表面上,這些小程序都很低效,但是正是通過像搭積木一樣將不同功能的小程序通過變換順序和組合的方式,完成了各種意想不到的豐富而強(qiáng)大的功能。

          小程序之美體現(xiàn)在響應(yīng)變化上。通過小程序可以將這種改變控制在足夠小的范圍,保證不會(huì)給整個(gè)系統(tǒng)帶來巨大的影響。

          小程序之美體現(xiàn)在工程結(jié)構(gòu)的簡(jiǎn)化和完備上。當(dāng)你的程序充滿了個(gè)性化的反射調(diào)用和程序員獨(dú)特的編程思維痕跡,那么應(yīng)該反省你的代碼是不是已經(jīng)脫離了小程序應(yīng)有的代碼簡(jiǎn)潔和易于理解。

          小程序之美體現(xiàn)在性能優(yōu)勢(shì)上。小程序?qū)ν獠康囊蕾嚿?,從而可以快速啟?dòng),基于資源收斂式的反應(yīng)式編程模型可以提升性能并減少資源浪費(fèi)。

          小程序之美體現(xiàn)在團(tuán)隊(duì)合作和獨(dú)立演進(jìn)上。清晰的邊界劃分是團(tuán)隊(duì)協(xié)作的有效手段,而體現(xiàn)在微服務(wù)架構(gòu)上就是服務(wù)提供者和消費(fèi)者可以預(yù)先訂立契約,可以根據(jù)契約獨(dú)立、并行開發(fā)各個(gè)服務(wù),這樣就實(shí)現(xiàn)了服務(wù)之間的解耦,使其功能能夠獨(dú)立進(jìn)化。

          做好一件事

          小程序應(yīng)該只做好一件事,應(yīng)該保持對(duì)一件事的專注力。在UNIX設(shè)計(jì)哲學(xué)中,解決一個(gè)問題并將問題解決到完美,比同時(shí)解決多個(gè)問題更為重要。然而在我們的工程中,隨著項(xiàng)目的進(jìn)展,我們很難將龐大的代碼庫進(jìn)行清晰的模塊劃分,更糟糕的是我們很多時(shí)候并不知道這些模塊之間的服務(wù)界限。

          在UNIX操作系統(tǒng)中,我們可以發(fā)現(xiàn)很多命令的強(qiáng)大之處正是只有單一的功能,并將這件事干好,也就是所謂的“Do one thing,do itwell”。而且UNIX首創(chuàng)的管道可以把這些命令任意地組合,以完成一個(gè)更為強(qiáng)大的功能。這些哲學(xué)到今天都在深深地影響著整個(gè)計(jì)算機(jī)產(chǎn)業(yè),下面我們羅列一些經(jīng)典的UNIX命令程序,如下表所示。


          微服務(wù)的目標(biāo)是獨(dú)立地完成一件事并做到最好。微服務(wù)可以根據(jù)業(yè)務(wù)的邊界來確定應(yīng)用的行為,這樣它不僅可以很容易地確定某個(gè)功能邏輯對(duì)應(yīng)的代碼,而且由于該服務(wù)專注在某個(gè)邊界之內(nèi),因此可以更好地避免由于代碼庫過大衍生出的復(fù)雜性問題。

          快速建立原型

          只做好一件事的小程序可以讓我們的項(xiàng)目輕裝前行,我們不必再擔(dān)心系統(tǒng)會(huì)成為一個(gè)龐然大物而無法控制。對(duì)于單體巨石應(yīng)用,需要制定周密的計(jì)劃去編寫設(shè)計(jì)文檔,以及為聚合不同模塊之間功能而準(zhǔn)備腳本和代碼,相比之下,自治的小程序更加清楚自己的業(yè)務(wù)職責(zé)和業(yè)務(wù)范圍。開發(fā)人員可以對(duì)小程序快速建立原型,縮短服務(wù)的交付周期,迅速構(gòu)建可以供用戶使用的程序和服務(wù),并從結(jié)果中得到反饋,向最終的目標(biāo)前進(jìn)。

          在UNIX設(shè)計(jì)哲學(xué)中,軟件發(fā)生變化是不可避免的,這種變化來源于溝通的失敗、需求理解的差異、知識(shí)經(jīng)驗(yàn)的限制等,所以軟件工程相比任何其他工程都更加容易返工,需要軟件從業(yè)者不斷試錯(cuò)、總結(jié)、驗(yàn)證,并根據(jù)期望重新建立共識(shí)。盡快建立原型是一個(gè)重要的步驟,有了具體的原型,可以降低項(xiàng)目的風(fēng)險(xiǎn),可以給客戶展示和進(jìn)行可視化跟蹤。往往這個(gè)過程是伴隨著系統(tǒng)的迭代和演進(jìn)的。

          回到微服務(wù),我們說微服務(wù)架構(gòu)在建立原型上有天然的優(yōu)勢(shì),微服務(wù)架構(gòu)的很多特性能讓我們快速落地和逐步地獨(dú)立完善和迭代項(xiàng)目。

          ● 微服務(wù)架構(gòu)強(qiáng)調(diào)細(xì)粒度的服務(wù),在服務(wù)規(guī)模上盡量精簡(jiǎn)和務(wù)實(shí)。

          ● 微服務(wù)架構(gòu)只做好一件事,沒有過多的其他因素干擾,我們可以將注意力集中在完成這件事情上,盡量排除干擾因素。

          ● 微服務(wù)架構(gòu)提供輕量級(jí)的通信集成方式,有利于集成測(cè)試和驗(yàn)證結(jié)果。

          ● 微服務(wù)架構(gòu)建立在已有的技術(shù)基礎(chǔ)之上,能夠更加快速地構(gòu)建、發(fā)布和體驗(yàn)應(yīng)用。

          軟件的復(fù)利效應(yīng)

          在軟件工程實(shí)踐中,在項(xiàng)目的啟動(dòng)或者早期階段,經(jīng)常會(huì)面臨技術(shù)方案的選擇問題。一些軟件工程師會(huì)陷入自我保護(hù)的狀態(tài),認(rèn)為別人的方案存在缺陷,自己如果重新做會(huì)比現(xiàn)有方案做得更好,但其實(shí)可能是因?yàn)樗涣私狻懊總€(gè)軟件可能都是在某種約束條件下工作的,而且適用于某些特定的場(chǎng)景”。我們把這種現(xiàn)象稱為“NIH(NotInvented Here)綜合征”。NIH綜合征的結(jié)果就是重新發(fā)明輪子,患有NIH綜合征的人相信內(nèi)部開發(fā)更安全、更高效、速度更快、維護(hù)成本更低,然而,其實(shí)他們并不一定能夠使用創(chuàng)新的方案來解決實(shí)際的問題。目前,軟件正朝著規(guī)模化和標(biāo)準(zhǔn)化的方向發(fā)展,標(biāo)準(zhǔn)驅(qū)動(dòng)下的軟件開發(fā)和集成方式,要求你的工作能夠集成到標(biāo)準(zhǔn)中,而不是另起爐灶。NIH綜合征的危險(xiǎn)之處就是,你的軟件、你的服務(wù)無法與標(biāo)準(zhǔn)對(duì)接,你的系統(tǒng)可能成為一個(gè)孤島系統(tǒng)。例如,在你提供了私有協(xié)議的RPC方式暴露服務(wù)的情況下,你的服務(wù)只能生存在自己的閉環(huán)體系中,而且基于標(biāo)準(zhǔn)的HTTP接口API的調(diào)用方式很難與你的服務(wù)集成。

          項(xiàng)目的生命周期受很多因素的影響,預(yù)算、人員成本、推廣等都會(huì)給項(xiàng)目的持續(xù)發(fā)展帶來風(fēng)險(xiǎn),NIH綜合征會(huì)給項(xiàng)目的持續(xù)發(fā)展帶來額外的成本問題,因?yàn)槟闳鄙傧嚓P(guān)人員、資料、生態(tài)的支持,而采用標(biāo)準(zhǔn)化的技術(shù)可以從互聯(lián)網(wǎng)中得更多的技術(shù)、社區(qū)和人員的支持。

          下面讓我們看看UNIX的實(shí)踐,所謂“前人種樹、后人乘涼”。查閱UNIX坎坷的發(fā)展歷程,我們就會(huì)發(fā)現(xiàn),UNIX操作系統(tǒng)是在數(shù)千名工程師的辛勤努力的基礎(chǔ)上發(fā)展起來的。UNIX中復(fù)雜的邏輯都是由小的程序累積而成的,聰明的程序員總是可以借用前人寫的優(yōu)秀代碼實(shí)現(xiàn)自己的功能,這樣才能更快、更好地?cái)U(kuò)大軟件的影響力和威力,放大自己的工作成果。

          在微服務(wù)領(lǐng)域,我們已經(jīng)看到非常多優(yōu)秀的微服務(wù)技術(shù)框架,例如本文后續(xù)會(huì)詳細(xì)介紹的Spring Boot微服務(wù)腳手架。它是在Spring生態(tài)的基礎(chǔ)上發(fā)展起來(Spring Boot也是軟件復(fù)利的成果)的開發(fā)框架。在Java世界,Spring Boot帶給廣大開發(fā)者的是更加簡(jiǎn)化的工作流程,以及更高的開發(fā)效率。這也是Spring出色的地方,彌補(bǔ)了Java在簡(jiǎn)化工作上的空白,讓開發(fā)者開發(fā)者避免了大量的重復(fù)工作。SpringCloud則降低了建立分布式系統(tǒng)的復(fù)雜度,Spring的忠實(shí)熱愛者可以充分享受軟件復(fù)利效應(yīng)帶來的福利。

          可移植性優(yōu)先

          可移植性在軟件工程中的重要性無論怎么強(qiáng)調(diào)都不過分,因?yàn)檫@個(gè)哲學(xué)正是UNIX操作系統(tǒng)能夠成為“常青樹”的秘訣。在UNIX環(huán)境下,Shell腳本具備更好的可移植性,Shell腳本通常由多個(gè)UNIX命令組成,Shell可執(zhí)行文件間接由UNIX命令解釋器解釋執(zhí)行。如果你對(duì)效率要求不高,可以盡量使用Shell腳本執(zhí)行,Shell腳本語法簡(jiǎn)單、使用方便、運(yùn)行之前不需要編譯、具備很強(qiáng)的文本處理能力,開發(fā)效率也比較高。

          但是Shell歸根結(jié)底還是一種弱類型語言,沒有嚴(yán)格的數(shù)據(jù)類型檢查。Shell的缺點(diǎn)是I/O性能不高,同時(shí)因?yàn)槭墙忉屝哉Z言,對(duì)于值計(jì)算類型的問題也沒有很好的支持。如果你想讓程序具有更好的可移植性,可以選擇具備跨平臺(tái)能力的編程語言。Java便是一種跨平臺(tái)語言,基于JVM虛擬機(jī)平臺(tái),Java制定了字節(jié)碼執(zhí)行引擎規(guī)范,可以滿足程序的可移植性要求。這也是Java語言發(fā)展這么多年依然具有強(qiáng)大生命力的重要原因。

          在微服務(wù)時(shí)代,容器的隔離性和可移植性可以說為軟件開發(fā)帶來了革命性的顛覆,Docker技術(shù)通過采用LXC虛擬化手段,利用Linux系統(tǒng)的Namespace和Cgroup技術(shù)確保了應(yīng)用程序與資源的隔離。Docker通過和各大廠商聯(lián)合發(fā)起OCI(開發(fā)容器標(biāo)準(zhǔn)),規(guī)范了應(yīng)用運(yùn)行時(shí)的容器鏡像標(biāo)準(zhǔn)。鏡像的打包、構(gòu)建、部署、命名過程都按照統(tǒng)一規(guī)范進(jìn)行,進(jìn)而標(biāo)準(zhǔn)化了底層運(yùn)行時(shí)支撐環(huán)境,這樣你就可以在統(tǒng)一的容器環(huán)境下靈活地交付、部署和移植代碼。通過采用Docker容器技術(shù),我們將不需要再關(guān)注操作系統(tǒng)的特殊性和差異性,可以更關(guān)注應(yīng)用程序本身,底層多余的環(huán)境因素可以通過容器提供的虛擬環(huán)境來屏蔽。

          也就是說,我們的微服務(wù)具備了更好的可移植性,真正做到了“一次構(gòu)建,隨處運(yùn)行”。

          小結(jié)

          本章我們了解什么是微服務(wù)、微服務(wù)架構(gòu)產(chǎn)生和發(fā)展的背景、云計(jì)算時(shí)代下微服務(wù)與云原生架構(gòu)的關(guān)系、微服務(wù)架構(gòu)的主要特性,及微服務(wù)架構(gòu)與UNIX設(shè)計(jì)哲學(xué)的內(nèi)在聯(lián)系。然而微服務(wù)架構(gòu)并不適用于所有場(chǎng)景,下一章將帶大家了解微服務(wù)的采用前提。

          本文給大家講解的內(nèi)容是微服務(wù)架構(gòu)深度解析:架構(gòu)設(shè)計(jì)哲學(xué)

          1. 下篇文章給大家講解的是微服務(wù)架構(gòu)深度解析:微服務(wù)的采用前提,微服務(wù)使用場(chǎng)景

          2. 覺得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;

          3. 感謝大家的支持!

          本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學(xué)習(xí)更多的話可以到微信公眾號(hào)里找我,我等你哦。

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕35页 | 曰韩欧美综合黄色 | 波多野吉衣在线观看视频918 | 性色国产成人久久久精品 | 最新国产在线 |