自由之美——工程師們不斷推動下的雲服務架構

csdn 發佈 2022-09-29T23:49:26.250139+00:00

20年前,超越時代的應用架構設計之美。記得自己在2003年參與的項目,使用了JSP、Servlet、JavaBeans和JDBC所組合的最原始的Web應用框架。

點擊 >>2022亞馬遜雲科技中國峰會

20年前,超越時代的應用架構設計之美

記得自己在2003年參與的項目,使用了JSP、Servlet、JavaBeans和JDBC所組合的最原始的Web應用框架。

對於一位牛逼的資深級程式設計師來講,這種原始的應用框架能寫出最整齊、簡潔與極致高性能的代碼。

但是軟體工程需要更多人參與進來,原始的框架容易變得混亂,原因就在於太多純粹性的技術問題束縛了開發團隊,那麼參與者越多,代碼堆積的熵增就越顯著,項目也逐漸陷入泥潭。

因此,各種Web架構總是被頂尖的工程師們不斷更新疊代、推陳出新,引導工程師們去關注業務本身,而非瑣碎的技術問題。

從這我們就能一窺應用架構設計不斷演進的本質——要讓開發者掙脫技術複雜性所帶來的枷鎖,尋求更為靈活的規則與約定的設計,實現有序與自由的最大兼顧。

開發者能靈活地應對需求,專注於業務的構建,擺脫複雜與混亂,這也是我們尋求自由之美的意義。

在那個年代,工程師們對科技生產力提升的嘗試遠遠超出了我們的想像,比較典型的例子就是EJB(Enterprise Java Beans)技術。

什麼是EJB呢?封裝業務邏輯的組件,解放了開發者的生產力,使開發人員無須再操心資料庫訪問、分布式事務處理、安全性、多線程並發問題等瑣碎任務的編程技術。

這是在1998年提出了的架構設計,這種技術目標就算放到現在也一點都不過時。

EJB作為超越時代的分布式應用架構設計,在20年前就被廣泛應用與嘗試,儘管它的嘗試最終失敗了,也催生出了更多偉大且流行的開源技術框架,例如:Spring框架生態。

但是我們重新翻看那一段歷史,只是為了去欣賞EJB的分布式架構所帶來的自由之美,欽佩天才般的科學家和IT工程師們的創造力以及對於未知領域的勇敢嘗試。

如下圖1 EJB 3.x應用架構示例所示:

來自於我在2010年參與的一個電商項目,使用了分布式應用架構的部分應用案例。

主要應用EJB 3.0架構,部署在雲端跨區域的兩台Amazon EC2虛擬節點,分別管理著各自的Amazon RDS MySQL資料庫。

這種分布式架構中,每個EJB業務組件都是獨立部署在一個上下文容器中運行,通過網絡互相通訊與協作,組件可在本地與遠程復用,甚至實現了分布式事務。

對比原始框架,業務模塊被分布式組件化後,就遏制了工程無節制的代碼堆積,開發者不用去操心複雜的事務問題、實例管理問題和並發安全問題,就能極大提升團隊協作分工的組織效率。

這就是EJB利用分布式的組件化技術,在尋求自由靈活的開發方式上,為開發者帶來了開山祖師般的全新體驗。

上圖中的EJB應用架構示例難道不夠優雅嗎?

為什麼最終還是無法成為行業主流而逐漸沒落呢?這其實是我們思考的關鍵。

EJB自身在部署方面的臃腫,分布式架構的複雜性在當時是非常重要的原因,但我認為更關鍵的原因在於使用中間件服務造成的依賴性遠大於後來居上的Spring框架生態。

開發者對這些中間件服務的依賴嚴重,實際上就加重了對自身的限制。

對於開發者來講,希望整個開發過程更為靈活與自由,這是一種近乎本能性的嚮往;同時希望團隊協作過程有序且清晰,這是社會分工的內驅力。

自由與限制需要一種權衡,優秀的平台框架能通過精妙絕倫的技術設計,在兼顧兩者的情況下,側重開發自由,降低平台限制,實現具有美感的開發方式,這對於我們都是至關重要的事情。

從這裡我們就能看到一種流行的趨勢:Serverless(無伺服器技術),本質上就是在不斷解放開發者的生產力。

例如:亞馬遜雲科技於2014年率先推出的事件驅動無伺服器(event-driven serverless)計算服務 Amazon Lambda.

開發者不必再操心伺服器與後端基礎架構的瑣碎技術,而是藉助觸發器、不同程式語言的功能函數,專注於業務代碼的構建。

在文件處理、實時流、Web應用程式、物聯網IoT、移動應用等各個關鍵領域,結合Amazon Lambda,可以構建出伸縮性很強的基於Serverless的分布式應用系統。


當今微服務、分布式和容器技術的演進融合之美

