使用Spring Cloud Function框架進(jìn)行面向函數(shù)的編程

責(zé)任編輯:editor004

作者:Tim Hodkinson

2017-08-16 11:24:20

摘自:INFOQ

這個(gè)項(xiàng)目的核心是推動(dòng)基于函數(shù)的編程模型,而不是Spring之前更為大家所熟悉的POJO模型。函數(shù)會(huì)打包為Jar文件,這個(gè)文件會(huì)被必要的配置以及適配器包裝起來,在包裝的過程中就帶上了目標(biāo)部署平臺(tái)的部署profile。

Spring Cloud Function是來自Pivotal的Spring團(tuán)隊(duì)的新項(xiàng)目,它致力于促進(jìn)函數(shù)作為主要的開發(fā)單元。該項(xiàng)目提供了一個(gè)通用的模型,用于在各種平臺(tái)上部署基于函數(shù)的軟件,包括像Amazon AWS Lambda這樣的FaaS(函數(shù)即服務(wù),function as a service)平臺(tái)。

與其他的serverless模式類似,該項(xiàng)目致力于將函數(shù)變成開發(fā)人員所使用的主要理念。這個(gè)項(xiàng)目第二個(gè)重要的元素就是將業(yè)務(wù)邏輯從部署profile中解耦出來。盡管業(yè)務(wù)邏輯以函數(shù)的方式實(shí)現(xiàn),但是相同的代碼可以通過一個(gè)部署profile將函數(shù)暴露為RESTful服務(wù)、流處理應(yīng)用(比如Spring Cloud Data Flow)或有限的(finite)任務(wù)。這意味著相同的單個(gè)函數(shù)可以部署為獨(dú)立的應(yīng)用,也可以部署到FaaS平臺(tái)上。到目前為止,團(tuán)隊(duì)已經(jīng)提供了針對(duì)AWS Lambda和Apache OpenWhisk的適配器,而對(duì)于像Google Cloud Functions和Azure Functions這樣的serverless平臺(tái),只要它們提供對(duì)Java的支持,該項(xiàng)目就承諾會(huì)支持。

AWS Lambda這樣的平臺(tái)憑借整潔的抽象和明顯的成本優(yōu)勢(shì),對(duì)很多開發(fā)人員都非常具有吸引力,但是有個(gè)重要的顧慮,尤其是對(duì)企業(yè)級(jí)用戶來說更是如此,那就是因?yàn)樵谠创a中包含了框架特定的代碼就會(huì)導(dǎo)致鎖定到該廠商上面。

就像serverless專家Mike Roberts在Martin Fowler的站點(diǎn)上所描述的:

通過依賴于環(huán)境,[serverless FaaS系統(tǒng)]能夠明顯減少運(yùn)維成本和復(fù)雜性,但代價(jià)就是廠商依賴以及(此時(shí))尚不成熟的支持服務(wù)。

Spring Cloud Function能夠改善這種狀況,它在交付管道(pipeline)的打包階段引入了部署平臺(tái)依賴。這意味著,開發(fā)人員可以以隔離的狀態(tài)實(shí)現(xiàn)函數(shù)(包括創(chuàng)建單元測(cè)試),只需關(guān)心邏輯以及函數(shù)的輸入輸出參數(shù)。然后,函數(shù)會(huì)基于這些依賴進(jìn)行打包,這些依賴就能讓函數(shù)運(yùn)行到目標(biāo)平臺(tái)上。

Spring Cloud Function項(xiàng)目的主管Mark Fisher這樣告訴InfoQ:

在serverless領(lǐng)域,我們希望提升Java開發(fā)人員的體驗(yàn),畢竟可移植性和一致性是很大的挑戰(zhàn)。

這個(gè)項(xiàng)目的核心是推動(dòng)基于函數(shù)的編程模型,而不是Spring之前更為大家所熟悉的POJO模型。已經(jīng)涉足serverless領(lǐng)域的人可能熟悉這種模型,在這種模型中,開發(fā)人員不用關(guān)心底層基礎(chǔ)設(shè)施或框架,只需將關(guān)注點(diǎn)放到業(yè)務(wù)邏輯的實(shí)現(xiàn)上即可,而不是樣板式的代碼或其他“plumbing”代碼。借助Spring Cloud Function,業(yè)務(wù)邏輯會(huì)使用java.util.function包中所定義的核心接口:Function、Consumer和Supplier的實(shí)現(xiàn)進(jìn)行開發(fā)。

在這個(gè)非常簡單的例子中,我們可以創(chuàng)建一個(gè)實(shí)現(xiàn)Function接口的類:

import java.util.function.Function; public class LengthCounter implements Function { @Override public Integer apply(String name) { return new Integer(name.length()); } }然后,它的魔力會(huì)通過@FunctionScan注解所啟用的類路徑掃描發(fā)揮出來:@FunctionScan@SpringBootApplicationpublic class ExampleSpringFunctionApplication {...

除此之外,函數(shù)還可以在類中聲明,這里要通過添加@Bean注解實(shí)現(xiàn):

@Beanpublic Function lowercase() { return flux -> flux.map(value -> value.toLowerCase());}

如果采用這種方式的話,就不需要使用@FunctionScan注解了。

函數(shù)會(huì)打包為Jar文件,這個(gè)文件會(huì)被必要的配置以及適配器包裝起來,在包裝的過程中就帶上了目標(biāo)部署平臺(tái)的部署profile。

Mark Fisher告訴我們:

除了serverless以外,我們還希望提升函數(shù)作為開發(fā)單元的簡潔性,以及跨各種部署平臺(tái)的可移植性。

開發(fā)人員專注于業(yè)務(wù)函數(shù)的創(chuàng)建,可以使用Spring Boot生態(tài)系統(tǒng)所提供的工具、過程和輔助設(shè)施(例如自動(dòng)化測(cè)試、自動(dòng)配置、依賴注入以及系統(tǒng)指標(biāo)),這些他們是非常熟悉的,而底層的傳輸細(xì)節(jié)、基礎(chǔ)設(shè)施和部署框架已經(jīng)抽象了出來。

這個(gè)項(xiàng)目還處于初期階段,但是Spring的人員承諾會(huì)有更多的舉措,比如與Fission和其他基于Kubernetes的serverless平臺(tái)的集成,另外,與新版本Spring Cloud Data Flow的集成也會(huì)更加緊密。

查看英文原文:Function-Oriented Programming with Spring Cloud Function Framework

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)