本文旨在揭示現代軟件行業的關鍵主題——云原生應用程序。這篇文章涉及微服務、容器和無服務器應用程序。在這里,我們將討論這些技術的實際優點和缺點。
微服務
微服務架構作為構建現代軟件應用程序的強大方法而享有盛譽。那么什么是微服務?微服務可以簡單地描述為,將軟件應用程序所需的功能分離為多個獨立的小型軟件服務或“微服務”。每個微服務負責自己專注的任務。為了使微服務協同工作以形成大型可伸縮應用程序,它們之間進行通信和交換數據。
微服務的誕生是因為需要克服單體應用程序的復雜性和不靈活性。單體應用程序是一種應用程序,其中所有必需的功能一起編碼到同一服務中。例如,這是一個表示單體活動(如音樂會、演出等)預訂應用程序的圖表,負責預訂支付處理和活動預訂:
用戶可以使用該應用程序預訂音樂會或演出。需要一個用戶界面。此外,我們還需要一個搜索功能來查找活動、一個預訂處理程序來處理用戶預訂然后保存該預訂、一個活動處理程序來幫助查找活動(確保有可用的座位,然后將其鏈接到預訂)。在生產級應用程序中,需要更多的任務,例如支付處理,但是現在我們主要關注上圖中概述的四個任務。
這種單體應用程序適用于中小負載。它在單個服務器上運行,連接到單個數據庫,并且可能使用相同的編程語言編寫。
現在,如果業務呈指數級增長,需要處理數十萬或數百萬用戶,會發生什么?最初,短期解決方案是確保運行應用程序的服務器具有強大的硬件規格以承受更高的負載,如果沒有,則向服務器添加更多內存、存儲和處理能力。這稱為垂直縮放,是增加硬件功能的行為(如RAM和硬盤驅動器容量),以運行繁重的應用程序。但是,從長遠來看,這通常是不可持續的,因為應用程序上的負載持續增加。
單體應用程序的另一個挑戰是僅限于一種或兩種編程語言所導致的不靈活性。這種不靈活性會影響整體質量和應用效率。例如,node.js是用于構建Web應用程序的流行JavaScript框架,而R在數據科學應用程序中很流行。單體應用程序很難同時使用這兩種技術,而在微服務應用程序中,我們可以簡單地構建用R編寫的數據科學服務和用Node.js編寫的Web服務。
活動應用程序的微服務版本將采用以下形式:
此應用程序將能夠在多個服務器之間進行擴展,這種做法稱為水平擴展。每個服務都可以使用專用資源部署在不同的服務器上,也可以部署在不同的容器中(稍后會詳細介紹)。不同的服務可以用不同的編程語言編寫,從而實現更大的靈活性,不同的專業團隊可以專注于不同的服務,從而實現應用程序的更高整體質量。
使用微服務的另一個顯著優勢是易于持續交付,這是經常、在任何時間部署軟件的能力。微服務使持續交付更容易的原因是,與單體應用程序相比,部署到一個微服務的新功能不太可能影響其他微服務。
微服務的問題
嚴重依賴微服務的一個顯著缺點是,隨著數量和范圍的擴大,它們可能變得太復雜而無法長期管理。有一些方法可以通過利用Prometheus等監控工具來檢測問題,像Docker這樣的容器技術來避免污染主機環境并避免過度設計服務。但是,這些方法需要付出努力和時間。
云原生應用程序
微服務架構非常適合云原生應用程序。云原生應用程序簡單地定義為從頭開始為云計算架構而構建應用程序。這意味著,如果我們將應用程序設計為預期將部署在分布式、可擴展的基礎架構上,我們的應用程序就是云原生的。
例如,構建具有冗余微服務架構的應用程序使得應用程序云原生化,因為這種架構允許我們的應用程序以分布式方式部署,從而使其可擴展且幾乎總是可用。云原生應用程序不需要始終部署到AWS等公有云,我們可以將其部署到自己的分布式云基礎設施中(如果有的話)。
實際上,使應用程序完全云原生的原因不僅僅是使用微服務。你的應用程序應采用持續交付,這樣你能夠不間斷地為生產應用程序提供更新。你的應用程序還應該使用消息隊列和容器、無服務器等技術(容器和無服務器是現代軟件架構的重要主題)。
云原生應用程序假定可以訪問眾多服務器節點,可以訪問預先部署的軟件服務(如消息隊列或負載均衡器),易于與持續交付服務集成等。
如果將云原生應用程序部署到AWS或Azure等商業云,則應用程序可以選擇使用只能在云上用的軟件服務。例如,DynamoDB是一個功能強大的數據庫引擎,只能在AWS上用于生產應用程序。另一個例子是Azure中的DocumentDB數據庫。還有僅云的消息隊列,例如Amazon Simple Queue Service(SQS),可用于允許AWS云中的微服務之間的通信。
如前所述,云原生微服務應設計為允許服務之間的冗余。如果我們以活動預訂應用程序為例,應用程序將如下所示:
每個微服務將分配多個服務器節點,允許部署冗余微服務架構。如果主節點或服務因任何原因而失敗,則輔助節點可以接管以確保云原生應用程序的持久可靠性和可用性。這種可用性對于電子商務平臺等不容錯的應用程序至關重要,因為停機時間會導致大量的收入損失。
云原生應用程序為開發人員、企業和初創公司提供了巨大價值。
Prometheus是一個值得一提的微服務和云計算領域的工具。Prometheus是一個開源系統監控和警報工具,可用于監控復雜的微服務架構,并在需要采取措施時發出警報。Prometheus最初是由SoundCloud創建的,用于監控他們的系統,后來逐漸發展成為一個獨立的項目。該項目現在是云原生計算基礎的一部分,該基礎是為云原生應用程序構建可持續生態系統的基礎。
云原生的限制
對于云原生應用程序,如果需要遷移部分或全部應用程序,你將面臨一些挑戰。這是由多種原因造成的,具體取決于部署應用程序的位置。
例如,如果你的云原生應用程序部署在AWS等公有云上,則云原生API不是跨云平臺的。因此,應用程序中使用的DynamoDB數據庫API僅適用于AWS,但不適用于Azure,因為DynamoDB僅屬于AWS。API也永遠不會在本地環境中工作,因為DynamoDB在生產中只能在AWS中用。
另一個原因是因為在構建一些云原生應用程序時會做出一些假設,例如在需要時可以使用幾乎無限數量的服務器節點,并且可以非??焖俚厥褂眯碌姆掌鞴濣c。在需要購買真正的服務器、網絡硬件和布線的本地數據中心環境中,有時難以保證這些假設。