以Amazon為首,雲計算平台在IT基礎架構中扮演著越來越重要的角色,工程師們主要談論的Web應用架構也逐步提升為雲服務架構,這時候我們已經進入到了雲時代。

傳統部署架構逐漸被雲平台所替代,在雲平台之上則是更為輕量化的微服務架構與容器化技術,承載了主流的雲應用項目。

然而隨著網際網路用戶規模化,高並發、大規模數據所引發的問題往往會更致命,高可用、並行提升性能的需求愈發強烈。

另外,項目中軟體系統的開發規模也在不斷膨脹,單體架構的工程化組織管理必然會隨著長期維護而走向臃腫與混亂。

面對這些難題,微服務架構為開發者打開了一個更為適度、自由、靈活的新局面,並且在微服務項目具體實施的過程中,又與分布式架構緊密結合在了一起。

微服務架構的自由之美

前幾年,我曾負責網際網路醫療微服務平台的架構設計。

這個項目的特點在於將醫療信息化的肌體裝進網際網路的外殼中,因此,醫療業務的複雜性與網際網路的技術平台性需要同時兼容。

如下圖2 網際網路醫療微服務與分布式架構示例所示:

網關與微服務之間、微服務與微服務之間、微服務與各個Amazon RDS數據分庫之間就形成了一種分布式的拓撲結構,另外承載高並發的關鍵微服務也可以由多實例副本形成均衡負載。

微服務模型單元要比過去EJB模型單元更粗粒度,是以服務為基準而非組件,這樣就給予了架構師更為靈活的自由度。

按需劃分適合大小的服務粒度並進行適當的分布,也就不會對開發者硬性規定底層需要依賴什麼樣的服務,這就保證了輸出的軟體具有平台無關性。

微服務架構之所以能形成如此強大的一股潮流,其原因就在於面對網際網路規模化的時代,可以讓應用架構呈現出自由、靈活與開放的一面,同時又能對軟體易於混亂的特徵分而治之。

這與我們前面所說的兼顧有序與自由的應用架構設計的本質形成了很好的印證,它為開發者應對客戶需求的軟體應用設計,提供了一種自由的張力,這也是工程師們不斷追求自由之美的關鍵價值。

容器技術的靈活之美

軟體應用架構發展到了微服務這個階段看起來應該很不錯,可是現在又面臨一個問題,微服務架構必然需要用掉更多的計算資源,而且更適合於分布式架構環境,在採用更多機器組成的分布式網絡節點的情況下,如何才能優化計算資源的使用?

這時候容器化技術的價值與作用就體現出來了,例如:Docker引擎管理的容器作為作業系統上的一個進程,保證了容器之間互不影響,並且可以針對容器的CPU、內存等計算資源進行預先分配,容器鏡像對程序的封裝讓發布過程簡單到一條命令就能正常運行。

這樣就極大簡化了服務在雲伺服器上的部署難度,提升了更高的效率,甚至我們可以同時部署多個版本的服務,形成生產與測試環境的並存。

當我們感受到容器技術帶來的自由與靈活,可是如何讓開發者忘卻容器管理引擎、分布式架構部署的複雜性問題呢?

其實在上面的微服務案例中已經給出了答案,整個微服務實例全部由早期Amazon EC2 + Docker容器引擎的部署模式,遷移到了Amazon ECS平台之上。

通過Amazon Fargate實現了Serverless部署,不用考慮容器的分布式部署問題;在項目前期完全不需要考量計算資源的規劃問題,因為在業務不斷增長的情況下,Amazon ECS可以實現計算資源的動態伸縮,實在是太靈活了。

接下來我們就展開聊聊在雲服務架構環境下,Amazon ECS與Serverless技術為開發者擺脫底層環境束縛,到底帶來了哪些服務支撐。

Amazon雲容器與Serverless技術的支撐之美

Amazon雲容器的整體之美

當我們擁有了微服務、分布式架構與容器技術,那麼雲廠商又為此提供了怎樣的支撐呢?

我還是比較看好Amazon領導的這種雲服務理念,因為Amazon雲技術正在朝著Serverless的方向進行發展,尤其是充分利用了容器技術的出現,加快了這一步伐。

前述案例中的Amazon ECS全稱是(Amazon Elastic Container Service),它是針對容器技術高度彈性的管理服務。

Amazon ECS希望用戶直接面對容器,而不是面對作業系統,也就是說Amazon雲平台提供給用戶購買的計算單元粒度更細緻了。

那麼這又帶來了什麼好處呢?

其實是兩方面:

優勢一:我們沒必要就為了部署一個服務,就得先占用一台虛擬機OS,現在Amazon ECS給了一個新方案,部署維護一個Docker容器就夠了,它會自己維護計算資源的基礎設施。

由於資源占用少了,自然我們充值就少了;

