2017年會是Serverless爆發之年嗎?

infoq發表於2017-04-18

  前言

  中小型公司,尤其是網際網路行業的創業公司,本身並沒有太多的技術人員,如果設計系統時需要考慮諸多的技術問題,例如Web應用伺服器如何配置、資料庫如何配置、訊息服務中介軟體如何搭建等等,那對於他們來說人員成本、系統成本會很高,Serverless架構的出現,讓這種情況可能可以大幅度改善。

  初識Serverless?

  在目前主流雲端計算IaaS(Infrastructure-as-a-Service,基礎設施即服務)和PaaS(Platform-as-a-Service,平臺即服務)中,開發人員進行業務開發時,仍然需要關心很多和伺服器相關的服務端開發工作,比如快取、訊息服務、Web應用伺服器、資料庫,以及對伺服器進行效能優化,還需要考慮儲存和計算資源,考慮負載均衡和橫向擴充套件能力,考慮伺服器容災穩定性等非專業邏輯的開發。這些伺服器的運維和開發知識、經驗極大地限制了開發者進行業務開發的效率。設想一下,如果開發者直接租用服務或者開發服務而無須關注如何在伺服器中執行部署服務,是否可以極大地提升開發效率和產品質量?這種去伺服器而直接使用服務的架構,我們稱之為Serverless架構(無伺服器架構)。

  Serverless架構的問世

  2014年,雲廠商AWS推出了“無伺服器”的正規化服務。

  其實,最初“無伺服器”意在幫助開發者擺脫執行後端應用程式所需的伺服器裝置的設定和管理工作。這項技術的目標並不是為了實現真正意義上的“無伺服器”,而是指由第三方供應商負責後端基礎結構的維護,以服務的方式為開發者提供所需功能,例如資料庫、訊息,以及身份驗證等。這種服務基礎結構通常可以叫做後端即服務(Backend-as-a-Service,BaaS),或移動後端即服務(MobileBackend-as-a-service,MBaaS)。

  現在,無伺服器架構是指大量依賴第三方服務(也叫做後端即服務,即“BaaS”)或暫存容器中執行的自定義程式碼(函式即服務,即“FaaS”)的應用程式,函式是無伺服器架構中抽象語言執行時的最小單位,在這種架構中,我們並不看重執行一個函式需要多少CPU或RAM或任何其他資源,而是更看重執行函式所需的時間,我們也只為這些函式的執行時間付費。無伺服器架構中函式可以多種方式觸發,如定期執行函式的定時器、HTTP請求或某些相關服務中的某個事件。

  Serverless案例

  以帶有服務功能邏輯的傳統面向客戶端的三層應用為例(一個典型的電子商務應用網站)。一般來說包含客戶端、服務端程式、資料庫,服務端用Java開發完成,客戶端用JavaScript。

  採用這種架構,服務端需要實現諸多系統邏輯,例如認證、頁面導航、搜尋、交易等都需要在服務端完成。如果採用Serverless架構來對該應用進行改造,則架構如圖所示:

  Serverless架構相比於傳統面向客戶端的三層應用架構,有以下幾方面的差異:

  1. 刪除認證邏輯,用第三方BaaS服務替代;
  2. 使用另外一個BaaS,允許客戶端直接訪問架構與第三方(例如AWS Dynamo)上面的數句子庫。通過這種方式提供給客戶更安全的訪問資料庫模式;
  3. 前兩點中包含著很重要的第三點,也就是以前執行在服務端的邏輯轉移到客戶端中,例如跟蹤使用者訪問。客戶端則慢慢轉化為單頁面應用。
  4. 計算敏感或者需要訪問大量資料的功能,例如搜尋這類應用,我們不需要執行一個專用服務,而是通過FaaS模組,通過API Gateway對HTTP訪問提供響應。這樣可以使得客戶端和服務端都從同一個資料庫中讀取相關資料。由於原始服務使用Java開發,AWS Lambda(FaaS提供者)支援Java功能,因此可以直接從服務端將程式碼移植到搜尋功能,而不用重寫程式碼。
  5. 最後,可以將其他功能用另外一個FaaS功能取代,因為安全原因放在服務端還不如在客戶端重新實現,當然前端還是API Gateway。

  常見的Serverless框架介紹

  2014年11月14日,AWS釋出了AWS Lambda。AWS Lambda是市面上最早,也是最為成熟的Serverless框架之一。該服務最遲支援Node.js,現在也支援Java和Python。它與Alexa Skills Kit(軟體開發工具包)緊密整合,亞馬遜提供互動式控制檯和命令列工具,以便上傳和管理程式碼片段。

  Google是為服務架構的最前沿公司,除了推動Kubernetes,Google還投資了Cloud Functions,該架構可以在其公共雲基礎設施上執行。

  Iron.io最初是為企業級應用提供微服務。Iron.io是用Go語言編寫的,用於處理高併發、高效能運算服務,並已經整合Docker服務,提供一種完整的微服務平臺。

  • IBM OpenWhisk

  2016年2月的InterConnect大會,IBM釋出了OpenWhisk,這種事件驅動型開源計算平臺可以用來替代AWS Lambda。OpenWhisk平臺讓廣大開發人員能夠迅速構建微服務,從而可以響應諸多事件,比如滑鼠點選或收到來自感測器的資料,並執行程式碼。事件發生後,程式碼會自動執行。

  • Serverless Framework

  Serverless Framework是無伺服器應用框架和生態系統,旨在簡化開發和部署AWS Lambda應用程式的工作。Serverless Framework作為Node.js NPM模組提供,填補了AWS Lambda存在的許多缺口。它提供了多個樣本模板,可以迅速啟動AWS Lambda開發。

  • Azure WebJobs

  Azure Web的應用功能,可以與Web、API應用相同的上下文中執行程式或指令碼。可以上傳並執行可執行檔案,例如cmd、bat、exe、psl等等。WebJobs提供SDK用於簡化針對Web作業可以執行的常見任務,例如影像處理、佇列處理、RSS聚合、檔案維護,以及傳送電子郵件等等。

  Serverless架構原則

  • 按需使用計算服務執行程式碼

  Serverless架構是SOA概念的自然延伸。在Serverless架構中,所有自定義程式碼作為孤立的、獨立的、細粒度的函式來編寫和執行,這些函式在AWS Lambda之類的無狀態計算服務中執行。開發人員可以編寫函式,執行常見的任務。在比較複雜的情況下,開發人員可以構建更復雜的管道,編排多個函式呼叫。

  • 編寫單一用途的無狀態函式

    單單負責處理某一項任務的函式很容易測試,並穩定執行。通過以一種鬆散編排的方式將函式和服務組合起來,能夠構建易於理解、易於管理的複雜後端系統。
    為lambda等計算服務編寫的程式碼應該以無狀態方式進行構建,這樣會讓無狀態功能很強大,讓平臺得以迅速擴充套件,處理數量不斷變化的請求或者事件。

  • 設計基於推送的、事件驅動的管道

    可以構建滿足任何用途的伺服器架構。系統可以一開始就構建成無伺服器,也可以逐步設計現有的單體型應用程式,以便充分發揮這種架構的優勢。最靈活、最強大的無伺服器設計是事件驅動型的。

    構建事件驅動的、基於推送的系統常常有利於降低成本和系統複雜性,但是要注意,並不是任何情況下都是適當的或者容易實現的。

  • 建立更強大的前端

    由於Lambda的定價基於請求數量、執行時間段以及分配的記憶體量,所以程式碼執行需要越快越好。資料簽名的令牌讓前端可以與不同的服務直接通訊。相比之下,傳統系統中所有通訊經由後端伺服器來實現。讓前端與服務進行通訊有助於減少建立環節、儘快獲得所需的資源。

  • 與第三方服務整合

    如果第三方服務能提供價值,並減少自定義程式碼,那麼自然它們就很有價值。開發人員可以通過引入第三方服務來減少自己實現各種業務邏輯的需要,可以減少小型公司的開發成本,避免價格、效能、可用性等要素上的劣勢。

  未來趨勢

  隨著移動和物聯網應用蓬勃發展,伴隨著面向服務架構(SOA)以及微服務架構(MSA)的盛行,造就了Serverless架構平臺的迅猛發展。在Serverless架構中,開發者無須考慮伺服器的問題,計算資源作為服務而不是伺服器的概念出現,這樣開發者只需要關注面向客戶的客戶端業務程式開發,後臺服務由第三方服務公司完全或者部分提供,開發者呼叫相關的服務即可。Serverless是一種構建和管理基於微服務架構的完整流程,允許我們在服務部署級別而不是伺服器部署級別來管理應用部署,甚至可以管理某個具體功能或埠的部署,這就能讓開發者快速迭代,更快速地交付軟體。

  這種新興的雲端計算服務交付模式為開發人員和管理人員帶了很多好處。它提供了合適的靈活性和控制性級別,因而在IaaS和PaaS之間找到了一條中間道路。由於伺服器端幾乎沒有什麼要管理的,Serverless架構正在徹底改變軟體開發和部署流程,比如推動了NoOps模式的發展。

相關文章