20年前,超越時代的應(yīng)用架構(gòu)設(shè)計之美
記得自己在2003年參與的項目,使用了JSP、Servlet、JavaBeans和JDBC所組合的最原始的Web應(yīng)用框架。
對于一位牛逼的資深級程序員來講,這種原始的應(yīng)用框架能寫出最整齊、簡潔與極致高性能的代碼。
但是軟件工程需要更多人參與進(jìn)來,原始的框架容易變得混亂,原因就在于太多純粹性的技術(shù)問題束縛了開發(fā)團隊,那么參與者越多,代碼堆積的熵增就越顯著,項目也逐漸陷入泥潭。
因此,各種Web架構(gòu)總是被頂尖的工程師們不斷更新迭代、推陳出新,引導(dǎo)工程師們?nèi)リP(guān)注業(yè)務(wù)本身,而非瑣碎的技術(shù)問題。
從這我們就能一窺應(yīng)用架構(gòu)設(shè)計不斷演進(jìn)的本質(zhì)——要讓開發(fā)者掙脫技術(shù)復(fù)雜性所帶來的枷鎖,尋求更為靈活的規(guī)則與約定的設(shè)計,實現(xiàn)有序與自由的最大兼顧。
開發(fā)者能靈活地應(yīng)對需求,專注于業(yè)務(wù)的構(gòu)建,擺脫復(fù)雜與混亂,這也是我們尋求自由之美的意義。
在那個年代,工程師們對科技生產(chǎn)力提升的嘗試遠(yuǎn)遠(yuǎn)超出了我們的想象,比較典型的例子就是EJB(Enterprise Java Beans)技術(shù)。
什么是EJB呢?封裝業(yè)務(wù)邏輯的組件,解放了開發(fā)者的生產(chǎn)力,使開發(fā)人員無須再操心數(shù)據(jù)庫訪問、分布式事務(wù)處理、安全性、多線程并發(fā)問題等瑣碎任務(wù)的編程技術(shù)。
這是在1998年提出了的架構(gòu)設(shè)計,這種技術(shù)目標(biāo)就算放到現(xiàn)在也一點都不過時。
EJB作為超越時代的分布式應(yīng)用架構(gòu)設(shè)計,在20年前就被廣泛應(yīng)用與嘗試,盡管它的嘗試最終失敗了,也催生出了更多偉大且流行的開源技術(shù)框架,例如:Spring框架生態(tài)。
但是我們重新翻看那一段歷史,只是為了去欣賞EJB的分布式架構(gòu)所帶來的自由之美,欽佩天才般的科學(xué)家和IT工程師們的創(chuàng)造力以及對于未知領(lǐng)域的勇敢嘗試。
如下圖1 - 1 EJB 3.x應(yīng)用架構(gòu)示例所示:
圖1 - 1 EJB 3.x應(yīng)用架構(gòu)示例
來自于我在2010年參與的一個電商項目,使用了分布式應(yīng)用架構(gòu)的部分應(yīng)用案例。
主要應(yīng)用EJB 3.0架構(gòu),部署在云端跨區(qū)域的兩臺Amazon EC2虛擬節(jié)點,分別管理著各自的Amazon RDS MySQL數(shù)據(jù)庫。
這種分布式架構(gòu)中,每個EJB業(yè)務(wù)組件都是獨立部署在一個上下文容器中運行,通過網(wǎng)絡(luò)互相通訊與協(xié)作,組件可在本地與遠(yuǎn)程復(fù)用,甚至實現(xiàn)了分布式事務(wù)。
對比原始框架,業(yè)務(wù)模塊被分布式組件化后,就遏制了工程無節(jié)制的代碼堆積,開發(fā)者不用去操心復(fù)雜的事務(wù)問題、實例管理問題和并發(fā)安全問題,就能極大提升團隊協(xié)作分工的組織效率。
這就是EJB利用分布式的組件化技術(shù),在尋求自由靈活的開發(fā)方式上,為開發(fā)者帶來了開山祖師般的全新體驗。
上圖中的EJB應(yīng)用架構(gòu)示例難道不夠優(yōu)雅嗎?
為什么最終還是無法成為行業(yè)主流而逐漸沒落呢?這其實是我們思考的關(guān)鍵。
EJB自身在部署方面的臃腫,分布式架構(gòu)的復(fù)雜性在當(dāng)時是非常重要的原因,但我認(rèn)為更關(guān)鍵的原因在于使用中間件服務(wù)造成的依賴性遠(yuǎn)大于后來居上的Spring框架生態(tài)。
開發(fā)者對這些中間件服務(wù)的依賴嚴(yán)重,實際上就加重了對自身的限制。
對于開發(fā)者來講,希望整個開發(fā)過程更為靈活與自由,這是一種近乎本能性的向往;同時希望團隊協(xié)作過程有序且清晰,這是社會分工的內(nèi)驅(qū)力。
自由與限制需要一種權(quán)衡,優(yōu)秀的平臺框架能通過精妙絕倫的技術(shù)設(shè)計,在兼顧兩者的情況下,側(cè)重開發(fā)自由,降低平臺限制,實現(xiàn)具有美感的開發(fā)方式,這對于我們都是至關(guān)重要的事情。
從這里我們就能看到一種流行的趨勢:Serverless(無服務(wù)器技術(shù)),本質(zhì)上就是在不斷解放開發(fā)者的生產(chǎn)力。
例如:亞馬遜云科技于2014年率先推出的事件驅(qū)動無服務(wù)器(event-driven serverless)計算服務(wù) Amazon Lambda.
開發(fā)者不必再操心服務(wù)器與后端基礎(chǔ)架構(gòu)的瑣碎技術(shù),而是借助觸發(fā)器、不同編程語言的功能函數(shù),專注于業(yè)務(wù)代碼的構(gòu)建。
在文件處理、實時流、Web應(yīng)用程序、物聯(lián)網(wǎng)IoT、移動應(yīng)用等各個關(guān)鍵領(lǐng)域,結(jié)合Amazon Lambda,可以構(gòu)建出伸縮性很強的基于Serverless的分布式應(yīng)用系統(tǒng)。
當(dāng)今微服務(wù)、分布式和容器技術(shù)的演進(jìn)融合之美
以Amazon為首,云計算平臺在IT基礎(chǔ)架構(gòu)中扮演著越來越重要的角色,工程師們主要談?wù)摰腤eb應(yīng)用架構(gòu)也逐步提升為云服務(wù)架構(gòu),這時候我們已經(jīng)進(jìn)入到了云時代。
傳統(tǒng)部署架構(gòu)逐漸被云平臺所替代,在云平臺之上則是更為輕量化的微服務(wù)架構(gòu)與容器化技術(shù),承載了主流的云應(yīng)用項目。
然而隨著互聯(lián)網(wǎng)用戶規(guī)模化,高并發(fā)、大規(guī)模數(shù)據(jù)所引發(fā)的問題往往會更致命,高可用、并行提升性能的需求愈發(fā)強烈。
另外,項目中軟件系統(tǒng)的開發(fā)規(guī)模也在不斷膨脹,單體架構(gòu)的工程化組織管理必然會隨著長期維護而走向臃腫與混亂。
面對這些難題,微服務(wù)架構(gòu)為開發(fā)者打開了一個更為適度、自由、靈活的新局面,并且在微服務(wù)項目具體實施的過程中,又與分布式架構(gòu)緊密結(jié)合在了一起。
微服務(wù)架構(gòu)的自由之美
前幾年,我曾負(fù)責(zé)互聯(lián)網(wǎng)醫(yī)療微服務(wù)平臺的架構(gòu)設(shè)計。
這個項目的特點在于將醫(yī)療信息化的肌體裝進(jìn)互聯(lián)網(wǎng)的外殼中,因此,醫(yī)療業(yè)務(wù)的復(fù)雜性與互聯(lián)網(wǎng)的技術(shù)平臺性需要同時兼容。
如下圖1 - 2 互聯(lián)網(wǎng)醫(yī)療微服務(wù)與分布式架構(gòu)示例所示:
圖1 - 2 互聯(lián)網(wǎng)醫(yī)療微服務(wù)與分布式架構(gòu)示例
網(wǎng)關(guān)與微服務(wù)之間、微服務(wù)與微服務(wù)之間、微服務(wù)與各個Amazon RDS數(shù)據(jù)分庫之間就形成了一種分布式的拓?fù)浣Y(jié)構(gòu),另外承載高并發(fā)的關(guān)鍵微服務(wù)也可以由多實例副本形成均衡負(fù)載。
微服務(wù)模型單元要比過去EJB模型單元更粗粒度,是以服務(wù)為基準(zhǔn)而非組件,這樣就給予了架構(gòu)師更為靈活的自由度。
按需劃分適合大小的服務(wù)粒度并進(jìn)行適當(dāng)?shù)姆植?,也就不會對開發(fā)者硬性規(guī)定底層需要依賴什么樣的服務(wù),這就保證了輸出的軟件具有平臺無關(guān)性。
微服務(wù)架構(gòu)之所以能形成如此強大的一股潮流,其原因就在于面對互聯(lián)網(wǎng)規(guī)?;臅r代,可以讓應(yīng)用架構(gòu)呈現(xiàn)出自由、靈活與開放的一面,同時又能對軟件易于混亂的特征分而治之。
這與我們前面所說的兼顧有序與自由的應(yīng)用架構(gòu)設(shè)計的本質(zhì)形成了很好的印證,它為開發(fā)者應(yīng)對客戶需求的軟件應(yīng)用設(shè)計,提供了一種自由的張力,這也是工程師們不斷追求自由之美的關(guān)鍵價值。
容器技術(shù)的靈活之美
軟件應(yīng)用架構(gòu)發(fā)展到了微服務(wù)這個階段看起來應(yīng)該很不錯,可是現(xiàn)在又面臨一個問題,微服務(wù)架構(gòu)必然需要用掉更多的計算資源,而且更適合于分布式架構(gòu)環(huán)境,在采用更多機器組成的分布式網(wǎng)絡(luò)節(jié)點的情況下,如何才能優(yōu)化計算資源的使用?
這時候容器化技術(shù)的價值與作用就體現(xiàn)出來了,例如:Docker引擎管理的容器作為操作系統(tǒng)上的一個進(jìn)程,保證了容器之間互不影響,并且可以針對容器的CPU、內(nèi)存等計算資源進(jìn)行預(yù)先分配,容器鏡像對程序的封裝讓發(fā)布過程簡單到一條命令就能正常運行。
這樣就極大簡化了服務(wù)在云服務(wù)器上的部署難度,提升了更高的效率,甚至我們可以同時部署多個版本的服務(wù),形成生產(chǎn)與測試環(huán)境的并存。
當(dāng)我們感受到容器技術(shù)帶來的自由與靈活,可是如何讓開發(fā)者忘卻容器管理引擎、分布式架構(gòu)部署的復(fù)雜性問題呢?
其實在上面的微服務(wù)案例中已經(jīng)給出了答案,整個微服務(wù)實例全部由早期Amazon EC2 + Docker容器引擎的部署模式,遷移到了Amazon ECS平臺之上。
通過Amazon Fargate實現(xiàn)了Serverless部署,不用考慮容器的分布式部署問題;在項目前期完全不需要考量計算資源的規(guī)劃問題,因為在業(yè)務(wù)不斷增長的情況下,Amazon ECS可以實現(xiàn)計算資源的動態(tài)伸縮,實在是太靈活了。
接下來我們就展開聊聊在云服務(wù)架構(gòu)環(huán)境下,Amazon ECS與Serverless技術(shù)為開發(fā)者擺脫底層環(huán)境束縛,到底帶來了哪些服務(wù)支撐。
Amazon云容器與Serverless技術(shù)的支撐之美
Amazon云容器的整體之美
當(dāng)我們擁有了微服務(wù)、分布式架構(gòu)與容器技術(shù),那么云廠商又為此提供了怎樣的支撐呢?
我還是比較看好Amazon領(lǐng)導(dǎo)的這種云服務(wù)理念,因為Amazon云技術(shù)正在朝著Serverless的方向進(jìn)行發(fā)展,尤其是充分利用了容器技術(shù)的出現(xiàn),加快了這一步伐。
前述案例中的Amazon ECS全稱是(Amazon Elastic Container Service),它是針對容器技術(shù)高度彈性的管理服務(wù)。
Amazon ECS希望用戶直接面對容器,而不是面對操作系統(tǒng),也就是說Amazon云平臺提供給用戶購買的計算單元粒度更細(xì)致了。
那么這又帶來了什么好處呢?
其實是兩方面:
優(yōu)勢一:我們沒必要就為了部署一個服務(wù),就得先占用一臺虛擬機OS,現(xiàn)在Amazon ECS給了一個新方案,部署維護一個Docker容器就夠了,它會自己維護計算資源的基礎(chǔ)設(shè)施。
由于資源占用少了,自然我們充值就少了;
優(yōu)勢二:現(xiàn)在的云服務(wù)大趨勢是分布式,這樣我們的應(yīng)用可以形成集群,以便增強系統(tǒng)高可靠性以及對服務(wù)性能的彈性伸縮管理。
Amazon ECS默認(rèn)提供的Serverless模式就讓開發(fā)者不再顧慮運行服務(wù)的集群分布問題。我們只考慮要上多少Docker容器,至于放置在什么地方,哪個機房,哪臺服務(wù)器,那都是Amazon ECS的Serverless技術(shù)考慮的事情。
那么我們就用一個整體上較低的綜合成本,實現(xiàn)了一個真正強大的面向服務(wù)的集群環(huán)境。
而Amazon的ECS、EFS 、EC2、ECR是什么關(guān)系呢?
如下圖1 - 3 Amazon ECS、EC2架構(gòu)體系示意圖所示:
圖1 - 3 Amazon ECS、EC2架構(gòu)體系示意圖
Amazon EC2是Amazon提供的虛擬機,它與Amazon ECS共享基礎(chǔ)設(shè)施,形成相互協(xié)作。
通過Amazon EFS就可以將Amazon ECS任務(wù)的容器目錄掛載到EFS上,那么Amazon EC2實例就可以通過網(wǎng)絡(luò)文件系統(tǒng)(NFS)掛載到本地目錄的方式,去訪問EFS中ECS容器的內(nèi)部文件。
Amazon ECR是Amazon提供的Registry倉庫,為Amazon ECS提供容器鏡像服務(wù),不僅使用方便,私密性也很好,而且比建立私有Registry倉庫的維護成本要低得多。
從上述架構(gòu)介紹中,我們就可以看到Amazon云平臺是系統(tǒng)化地提供了整套云容器化解決方案。
Amazon ECS的Serverless架構(gòu)之美
對于Amazon ECS的管理核心就是Amazon Fargate(Amazon的Serverless技術(shù)),它可以將Amazon ECS任務(wù)(本質(zhì)上就是容器實例)放置在集群的不同位置,形成高可靠的分布式系統(tǒng),至于服務(wù)到底放置在分布式網(wǎng)絡(luò)中的哪個計算節(jié)點之上,是不需要開發(fā)者操心的。
如下圖1 - 4 Amazon ECS和Fargate技術(shù)結(jié)構(gòu)體系示意圖所示:
圖1 - 4 Amazon ECS和Fargate技術(shù)結(jié)構(gòu)體系示意圖
我們只需要詳細(xì)地對容器任務(wù)和服務(wù)進(jìn)行配置描述,然后將配置提交給Amazon ECS。
Amazon Fargate會創(chuàng)建任務(wù)實例,每個任務(wù)都是獨立運行的一個服務(wù),每個服務(wù)并不獨占一臺計算節(jié)點資源,但又能通過資源配額的自動擴展來應(yīng)對更大的外部請求吞吐量。
另外針對Amazon ECS的應(yīng)用服務(wù)是基于界面配置,并不利于自動化發(fā)布運維服務(wù),Amazon又進(jìn)一步提供了命令模式的Amazon Copilot,進(jìn)一步實現(xiàn)完全自動化的CI/CD管道。
如下圖1 - 5 Copilot顯示服務(wù)狀態(tài)示例所示:
圖1 - 5 Copilot顯示服務(wù)狀態(tài)示例
我們可以通過終端命令:"copilot svc status",就能拿到"ecsdemo-frontend"這個容器服務(wù)的狀態(tài)信息,通過捕獲的狀態(tài)信息。
我們可以進(jìn)行程序級的二次分析,應(yīng)用在我們的日志、運維監(jiān)控等功能當(dāng)中。
因此Amazon ECS最大的優(yōu)勢還是在于提供了特別強大的圖形界面配置功能和命令運維的工具集合功能,不僅包括了Amazon Copilot,還有Amazon ECS CLI、Amazon CDK等。
這些功能可以通過非圖形界面的終端命令方式、編程的方式(TypeScrpit、JavaScrpit、Python、Java、C#) 更全面且細(xì)粒度的創(chuàng)建與維護Amazon ECS基礎(chǔ)設(shè)施,控制和優(yōu)化Amazon ECS集群與任務(wù)。
展望云服務(wù)架構(gòu)的未來
通過上述各章節(jié)的描述,我們可以看到應(yīng)用服務(wù)架構(gòu)的進(jìn)步,二十年前還需要重度依賴中間件及底層服務(wù),如今逐漸演進(jìn)到了Serverless的時代,這是無數(shù)工程師、開源社區(qū)以及像亞馬遜云科技(Amazon Web Services)這樣的商業(yè)公司所共同努力的成果。
那么我們暢想一下云服務(wù)架構(gòu)的未來,我認(rèn)為基于云平臺的Serverless架構(gòu)應(yīng)該會成為主流模式,Serverless會讓開發(fā)者更加關(guān)注業(yè)務(wù)本身,而非基礎(chǔ)設(shè)施與瑣碎的基礎(chǔ)技術(shù)。
但是對于開發(fā)者來講,Serverless的優(yōu)勢在于分布式計算資源的自動調(diào)度,但是分布式架構(gòu)的復(fù)雜特性又會讓很多開發(fā)者難以理解。
因此,云服務(wù)廠商必然會在這個方面的基礎(chǔ)設(shè)施層進(jìn)行發(fā)力,例如Amazon EKS就是在云環(huán)境下創(chuàng)建和運行K8s集群提供了整套解決方案,目標(biāo)就是讓開發(fā)者不用關(guān)注復(fù)雜的分布式問題。
我相信這種去分布式復(fù)雜化的基礎(chǔ)設(shè)施必將對應(yīng)用軟件架構(gòu)起到越來越重要的作用,也會變得越來越流行。
開發(fā)者可以在這樣的平臺之上,既能獲得更大的自由與靈活度,專注于自己的業(yè)務(wù)功能改善,又能充分利用分布式技術(shù)優(yōu)勢,讓更多的開發(fā)者在Serverless時代充分感受到自由之美。
報名開啟 | 自由構(gòu)建 探索無限
亞馬遜云科技2022 Dev Day 重磅來襲,不容錯過!
多位大咖現(xiàn)身說法
如何用充滿“技術(shù)美感”的方式
幫助開發(fā)者
實現(xiàn)更簡單、自由、高效的開發(fā)
此外,還有大量專家觀點碰撞
技術(shù)展、創(chuàng)新賽、動手實操等環(huán)節(jié)
精彩不斷,干貨滿滿
攜手大家一起“自由構(gòu)建,探索無限”
點擊 https://marketing.csdn.net/p/0556be2dd6345bd277eb660eed38f11c,發(fā)現(xiàn)更多美~