- 華為Serverless核心技術與實踐
- 劉方明等
- 1409字
- 2022-05-06 18:19:58
1.4.2 框架
本節將介紹Spring Cloud Function框架和Serverless Framework框架。
1.4.2.1 跨平臺開發框架Spring Cloud Function
Java語言的設計目標Write Once、Run Anywhere提升了語言的可移植性。雖然Serverless編程提升了開發者的開發效率,但是在可移植性上卻不盡如人意,函數代碼需要進行改造才能在其他平臺運行,對需要多云或需要在云服務商間遷移的開發者來說增加了移植的成本。
以AWS Lambda和Azure Function文檔代碼為例,Java函數代碼寫法如下。

二者的編程風格和接口的差異較大,如果有成百上千個函數需要在AWS Lambda和Azure Function上部署,其修改和維護的成本會很高。
Pivotal(Spring的母公司)推出了Spring Cloud Function,用于解決Java函數跨多個Serverless平臺(如Lambda、Azure、OpenWhisk、Google Cloud Function等)的運行。它支持統一的編程模型,并且可以獨立運行,如圖1-24所示。此外,Spring Cloud Function致力于推廣通過函數的方式實現業務邏輯,將函數開發和運行時解耦,保持SpringBoot的開發特性(自動配置),以方便Spring生態的開發者進行跨平臺的Java函數開發。

圖1-24 Spring Cloud Function可以用一套代碼跨多平臺或獨立運行
Spring Cloud Function抽象了三種核心函數接口:Function、Consumer、Supplier,支持響應式和命令式的編碼方式。
下面是一段Spring Cloud Function文檔中的示例代碼,用于將輸入字符串轉換為大寫。這段代碼從直觀上看就是一個普通的SpringBoot函數,可以直接在本地打包運行并進行測試。開發者可以像SpringBoot應用一樣,訪問本地的8080端口測試函數。

如果想要將這個函數部署到Google Cloud Function,只需要在Pom文件中加入對Google Cloud Function的適配依賴,然后使用mvn package命令對函數進行打包,將其發布到Google Cloud Function后就可以運行了,代碼如下所示。

由上可見,Spring Cloud Function為當前基于Serverless開發Java函數的調測和跨平臺移植帶來了一定的便利,開發者可以繼承原有基于Spring的生態和多種編程模式,不會產生新的學習成本。Serverless支持多語言開發,未來其他語言也會有對應的開發框架對跨平臺的函數開發進行支持。
1.4.2.2 跨平臺部署工具Serverless Framework
除開發框架外,自動化部署工具也必不可少。2014年AWS在推出Lambda時,缺乏與函數配套的部署模型(函數配置定義)及自動化的本地測試工具。AWS CLI僅支持將函數打包、上傳、發布,要實現函數的“基礎設施即代碼”,只能依賴AWS Cloud Formation的能力,這對于開發人員并不友好。此外,CLI缺乏函數管理的功能,這也是對Lambda最主要的質疑之一。
2015年,個人開發者Austen Collins使用Node.js獨立開發了Serverless Framework。Serverless Framework支持AWS Lambda的開發測試和部署發布,之后又提供了對主流商用及開源Serverless平臺的支持,其在Github的star數接近4萬,是當前流行的Serverless開發框架之一。Serverless Framework提供了從開發、CI/CD到發布、監控的端到端完整功能,為函數定義了統一的基礎設施即代碼模型,且支持多個Serverless平臺的部署發布和本地測試,其開源的版本支持開發、本地測試、發布及插件等功能。Serverless Framework部署模型中的主要概念如下。
? Service:可以映射到微服務的概念,一個服務可以管理多個不同配置的函數。比如對于用戶管理的服務,可能會覆蓋CRUD四個函數。
? Provider:部署的目標Serverless平臺,當前支持主流的商用Serverless平臺,如AWS Lambda、Azure Function、Google Function及Knative等。每個Provider的配置項可能會有所不同。Provider在配置項中提供了默認的函數配置。
? Functions:一個或一組函數的配置,如果不重寫配置項,則可以直接使用Provider中的配置。使用不同的配置,如采用不同大小的內存,可以覆寫此項對應的函數配置。
? Plugins:開發者引入的可復用的組件,如平臺的其他Serverless服務等。
? Custom:為插件提供自定義的配置。
如下代碼是Serverless Framework文檔中面向AWS部署多個函數的配置文件的一個樣例。

開發者完成函數編輯和本地測試后,使用sls deploy命令就可以將所有函數發布。
通常,商用或開源的Serverless平臺都會提供自己的基礎設施即代碼模型和自動化部署工具。對于未提供這些工具的Serverless平臺,或者需要跨平臺部署時,可以考慮采用Serverless Framework的開源版本。