Spring Cloud Function是來自Pivotal的Spring團隊的新項目,它致力于促進函數作為主要的開發單元。該項目提供了一個通用的模型,用于在各種平臺上部署基于函數的軟件,包括像Amazon AWS Lambda這樣的FaaS(函數即服務,function as a service)平臺。
與其他的serverless模式類似,該項目致力于將函數變成開發人員所使用的主要理念。這個項目第二個重要的元素就是將業務邏輯從部署profile中解耦出來。盡管業務邏輯以函數的方式實現,但是相同的代碼可以通過一個部署profile將函數暴露為RESTful服務、流處理應用(比如Spring Cloud Data Flow)或有限的(finite)任務。這意味著相同的單個函數可以部署為獨立的應用,也可以部署到FaaS平臺上。到目前為止,團隊已經提供了針對AWS Lambda和Apache OpenWhisk的適配器,而對于像Google Cloud Functions和Azure Functions這樣的serverless平臺,只要它們提供對Java的支持,該項目就承諾會支持。
AWS Lambda這樣的平臺憑借整潔的抽象和明顯的成本優勢,對很多開發人員都非常具有吸引力,但是有個重要的顧慮,尤其是對企業級用戶來說更是如此,那就是因為在源碼中包含了框架特定的代碼就會導致鎖定到該廠商上面。
就像serverless專家Mike Roberts在Martin Fowler的站點上所描述的:
通過依賴于環境,[serverless FaaS系統]能夠明顯減少運維成本和復雜性,但代價就是廠商依賴以及(此時)尚不成熟的支持服務。
Spring Cloud Function能夠改善這種狀況,它在交付管道(pipeline)的打包階段引入了部署平臺依賴。這意味著,開發人員可以以隔離的狀態實現函數(包括創建單元測試),只需關心邏輯以及函數的輸入輸出參數。然后,函數會基于這些依賴進行打包,這些依賴就能讓函數運行到目標平臺上。
Spring Cloud Function項目的主管Mark Fisher這樣告訴InfoQ:
在serverless領域,我們希望提升Java開發人員的體驗,畢竟可移植性和一致性是很大的挑戰。
這個項目的核心是推動基于函數的編程模型,而不是Spring之前更為大家所熟悉的POJO模型。已經涉足serverless領域的人可能熟悉這種模型,在這種模型中,開發人員不用關心底層基礎設施或框架,只需將關注點放到業務邏輯的實現上即可,而不是樣板式的代碼或其他“plumbing”代碼。借助Spring Cloud Function,業務邏輯會使用java.util.function包中所定義的核心接口:Function、Consumer和Supplier的實現進行開發。
在這個非常簡單的例子中,我們可以創建一個實現Function接口的類:
import java.util.function.Function; public class LengthCounter implements Function { @Override public Integer apply(String name) { return new Integer(name.length()); } }然后,它的魔力會通過@FunctionScan注解所啟用的類路徑掃描發揮出來:@FunctionScan@SpringBootApplicationpublic class ExampleSpringFunctionApplication {...除此之外,函數還可以在類中聲明,這里要通過添加@Bean注解實現:
@Beanpublic Function lowercase() { return flux -> flux.map(value -> value.toLowerCase());}如果采用這種方式的話,就不需要使用@FunctionScan注解了。
函數會打包為Jar文件,這個文件會被必要的配置以及適配器包裝起來,在包裝的過程中就帶上了目標部署平臺的部署profile。
Mark Fisher告訴我們:
除了serverless以外,我們還希望提升函數作為開發單元的簡潔性,以及跨各種部署平臺的可移植性。
開發人員專注于業務函數的創建,可以使用Spring Boot生態系統所提供的工具、過程和輔助設施(例如自動化測試、自動配置、依賴注入以及系統指標),這些他們是非常熟悉的,而底層的傳輸細節、基礎設施和部署框架已經抽象了出來。
這個項目還處于初期階段,但是Spring的人員承諾會有更多的舉措,比如與Fission和其他基于Kubernetes的serverless平臺的集成,另外,與新版本Spring Cloud Data Flow的集成也會更加緊密。
查看英文原文:Function-Oriented Programming with Spring Cloud Function Framework