前言
中小型公司,尤其是互聯(lián)網(wǎng)行業(yè)的創(chuàng)業(yè)公司,本身并沒有太多的技術(shù)人員,如果設(shè)計系統(tǒng)時需要考慮諸多的技術(shù)問題,例如Web應(yīng)用服務(wù)器如何配置、數(shù)據(jù)庫如何配置、消息服務(wù)中間件如何搭建等等,那對于他們來說人員成本、系統(tǒng)成本會很高,Serverless架構(gòu)的出現(xiàn),讓這種情況可能可以大幅度改善。
初識Serverless?
在目前主流云計算IaaS(Infrastructure-as-a-Service,基礎(chǔ)設(shè)施即服務(wù))和PaaS(Platform-as-a-Service,平臺即服務(wù))中,開發(fā)人員進行業(yè)務(wù)開發(fā)時,仍然需要關(guān)心很多和服務(wù)器相關(guān)的服務(wù)端開發(fā)工作,比如緩存、消息服務(wù)、Web應(yīng)用服務(wù)器、數(shù)據(jù)庫,以及對服務(wù)器進行性能優(yōu)化,還需要考慮存儲和計算資源,考慮負載均衡和橫向擴展能力,考慮服務(wù)器容災(zāi)穩(wěn)定性等非專業(yè)邏輯的開發(fā)。這些服務(wù)器的運維和開發(fā)知識、經(jīng)驗極大地限制了開發(fā)者進行業(yè)務(wù)開發(fā)的效率。設(shè)想一下,如果開發(fā)者直接租用服務(wù)或者開發(fā)服務(wù)而無須關(guān)注如何在服務(wù)器中運行部署服務(wù),是否可以極大地提升開發(fā)效率和產(chǎn)品質(zhì)量?這種去服務(wù)器而直接使用服務(wù)的架構(gòu),我們稱之為Serverless架構(gòu)(無服務(wù)器架構(gòu))。
Serverless架構(gòu)的問世
2014年,云廠商AWS推出了“無服務(wù)器”的范式服務(wù)。
其實,最初“無服務(wù)器”意在幫助開發(fā)者擺脫運行后端應(yīng)用程序所需的服務(wù)器設(shè)備的設(shè)置和管理工作。這項技術(shù)的目標(biāo)并不是為了實現(xiàn)真正意義上的“無服務(wù)器”,而是指由第三方供應(yīng)商負責(zé)后端基礎(chǔ)結(jié)構(gòu)的維護,以服務(wù)的方式為開發(fā)者提供所需功能,例如數(shù)據(jù)庫、消息,以及身份驗證等。這種服務(wù)基礎(chǔ)結(jié)構(gòu)通常可以叫做后端即服務(wù)(Backend-as-a-Service,BaaS),或移動后端即服務(wù)(MobileBackend-as-a-service,MBaaS)。
現(xiàn)在,無服務(wù)器架構(gòu)是指大量依賴第三方服務(wù)(也叫做后端即服務(wù),即“BaaS”)或暫存容器中運行的自定義代碼(函數(shù)即服務(wù),即“FaaS”)的應(yīng)用程序,函數(shù)是無服務(wù)器架構(gòu)中抽象語言運行時的最小單位,在這種架構(gòu)中,我們并不看重運行一個函數(shù)需要多少CPU或RAM或任何其他資源,而是更看重運行函數(shù)所需的時間,我們也只為這些函數(shù)的運行時間付費。無服務(wù)器架構(gòu)中函數(shù)可以多種方式觸發(fā),如定期運行函數(shù)的定時器、HTTP請求或某些相關(guān)服務(wù)中的某個事件。
Serverless案例
以帶有服務(wù)功能邏輯的傳統(tǒng)面向客戶端的三層應(yīng)用為例(一個典型的電子商務(wù)應(yīng)用網(wǎng)站)。一般來說包含客戶端、服務(wù)端程序、數(shù)據(jù)庫,服務(wù)端用Java開發(fā)完成,客戶端用JavaScript。
采用這種架構(gòu),服務(wù)端需要實現(xiàn)諸多系統(tǒng)邏輯,例如認證、頁面導(dǎo)航、搜索、交易等都需要在服務(wù)端完成。如果采用Serverless架構(gòu)來對該應(yīng)用進行改造,則架構(gòu)如圖所示:
Serverless架構(gòu)相比于傳統(tǒng)面向客戶端的三層應(yīng)用架構(gòu),有以下幾方面的差異:
刪除認證邏輯,用第三方BaaS服務(wù)替代; 使用另外一個BaaS,允許客戶端直接訪問架構(gòu)與第三方(例如AWS Dynamo)上面的數(shù)句子庫。通過這種方式提供給客戶更安全的訪問數(shù)據(jù)庫模式; 前兩點中包含著很重要的第三點,也就是以前運行在服務(wù)端的邏輯轉(zhuǎn)移到客戶端中,例如跟蹤用戶訪問。客戶端則慢慢轉(zhuǎn)化為單頁面應(yīng)用。 計算敏感或者需要訪問大量數(shù)據(jù)的功能,例如搜索這類應(yīng)用,我們不需要運行一個專用服務(wù),而是通過FaaS模塊,通過API Gateway對HTTP訪問提供響應(yīng)。這樣可以使得客戶端和服務(wù)端都從同一個數(shù)據(jù)庫中讀取相關(guān)數(shù)據(jù)。由于原始服務(wù)使用Java開發(fā),AWS Lambda(FaaS提供者)支持Java功能,因此可以直接從服務(wù)端將代碼移植到搜索功能,而不用重寫代碼。 最后,可以將其他功能用另外一個FaaS功能取代,因為安全原因放在服務(wù)端還不如在客戶端重新實現(xiàn),當(dāng)然前端還是API Gateway。常見的Serverless框架介紹
Amazon的Lambda產(chǎn)品2014年11月14日,AWS發(fā)布了AWS Lambda。AWS Lambda是市面上最早,也是最為成熟的Serverless框架之一。該服務(wù)最遲支持Node.js,現(xiàn)在也支持Java和Python。它與Alexa Skills Kit(軟件開發(fā)工具包)緊密集成,亞馬遜提供交互式控制臺和命令行工具,以便上傳和管理代碼片段。
Google Cloud FunctionsGoogle是為服務(wù)架構(gòu)的最前沿公司,除了推動Kubernetes,Google還投資了Cloud Functions,該架構(gòu)可以在其公共云基礎(chǔ)設(shè)施上運行。
Iron.ioIron.io最初是為企業(yè)級應(yīng)用提供微服務(wù)。Iron.io是用Go語言編寫的,用于處理高并發(fā)、高性能計算服務(wù),并已經(jīng)集成Docker服務(wù),提供一種完整的微服務(wù)平臺。
IBM OpenWhisk2016年2月的InterConnect大會,IBM發(fā)布了OpenWhisk,這種事件驅(qū)動型開源計算平臺可以用來替代AWS Lambda。OpenWhisk平臺讓廣大開發(fā)人員能夠迅速構(gòu)建微服務(wù),從而可以響應(yīng)諸多事件,比如鼠標(biāo)點擊或收到來自傳感器的數(shù)據(jù),并執(zhí)行代碼。事件發(fā)生后,代碼會自動執(zhí)行。
Serverless FrameworkServerless Framework是無服務(wù)器應(yīng)用框架和生態(tài)系統(tǒng),旨在簡化開發(fā)和部署AWS Lambda應(yīng)用程序的工作。Serverless Framework作為Node.js NPM模塊提供,填補了AWS Lambda存在的許多缺口。它提供了多個樣本模板,可以迅速啟動AWS Lambda開發(fā)。
Azure WebJobsAzure Web的應(yīng)用功能,可以與Web、API應(yīng)用相同的上下文中運行程序或腳本。可以上傳并運行可執(zhí)行文件,例如cmd、bat、exe、psl等等。WebJobs提供SDK用于簡化針對Web作業(yè)可以執(zhí)行的常見任務(wù),例如圖像處理、隊列處理、RSS聚合、文件維護,以及發(fā)送電子郵件等等。
Serverless架構(gòu)原則
按需使用計算服務(wù)執(zhí)行代碼Serverless架構(gòu)是SOA概念的自然延伸。在Serverless架構(gòu)中,所有自定義代碼作為孤立的、獨立的、細粒度的函數(shù)來編寫和執(zhí)行,這些函數(shù)在AWS Lambda之類的無狀態(tài)計算服務(wù)中運行。開發(fā)人員可以編寫函數(shù),執(zhí)行常見的任務(wù)。在比較復(fù)雜的情況下,開發(fā)人員可以構(gòu)建更復(fù)雜的管道,編排多個函數(shù)調(diào)用。
編寫單一用途的無狀態(tài)函數(shù)
單單負責(zé)處理某一項任務(wù)的函數(shù)很容易測試,并穩(wěn)定運行。通過以一種松散編排的方式將函數(shù)和服務(wù)組合起來,能夠構(gòu)建易于理解、易于管理的復(fù)雜后端系統(tǒng)。
為lambda等計算服務(wù)編寫的代碼應(yīng)該以無狀態(tài)方式進行構(gòu)建,這樣會讓無狀態(tài)功能很強大,讓平臺得以迅速擴展,處理數(shù)量不斷變化的請求或者事件。
設(shè)計基于推送的、事件驅(qū)動的管道
可以構(gòu)建滿足任何用途的服務(wù)器架構(gòu)。系統(tǒng)可以一開始就構(gòu)建成無服務(wù)器,也可以逐步設(shè)計現(xiàn)有的單體型應(yīng)用程序,以便充分發(fā)揮這種架構(gòu)的優(yōu)勢。最靈活、最強大的無服務(wù)器設(shè)計是事件驅(qū)動型的。
構(gòu)建事件驅(qū)動的、基于推送的系統(tǒng)常常有利于降低成本和系統(tǒng)復(fù)雜性,但是要注意,并不是任何情況下都是適當(dāng)?shù)幕蛘呷菀讓崿F(xiàn)的。
創(chuàng)建更強大的前端
由于Lambda的定價基于請求數(shù)量、執(zhí)行時間段以及分配的內(nèi)存量,所以代碼執(zhí)行需要越快越好。數(shù)據(jù)簽名的令牌讓前端可以與不同的服務(wù)直接通信。相比之下,傳統(tǒng)系統(tǒng)中所有通信經(jīng)由后端服務(wù)器來實現(xiàn)。讓前端與服務(wù)進行通信有助于減少創(chuàng)建環(huán)節(jié)、盡快獲得所需的資源。
與第三方服務(wù)集成
如果第三方服務(wù)能提供價值,并減少自定義代碼,那么自然它們就很有價值。開發(fā)人員可以通過引入第三方服務(wù)來減少自己實現(xiàn)各種業(yè)務(wù)邏輯的需要,可以減少小型公司的開發(fā)成本,避免價格、性能、可用性等要素上的劣勢。
未來趨勢
隨著移動和物聯(lián)網(wǎng)應(yīng)用蓬勃發(fā)展,伴隨著面向服務(wù)架構(gòu)(SOA)以及微服務(wù)架構(gòu)(MSA)的盛行,造就了Serverless架構(gòu)平臺的迅猛發(fā)展。在Serverless架構(gòu)中,開發(fā)者無須考慮服務(wù)器的問題,計算資源作為服務(wù)而不是服務(wù)器的概念出現(xiàn),這樣開發(fā)者只需要關(guān)注面向客戶的客戶端業(yè)務(wù)程序開發(fā),后臺服務(wù)由第三方服務(wù)公司完全或者部分提供,開發(fā)者調(diào)用相關(guān)的服務(wù)即可。Serverless是一種構(gòu)建和管理基于微服務(wù)架構(gòu)的完整流程,允許我們在服務(wù)部署級別而不是服務(wù)器部署級別來管理應(yīng)用部署,甚至可以管理某個具體功能或端口的部署,這就能讓開發(fā)者快速迭代,更快速地交付軟件。
這種新興的云計算服務(wù)交付模式為開發(fā)人員和管理人員帶了很多好處。它提供了合適的靈活性和控制性級別,因而在IaaS和PaaS之間找到了一條中間道路。由于服務(wù)器端幾乎沒有什么要管理的,Serverless架構(gòu)正在徹底改變軟件開發(fā)和部署流程,比如推動了NoOps模式的發(fā)展。