優勢二:現在的雲服務大趨勢是分布式,這樣我們的應用可以形成集群,以便增強系統高可靠性以及對服務性能的彈性伸縮管理。

Amazon ECS默認提供的Serverless模式就讓開發者不再顧慮運行服務的集群分布問題。我們只考慮要上多少Docker容器,至於放置在什麼地方,哪個機房,哪台伺服器,那都是Amazon ECS的Serverless技術考慮的事情。

那麼我們就用一個整體上較低的綜合成本,實現了一個真正強大的面向服務的集群環境。

而Amazon的ECS、EFS 、EC2、ECR是什麼關係呢?

如下圖3 Amazon ECS、EC2架構體系示意圖所示:

Amazon EC2是Amazon提供的虛擬機,它與Amazon ECS共享基礎設施,形成相互協作。

通過Amazon EFS就可以將Amazon ECS任務的容器目錄掛載到EFS上,那麼Amazon EC2實例就可以通過網絡文件系統(NFS)掛載到本地目錄的方式,去訪問EFS中ECS容器的內部文件。

Amazon ECR是Amazon提供的Registry倉庫,為Amazon ECS提供容器鏡像服務,不僅使用方便,私密性也很好,而且比建立私有Registry倉庫的維護成本要低得多。

從上述架構介紹中,我們就可以看到Amazon雲平台是系統化地提供了整套雲容器化解決方案。

Amazon ECS的Serverless架構之美

對於Amazon ECS的管理核心就是Amazon Fargate(Amazon的Serverless技術),它可以將Amazon ECS任務(本質上就是容器實例)放置在集群的不同位置,形成高可靠的分布式系統,至於服務到底放置在分布式網絡中的哪個計算節點之上,是不需要開發者操心的。

如下圖4 Amazon ECS和Fargate技術結構體系示意圖所示:

我們只需要詳細地對容器任務和服務進行配置描述,然後將配置提交給Amazon ECS。

Amazon Fargate會創建任務實例,每個任務都是獨立運行的一個服務,每個服務並不獨占一台計算節點資源,但又能通過資源配額的自動擴展來應對更大的外部請求吞吐量。

另外針對Amazon ECS的應用服務是基於界面配置,並不利於自動化發布運維服務,Amazon又進一步提供了命令模式的Amazon Copilot,進一步實現完全自動化的CI/CD管道。

如下圖5 Copilot顯示服務狀態示例所示:

我們可以通過終端命令:"copilot svc status",就能拿到"ecsdemo-frontend"這個容器服務的狀態信息,通過捕獲的狀態信息。

我們可以進行程序級的二次分析,應用在我們的日誌、運維監控等功能當中。

因此Amazon ECS最大的優勢還是在於提供了特別強大的圖形界面配置功能和命令運維的工具集合功能,不僅包括了Amazon Copilot,還有Amazon ECS CLI、Amazon CDK等。

這些功能可以通過非圖形界面的終端命令方式、編程的方式(TypeScrpit、JavaScrpit、Python、Java、C#) 更全面且細粒度的創建與維護Amazon ECS基礎設施,控制和優化Amazon ECS集群與任務。

展望雲服務架構的未來

通過上述各章節的描述,我們可以看到應用服務架構的進步,二十年前還需要重度依賴中間件及底層服務,如今逐漸演進到了Serverless的時代,這是無數工程師、開源社區以及像亞馬遜雲科技(Amazon Web Services)這樣的商業公司所共同努力的成果。

那麼我們暢想一下雲服務架構的未來,我認為基於雲平台的Serverless架構應該會成為主流模式,Serverless會讓開發者更加關注業務本身,而非基礎設施與瑣碎的基礎技術。

但是對於開發者來講,Serverless的優勢在於分布式計算資源的自動調度,但是分布式架構的複雜特性又會讓很多開發者難以理解。

因此,雲服務廠商必然會在這個方面的基礎設施層進行發力,例如Amazon EKS就是在雲環境下創建和運行K8s集群提供了整套解決方案,目標就是讓開發者不用關注複雜的分布式問題。

我相信這種去分布式複雜化的基礎設施必將對應用軟體架構起到越來越重要的作用,也會變得越來越流行。

開發者可以在這樣的平台之上,既能獲得更大的自由與靈活度,專注於自己的業務功能改善,又能充分利用分布式技術優勢,讓更多的開發者在Serverless時代充分感受到自由之美。


報名開啟 | 自由構建 探索無限

亞馬遜雲科技2022 Dev Day 重磅來襲,不容錯過!

多位大咖現身說法

如何用充滿「技術美感」的方式

幫助開發者

實現更簡單、自由、高效的開發

此外,還有大量專家觀點碰撞

技術展、創新賽、動手實操等環節

精彩不斷,乾貨滿滿

攜手大家一起「自由構建,探索無限」

關鍵字: