介 紹
今天的應(yīng)用程序可以說是分布式系統(tǒng)開發(fā)中的一項(xiàng)奇跡?;诓煌南到y(tǒng)架構(gòu),構(gòu)成應(yīng)用程序的每個(gè)功能或服務(wù)可能在不同的系統(tǒng)上執(zhí)行,而系統(tǒng)位于不同的地理位置,使用不同的計(jì)算機(jī)語(yǔ)言編寫。應(yīng)用程序的組件可能托管在一個(gè)功能強(qiáng)大的系統(tǒng)上,該系統(tǒng)由用戶自己攜帶,并且可以和世界各地的應(yīng)用程序組件或服務(wù)進(jìn)行通信(他們都是數(shù)據(jù)中心的副本)。
而令人驚訝的是,使用這些應(yīng)用程序的用戶通常并不會(huì)對(duì)復(fù)雜環(huán)境的請(qǐng)求作出響應(yīng)。這樣的請(qǐng)求包含了像本地時(shí)間、本地天氣或前往酒店的方向等等。
讓我們慢慢開始介紹,看看使這一切成為可能的工業(yè)魔法,并思考開發(fā)人員在處理這種復(fù)雜性時(shí)應(yīng)該牢記哪些思想和規(guī)則。
系統(tǒng)設(shè)計(jì)的演變史
從程序員編寫應(yīng)用程序,手工將它們編譯成他們正在使用的機(jī)器的語(yǔ)言,然后使用切換開關(guān)將單個(gè)機(jī)器指令和數(shù)據(jù)直接輸入到計(jì)算機(jī)的內(nèi)存開始,應(yīng)用程序開發(fā)已經(jīng)走過了漫長(zhǎng)的道路。
隨著處理器越來越強(qiáng)大,系統(tǒng)內(nèi)存和在線存儲(chǔ)容量增加,計(jì)算機(jī)網(wǎng)絡(luò)能力顯著增強(qiáng),開發(fā)方法也產(chǎn)生了變化?,F(xiàn)在,數(shù)據(jù)可以從地球的一段傳遞到另一端,而速度比早期電腦將數(shù)據(jù)從系統(tǒng)內(nèi)存轉(zhuǎn)移到處理器本身的速度還要快!
讓我們看看這一驚人轉(zhuǎn)變中的一些亮點(diǎn)。
單體設(shè)計(jì)
早期的計(jì)算機(jī)程序都是基于單體設(shè)計(jì)的,所有的應(yīng)用程序組件都被設(shè)計(jì)成在一臺(tái)機(jī)器上執(zhí)行。這意味著像用戶界面(如果用戶實(shí)際能與程序交互)、應(yīng)用程序處理規(guī)則、數(shù)據(jù)管理、存儲(chǔ)管理和網(wǎng)絡(luò)管理(如果計(jì)算機(jī)連接到計(jì)算機(jī)網(wǎng)路上)等功能都包含在了程序中。
這些雖然編寫起來簡(jiǎn)單,但這些程序會(huì)變得越來越復(fù)雜,越來越難以形成文檔,也難以更新和更改。這時(shí),機(jī)器本身對(duì)企業(yè)來說就成了最大的開銷,因此應(yīng)用程序的設(shè)計(jì)是為了盡最大可能使用機(jī)器。
客戶端/服務(wù)器架構(gòu)
隨著處理器越來越強(qiáng)大,系統(tǒng)和在線存儲(chǔ)容量增加,數(shù)據(jù)通信更快、更經(jīng)濟(jì),應(yīng)用程序的設(shè)計(jì)也隨之發(fā)展,以適應(yīng)發(fā)展的速度。應(yīng)用程序邏輯被重構(gòu)或分解,允許每個(gè)應(yīng)用程序在不同的機(jī)器上執(zhí)行,并且在組件之間插入了不斷改進(jìn)的網(wǎng)絡(luò)。這使得一些特性可以遷移到當(dāng)前可用的成本最低的計(jì)算環(huán)境中。這一演變經(jīng)歷了一下幾個(gè)階段:
終端和終端模擬
早期的分布式計(jì)算依賴于特別用途的用戶訪問設(shè)備——終端。應(yīng)用程序必須理解它們使用的通信協(xié)議,并直接向設(shè)備發(fā)出命令。當(dāng)廉價(jià)的個(gè)人計(jì)算機(jī)(PC)出現(xiàn)時(shí),終端被運(yùn)行終端模擬程序的PC所取代。
此時(shí),應(yīng)用程序的所有組件仍然駐留在單個(gè)大型機(jī)或小型計(jì)算機(jī)上
輕量客戶端
隨著PC的功能越來越強(qiáng)大,支持更大的內(nèi)部和在線存儲(chǔ),網(wǎng)絡(luò)性能進(jìn)一步提高,企業(yè)對(duì)其應(yīng)用程序進(jìn)行了細(xì)分或分解,以便在本地PC上提取和執(zhí)行用戶界面。應(yīng)用程序的其余部分則繼續(xù)在數(shù)據(jù)中心的系統(tǒng)上執(zhí)行。
這些PC通常比它們所替代的終端便宜,并且它們還有額外的優(yōu)點(diǎn)。這些PC是多功能設(shè)備,它們可以運(yùn)行在它們所替換的終端上無法運(yùn)行的、卻能提高辦公效率的應(yīng)用程序。這種組合促使企業(yè)在更新或刷新應(yīng)用程序時(shí),開始傾向于客戶端/服務(wù)器應(yīng)用體系結(jié)構(gòu)。
中型客戶端
PC的發(fā)展仍在快速進(jìn)行。一旦出現(xiàn)了更強(qiáng)大、存儲(chǔ)容量更大的系統(tǒng),企業(yè)就會(huì)使用它們,將更多的處理操作從數(shù)據(jù)中心昂貴的系統(tǒng)遷移到便宜的用戶辦公桌上。這時(shí),用戶界面和一些計(jì)算任務(wù)就遷移到了本地的PC上。
這樣大型機(jī)和小型計(jì)算機(jī)(現(xiàn)在成為服務(wù)器)就有了更長(zhǎng)的使用壽命,從而降低了企業(yè)總體的計(jì)算成本。
重型客戶端
隨著PC變得越來越強(qiáng)大,更多的應(yīng)用程序度可以從后端服務(wù)器遷移過來。在這里,除了數(shù)據(jù)和存儲(chǔ)管理功能之外的所有功能都已遷移。
進(jìn)入互聯(lián)網(wǎng)和萬維網(wǎng)
這時(shí),公共互聯(lián)網(wǎng)和萬維網(wǎng)出現(xiàn)了??蛻舳?服務(wù)器計(jì)算的方式仍然在使用。為了降低總體成本,一些企業(yè)開始重新架構(gòu)它們的分布式應(yīng)用程序,便于使用標(biāo)準(zhǔn)的internet協(xié)議進(jìn)行通信,并使用Web瀏覽器代替之前定制的用戶界面功能。后來,一些應(yīng)用程序的特性通過Javascript語(yǔ)言重新編寫,這樣它們就可以在客戶端的計(jì)算機(jī)上本地執(zhí)行。
服務(wù)器的改進(jìn)
行業(yè)創(chuàng)新并不僅僅關(guān)注客戶端側(cè)的通信鏈路,對(duì)服務(wù)器也做了很大的改進(jìn)。企業(yè)開始利用許多更小、更便宜的符合行業(yè)標(biāo)準(zhǔn)的服務(wù)器,通過它們強(qiáng)大的功能來支持部分或者全部原來基于大型機(jī)的功能。這樣它們可以減少需要部署的昂貴主機(jī)系統(tǒng)的數(shù)量。
接著,遠(yuǎn)程PC就可以和許多服務(wù)器通信,每個(gè)服務(wù)器都支持自己的應(yīng)用程序組件。在此環(huán)境中使用了專用的數(shù)據(jù)庫(kù)和文件服務(wù)器。之后,再將其他應(yīng)用程序功能遷移到應(yīng)用程序服務(wù)器。
網(wǎng)絡(luò)是另一個(gè)業(yè)界高度關(guān)注的領(lǐng)域。企業(yè)開始使用提供防火墻以及其他安全功能的專用網(wǎng)絡(luò)服務(wù)器、文件緩存功能來加速應(yīng)用程序的數(shù)據(jù)訪問,電子郵件服務(wù)器、web服務(wù)器、web應(yīng)用程序服務(wù)器、分布式命名服務(wù)器這些服務(wù)器跟蹤和控制用戶憑證,用于訪問數(shù)據(jù)和應(yīng)用程序。封裝在設(shè)備服務(wù)器中的網(wǎng)絡(luò)服務(wù)列表一直在增長(zhǎng)。
基于對(duì)象的開發(fā)
PC和服務(wù)器功能的快速變化,加上處理能力、內(nèi)存和網(wǎng)絡(luò)這三者的價(jià)格的大幅下降,這些都對(duì)應(yīng)用程序開發(fā)產(chǎn)生了重大影響。IT領(lǐng)域中最大的成本開銷不再是硬件和軟件,而是變成了通信、IT服務(wù)(員工)、電力以及冷卻系統(tǒng)。
軟件開發(fā)、軟件維護(hù)和IT操作出現(xiàn)了新的重要性,開發(fā)過程也發(fā)生了變化以迎合新的形勢(shì),即系統(tǒng)便宜,而人員、通信和電力越來越貴。
企業(yè)希望通過改進(jìn)數(shù)據(jù)和應(yīng)用程序架構(gòu)來充分發(fā)揮員工的價(jià)值。其結(jié)果就是面向?qū)ο蟮膽?yīng)用程序和開發(fā)方法。許多編程語(yǔ)言,例如下面的語(yǔ)言,都支持這種方式:
C++、C#、COBOL、Java、PHP、Python、Ruby
在定義和記錄數(shù)據(jù)結(jié)構(gòu)時(shí),應(yīng)用程序開發(fā)者的編寫變得更加系統(tǒng)化來適應(yīng)變化。這種方式還使得維護(hù)和改進(jìn)應(yīng)用程序更加容易。
開源軟件
Opensource.com為開源軟件提供了以下定義:“開源軟件是帶有源代碼的軟件,任何人都可以檢查、修改和增強(qiáng)代碼。”“而有些軟件的源代碼只有創(chuàng)建它的個(gè)人、團(tuán)隊(duì)或組織才能修改——并且保有對(duì)它的獨(dú)占控制。人們稱這種軟件為‘專有’或‘閉源’軟件。”
只有專有軟件的原始作者才能合法地復(fù)制、檢查和修改該軟件。為了使用專有軟件,計(jì)算機(jī)用戶必須同意(通常通過接受首次運(yùn)行該軟件時(shí)顯示的許可證),如果軟件作者沒有明確允許的話,他們不會(huì)對(duì)軟件做任何的修改。微軟Office和Adobe Photoshop都是專有軟件的例子。
雖然開源軟件在計(jì)算機(jī)早期就已經(jīng)存在,但直到20世紀(jì)90年代,當(dāng)完整的開源操作系統(tǒng)、虛擬化技術(shù)、開發(fā)工具、數(shù)據(jù)庫(kù)引擎和其他重要功能出現(xiàn)時(shí),它才走到了前臺(tái)。開源技術(shù)通常是基于web和分布式計(jì)算的關(guān)鍵組件。其中,以下類別的開源軟件很受歡迎:
開發(fā)工具
應(yīng)用支持
數(shù)據(jù)庫(kù)(flat文件,SQL,No-SQL,以及內(nèi)存)
分布式文件系統(tǒng)
消息傳輸/隊(duì)列
操作系統(tǒng)
聚類
分布式計(jì)算
強(qiáng)大的系統(tǒng)、快速的網(wǎng)絡(luò)以及復(fù)雜軟件可用性的結(jié)合,已經(jīng)將主要的應(yīng)用程序開發(fā)從單一轉(zhuǎn)向了更加分布式的形式。然而企業(yè)已經(jīng)意識(shí)到,有時(shí)候從頭開始比嘗試重構(gòu)或分解舊的應(yīng)用程序要更好。
當(dāng)企業(yè)進(jìn)行創(chuàng)建分布式應(yīng)用程序的工作時(shí),常常會(huì)發(fā)現(xiàn)一些有趣的副產(chǎn)品。一個(gè)設(shè)計(jì)得當(dāng)?shù)膽?yīng)用程序,它已經(jīng)分解成單獨(dú)的功能或服務(wù),可以由單獨(dú)的團(tuán)隊(duì)并行開發(fā)。
快速應(yīng)用程序開發(fā)和部署(也稱為DevOps)就是一種利用新環(huán)境的方法。
面向服務(wù)的架構(gòu)
隨著行業(yè)從客戶端/服務(wù)器的計(jì)算模式,發(fā)展到更加分布式的方法,“面向服務(wù)的架構(gòu)”一詞出現(xiàn)了。這種方法基于分布式系統(tǒng)的概念、消息隊(duì)列和交付中的標(biāo)準(zhǔn),以及將XML消息傳遞作為共享數(shù)據(jù)和數(shù)據(jù)定義的標(biāo)準(zhǔn)方法。
各個(gè)應(yīng)用程序的功能被打包成面向網(wǎng)絡(luò)的服務(wù),這些服務(wù)接收一條消息,請(qǐng)求它們執(zhí)行特定的服務(wù),在它們執(zhí)行服務(wù)之后,將響應(yīng)發(fā)送回請(qǐng)求該服務(wù)的函數(shù)。
這種方法還提供了另一個(gè)好處,即可以將給定的服務(wù)托管在網(wǎng)絡(luò)的多個(gè)位置。這既提高了整體性能,又增強(qiáng)了可靠性。
除此之外,現(xiàn)在還有很多工作負(fù)載管理工具,它用于接收服務(wù)請(qǐng)求、檢查可用容量、將請(qǐng)求轉(zhuǎn)發(fā)給具有最大可用容量的服務(wù),然后將響應(yīng)發(fā)送回請(qǐng)求者。如果特定的服務(wù)器沒有及時(shí)響應(yīng),工作負(fù)載管理器會(huì)簡(jiǎn)單地向服務(wù)轉(zhuǎn)發(fā)另一個(gè)實(shí)例。它還會(huì)將沒有響應(yīng)的服務(wù)標(biāo)記為失敗,并且在它收到一條表明服務(wù)仍在運(yùn)行的消息之前,不會(huì)向它發(fā)送額外的請(qǐng)求。
設(shè)計(jì)分布式系統(tǒng)的重要考慮因素
現(xiàn)在我們已經(jīng)走過了50多年的計(jì)算機(jī)歷史,下面讓我們來看看分布式系統(tǒng)開發(fā)人員的一些經(jīng)驗(yàn)法則。需要考慮的東西很多,因?yàn)榉植际浇鉀Q方案可能有組件和服務(wù)在許多地方、不同類型的系統(tǒng)中運(yùn)行,而且必須來回傳遞消息才能執(zhí)行工作。要想成功創(chuàng)建這些解決方案,謹(jǐn)慎思考是必須的。除此之外還必須為所使用的每種主機(jī)系統(tǒng)、開發(fā)工具和消息傳遞系統(tǒng)提供專門的知識(shí)。
確定需要做什么
我們首先要考慮的事情,是我們究竟需要完成什么。雖然這聽起來很簡(jiǎn)單,但卻非常重要。
令人驚訝的是,許多開發(fā)人員在知道具體需要什么之前就開始構(gòu)建東西。通常情況下,這意味著他們構(gòu)建了不必要的功能,浪費(fèi)了時(shí)間。引用Yogi Berra的話就是:“如果你不知道自己要去哪里,你最終會(huì)去往別的地方”。
首先需要知道要做什么,已經(jīng)有哪些工具和服務(wù)可用,以及使用最終解決方案的人應(yīng)該看到什么。
交互和批處理
快速響應(yīng)和低延遲常常是我們的需求,因此比較明智的做法是考慮在用戶等待時(shí)應(yīng)該做什么,以及可以將什么放入批處理過程中,而這些批處理執(zhí)行在事件驅(qū)動(dòng)或時(shí)間驅(qū)動(dòng)的計(jì)劃中。
在考慮了功能的初始分割之后,比較好的做法是計(jì)劃何時(shí)需要執(zhí)行后臺(tái)、批處理進(jìn)程、這些功能操作哪些數(shù)據(jù)、以及如何確保這些功能是可靠的、何時(shí)可用以及如何防止數(shù)據(jù)丟失。
功能應(yīng)該托管在哪里
只有在詳細(xì)計(jì)劃了“完成什么”之后,才應(yīng)該考慮“在哪里”以及“如何做”。開發(fā)人員有各自最喜歡的工具和方法,并且經(jīng)常會(huì)調(diào)用它們,即使可能不是最佳的選擇。Bernard Baruch說過:“如果你只有一把錘子,那么所有東西看起來都像釘子”。
了解企業(yè)開發(fā)的企業(yè)標(biāo)準(zhǔn)也很重要。僅僅因?yàn)楣ぞ吣壳昂芰餍芯瓦x擇它是不明智的。這個(gè)工具可以完成這些工作,但是需要記住的是,它構(gòu)建的所有東西都需要維護(hù)。如果你構(gòu)建了一些只有自己才能理解或者維護(hù)的東西,那么在你職業(yè)生涯的剩下時(shí)間中,你可能已經(jīng)把自己束縛在這一功能上了。我自己也有過這種經(jīng)歷,自認(rèn)為自己創(chuàng)建的功能工作正常、輕量而且可靠。但在我離開那家公司后的十年里,我不斷地收到關(guān)于這些功能的電話,因?yàn)楹髞淼拈_發(fā)人員無法理解這些功能是如何實(shí)現(xiàn)的,而我寫的文件又早就被丟掉了。
在分布式解決方案中,每個(gè)功能或服務(wù)都應(yīng)該分別考慮。該功能應(yīng)該在企業(yè)數(shù)據(jù)中心?還是使用云服務(wù)提供商?還是兩者兼有?另外還要考慮到在某些行業(yè)中存在法規(guī)要求,這些要求指導(dǎo)我們選擇需要在何處以及如何維護(hù)和存儲(chǔ)數(shù)據(jù)。
其他需要考慮的東西還包括:
該功能的主機(jī)應(yīng)該是什么類型的系統(tǒng)。有沒有系統(tǒng)架構(gòu)更合適該功能?系統(tǒng)應(yīng)該基于ARM、x86、SPARC、Precision、Power,還是大型機(jī)?
會(huì)有某種特定的操作系統(tǒng)為該功能提供了更好的計(jì)算環(huán)境嗎?Linux、Windows、UNIX、System I,或是System Z會(huì)是更好的平臺(tái)嗎?
某特定的開發(fā)語(yǔ)言是否更適合該功能?它是一種特定類型的數(shù)據(jù)管理工具嗎?該用Flat文件、SQL數(shù)據(jù)庫(kù)還是No-SQL數(shù)據(jù)庫(kù)?還是說非結(jié)構(gòu)化的存儲(chǔ)機(jī)制更好?
功能應(yīng)該托管在虛擬機(jī)中還是容器中,方便遷移、自動(dòng)化以及編排嗎?
在本世紀(jì)初,運(yùn)行Windows或Linux虛擬機(jī)往往是首選。雖然它們?yōu)榉椒ㄌ峁┝酥匾母綦x,并且在必要時(shí)很容易重啟或移動(dòng)他們,但是他們的處理、內(nèi)存以及存儲(chǔ)要求相當(dāng)高。容器是處理虛擬化的另一種方式,它提供了類似的隔離級(jí)別,能夠重新啟動(dòng)和遷移方法,而且消耗的處理能力、內(nèi)存或存儲(chǔ)都要小得多。
性能
性能是另一個(gè)重要的考慮因素。在定義組成解決方案的功能或服務(wù)時(shí),開發(fā)人員應(yīng)該注意它們是否有重要處理、內(nèi)存或存儲(chǔ)需求。仔細(xì)研究這些問題非常重要,這樣才能知道是否可以進(jìn)一步細(xì)分或分解這些功能。
進(jìn)一步的分割會(huì)允許并行處理的增加,這樣能很大可能地提供性能上的改進(jìn)。當(dāng)然,這樣做的代價(jià)是,它也增加了復(fù)雜性,可能會(huì)更加難以管理和保證安全。
可靠性
在高風(fēng)險(xiǎn)的企業(yè)環(huán)境中,解決方案的可靠性至關(guān)重要。開發(fā)人員必須考慮何時(shí)可以要求人們重新輸入數(shù)據(jù)、重新運(yùn)行功能,或者何時(shí)功能將不可用。
數(shù)據(jù)庫(kù)開發(fā)人員在20世紀(jì)60年代就遇到了這個(gè)問題,并開發(fā)了原子功能的概念。也就是說,功能必須完成或者部分的更新必須回滾,以使得數(shù)據(jù)處于功能開始前的狀態(tài)。分布式系統(tǒng)也需要這種思維方式,確保即使在出現(xiàn)服務(wù)故障和事物中斷的情況下也能保證數(shù)據(jù)完整性。
例如,在關(guān)鍵消息傳遞系統(tǒng)中,在確認(rèn)消息已經(jīng)被接收方收到之前,消息必須被一直存儲(chǔ)好。如果消息沒能成功收到,則必須重新發(fā)送原始消息,并向系統(tǒng)管理報(bào)告故障。
可管理性
盡管沒有核心應(yīng)用程序功能那么有趣,但可管理性仍然是保證應(yīng)用程序正常運(yùn)轉(zhuǎn)的關(guān)鍵因素。所有分布式功能都必須得到充分的檢測(cè),讓管理員了解每個(gè)功能的當(dāng)前狀態(tài),并在需要時(shí)更改功能的參數(shù)。畢竟,分布式系統(tǒng)是由比它們所替代的單片系統(tǒng)更多的活動(dòng)部件組成的。開發(fā)人員必須時(shí)刻注意讓這個(gè)分布式計(jì)算環(huán)境易于使用和維護(hù)。
這給我們帶來了一個(gè)絕對(duì)的要求,即必須對(duì)所有分布式功能進(jìn)行充分的工具化,讓管理員了解到它們的當(dāng)前狀態(tài)。畢竟,分布式系統(tǒng)本質(zhì)上比它們所替代的單片系統(tǒng)更加復(fù)雜,并且有更多的活動(dòng)部件。
安全性
確保分布式系統(tǒng)安全性,比單片環(huán)境中安全問題的難度高了一個(gè)數(shù)量級(jí)。每個(gè)功能都必須單獨(dú)保密,功能之間的通信連接也必須保密。隨著網(wǎng)絡(luò)規(guī)模和復(fù)雜性的增長(zhǎng),開發(fā)人員必須考慮如何控制對(duì)功能的訪問,如何確保只有授權(quán)用戶才能訪問這些功能,以及如何將服務(wù)與其他服務(wù)隔離開來。
安全性是一個(gè)關(guān)鍵元素,必須添加到每個(gè)功能中而不是之后才加入。必須避免和匯報(bào)對(duì)功能和數(shù)據(jù)的未經(jīng)授權(quán)訪問。
隱私性
關(guān)于隱私性的話題有越來越多的規(guī)范。對(duì)與每個(gè)面向客戶系統(tǒng)的開發(fā)人員來說,歐盟的GDPR以及美國(guó)的HIPPA法規(guī)都是重要的考慮因素。
掌控復(fù)雜性
開發(fā)人員必須花時(shí)間考慮如何將復(fù)雜計(jì)算環(huán)境中全部的內(nèi)容組合在一起。服務(wù)應(yīng)該被封裝成一個(gè)單一的功能 ,或者少量緊密相關(guān)的功能,想要維護(hù)這樣的規(guī)則非常困難。如果一個(gè)功能在多個(gè)地方實(shí)現(xiàn),那么想要維護(hù)和更新就會(huì)很困難。當(dāng)一個(gè)功能的實(shí)例沒有更新會(huì)怎樣?這個(gè)問題非常具有挑戰(zhàn)性。
這就意味著,對(duì)于復(fù)雜應(yīng)用程序的開發(fā)人員來說,維護(hù)一個(gè)用于顯示每個(gè)功能所在位置的可視化模型就非常有用了,這樣,如果規(guī)則或業(yè)務(wù)需求發(fā)生變化,就可以對(duì)其進(jìn)行更新。
通常情況下,開發(fā)人員就必須花時(shí)間記錄他們做了什么,什么時(shí)候做了更改,以及這些更改的目的是什么,這樣其他人員就不必為了了解一個(gè)功能在哪里或者它是如何工作的而費(fèi)心思去理解成堆的代碼。
要成為分布式系統(tǒng)的架構(gòu)師,開發(fā)人員就必須要掌握復(fù)雜性。
開發(fā)人員必須掌握的方法
開發(fā)人員必須掌握分解和重構(gòu)應(yīng)用程序體系結(jié)構(gòu),從團(tuán)隊(duì)的角度思考問題,并提高他們?cè)诳焖賾?yīng)用程序開發(fā)和部署(DevOps)方法方面的技能。畢竟,他們必須能夠系統(tǒng)地思考哪些功能彼此獨(dú)立,哪些功能依賴于其他功能的輸出來工作。依賴于其他功能的這部分功能最好作為單個(gè)服務(wù)來實(shí)現(xiàn)。將它們作為獨(dú)立的功能實(shí)現(xiàn),可能會(huì)產(chǎn)生不必要的復(fù)雜性,導(dǎo)致應(yīng)用程序性能低下,并且給網(wǎng)絡(luò)帶來不必要的負(fù)擔(dān)。
虛擬化技術(shù)涵蓋了許多基礎(chǔ)
虛擬化是一個(gè)比虛擬機(jī)軟件或容器更大的類別。這兩個(gè)功能都被認(rèn)為是虛擬化技術(shù)。在目前的應(yīng)用程序中,至少有7種不同類型的虛擬化技術(shù)在使用。虛擬化技術(shù)可用于增強(qiáng)用戶訪問應(yīng)用程序的方式、應(yīng)用程序在何處以及如何執(zhí)行、處理在何處以及如何執(zhí)行、網(wǎng)絡(luò)功能怎么樣、數(shù)據(jù)在哪里以及如何存儲(chǔ)、安全性如何實(shí)現(xiàn)以及管理功能如何實(shí)現(xiàn)。下面的虛擬化技術(shù)模型可能有助于開發(fā)人員理解虛擬化的概念。
圖3:虛擬化系統(tǒng)的架構(gòu)
來源:7層虛擬化模型,VirtualizationReview.com
從軟件定義的解決方案角度考慮
對(duì)于開發(fā)人員來說,從“軟件定義的”解決方案的角度來考慮也是非常重要的。這也就是說,將控制從實(shí)際的處理中分割出來,這樣功能就可以被自動(dòng)化以及編排了。
有哪些工具和策略可供使用
當(dāng)開發(fā)人員步入這個(gè)復(fù)雜的世界時(shí),他們不應(yīng)該覺得自己是獨(dú)立的。供應(yīng)商和開源社區(qū)提供了許多強(qiáng)大的工具。各種形式的虛擬化技術(shù)都可以成為開發(fā)人員最好的朋友。
虛擬化技術(shù)是你最好的朋友
容器讓輕松地開發(fā)功能成為可能,這些功能可以在不互相干擾的情況下執(zhí)行,并且可以根據(jù)工作負(fù)載需求從一個(gè)系統(tǒng)遷移到另一個(gè)系統(tǒng)。
編排技術(shù)讓控制多個(gè)功能成為可能,確保它們運(yùn)行良好且可靠。它還可以在失敗的情況下重啟或移動(dòng)它們。
支持增量開發(fā):功能可以并行開發(fā),并在準(zhǔn)備好時(shí)部署。它們還可以用新特性進(jìn)行更新,而不需要在其他地方進(jìn)行更改。
支持高度分布式系統(tǒng):既可以在企業(yè)數(shù)據(jù)中心本地部署功能,也可以在云服務(wù)提供商的數(shù)據(jù)中心遠(yuǎn)程部署功能。
從服務(wù)的角度考慮
這意味著開發(fā)人員必須考慮服務(wù)以及服務(wù)之間如何通信。
定義良好的API
定義良好的API可以讓多個(gè)團(tuán)隊(duì)更好地協(xié)同工作,并且確保一切都能按照計(jì)劃組合在一起。通常情況下這意味著要做更多的前期工作,但最終是非常值得的。為什么?因?yàn)檎w開發(fā)可以更快。而且它還可以減少文檔工作的工作量。
支持快速應(yīng)用程序開發(fā)
這種方法對(duì)于快速應(yīng)用程序開發(fā)和快速原型開發(fā)(即DevOps)來說也是完美的。如果執(zhí)行得當(dāng),DevOps還可以只需很短的部署時(shí)間。
從標(biāo)準(zhǔn)的角度思考
分布式系統(tǒng)的開發(fā)人員應(yīng)該充分考慮多供應(yīng)商的國(guó)際標(biāo)準(zhǔn),而不是單單依賴于一個(gè)供應(yīng)商。這種方法避免了廠商的鎖定,并且可以找到在不同領(lǐng)域最出彩的那個(gè)供應(yīng)商。
總 結(jié)
值得注意的一點(diǎn)是,快速應(yīng)用程序開發(fā)和分布式系統(tǒng)部署的指南,是從“慢慢來”開始的。最明智的做法就是先計(jì)劃好你要去哪里,你要做什么,否則你很可能最終沒能達(dá)成目標(biāo)、開發(fā)預(yù)算耗盡并且毫無成果。