具有Spring Cloud功能的無服務器功能
1.簡介
在本教程中,我們將學習如何使用Spring Cloud Function。
我們將在本地構建並運行一個簡單的Spring Cloud Function,然後將其部署到AWS。
2. Spring Cloud功能設置
首先,讓我們從頭開始實現,並使用不同的方法測試具有兩個功能的簡單項目:
- 字符串反向器,使用普通方法
- 還有一個使用專門課程的迎賓員
2.1。 Maven依賴
我們需要做的第一件事是包括spring-cloud-starter-function-web
依賴項。這將充當我們的本地適配器,並引入必要的依賴關係以在本地運行我們的函數:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-function-web</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
請繼續關注,因為我們在部署到AWS時會對此進行一些修改。
2.2。編寫Spring Cloud函數
使用Spring Cloud Function,我們可以將Function
, Consumer
或Supplier
類型的@Bean
公開為單獨的方法:
@SpringBootApplication
public class CloudFunctionApplication {
public static void main(String[] args) {
SpringApplication.run(CloudFunctionApplication.class, args);
}
@Bean
public Function<String, String> reverseString() {
return value -> new StringBuilder(value).reverse().toString();
}
}
像這段代碼一樣,我們可以將反向字符串功能公開為Function
,我們的目標功能平台可以調用它。
2.3。在本地測試反向字符串功能
spring-cloud-starter-function-web
將功能公開為HTTP端點。運行CloudFunctionApplication
,我們可以捲曲目標以在本地進行測試:
curl localhost:8080/reverseString -H "Content-Type: text/plain" -d "Baeldung User"
請注意,端點是bean的名稱。
和預期的一樣,我們得到了反向字符串作為輸出:
resU gnudleaB
2.4。掃描軟件包中的Spring Cloud功能
除了將方法公開為@Bean,
我們還可以將軟件編寫為實現功能接口Function<T, R>
:
public class Greeter implements Function<String, String> {
@Override
public String apply(String s) {
return "Hello " + s + ", and welcome to Spring Cloud Function!!!";
}
}
然後,我們可以在application.properties
指定要掃描相關軟件包的軟件包:
spring.cloud.function.scan.packages=com.baeldung.spring.cloudfunction.functions
2.5。在本地測試Greeter功能
同樣,我們可以啟動應用程序並使用curl測試Greeter
功能:
curl localhost:8080/greeter -H "Content-Type: text/plain" -d "World"
請注意,端點是實現Functional接口的類的名稱。
而且,毫不奇怪,我們收到了預期的問候:
Hello World, and welcome to Spring Cloud function!!!
3. AWS上的Spring Cloud功能
使Spring Cloud Function如此強大的原因在於,我們可以構建不可知的支持Spring的功能。函數本身不需要知道如何調用它或將其部署到的環境。例如,我們可以輕鬆地將此問候語部署到AWS,Azure或Google Cloud平台,而無需更改任何業務邏輯。
由於AWS Lambda是流行的無服務器解決方案之一,因此讓我們集中討論如何將應用程序部署到其中。
因此,我們不再等待,將我們的功能部署到雲中!
3.1。 Maven依賴
記住我們最初添加的spring-cloud-starter-function-web
依賴項。現在該改變它了。
看,根據我們將在哪裡運行Spring Cloud Function,我們需要添加適當的依賴項。
對於AWS,我們將使用spring-cloud-function-adapter-aws
:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>
接下來,讓我們添加所需的AWS依賴項來處理Lambda事件:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>2.0.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
最後,由於我們要將由maven構建生成的工件上傳到AWS Lambda,因此我們需要構建一個帶陰影的工件,這意味著,所有依賴項都分解為單獨的類文件而不是jar。
spring-boot-thin-layout
依賴性通過排除一些不需要的依賴性來幫助我們減少構件的大小:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
<version>1.0.10.RELEASE</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
</configuration>
</plugin>
</plugins>
</build>
3.2。 AWS處理程序
如果我們想通過HTTP請求再次公開字符串反向器,則Spring Cloud Function AWS隨SpringBootRequestHandler.
它實現了AWS的RequestHandler
並負責將AWS請求分派給我們的功能。
public class MyStringHandlers extends SpringBootRequestHandler<String, String> {
}
Spring Cloud Function AWS還附帶了SpringBootStreamHandler
和FunctionInvokingS3EventHandler
作為其他示例
現在, MyStringHandlers
只是一個空類似乎有些奇怪,但是它在充當Lambda函數的入口點以及定義其輸入和輸出類型方面都起著重要作用。
正如我們將在下面的屏幕快照中看到的那樣,我們將在AWS Lambda配置頁面的Handler輸入字段中提供此類的完全限定名稱。
3.3。 AWS如何知道要調用哪個雲功能?
事實證明,即使我們的應用程序中有多個Spring Cloud Function, AWS也只能調用其中之一。
在下一部分中,我們將在AWS控制台上的名為FUNCTION_NAME
的環境變量中指定雲函數名稱。
4.將功能上傳到AWS並測試
最後,讓我們使用maven構建jar,然後通過AWS Console UI將其上傳。
4.1。在AWS控制台上創建Lambda函數並對其進行配置
在AWS Lambda控制台頁面上的“功能代碼”部分,我們可以選擇一個Java 8運行時,然後單擊“上傳” 。
之後,我們需要在Handler字段中指示實現SpringBootRequestHandler
或com.baeldung.spring.cloudfunction.
的類的全限定名稱com.baeldung.spring.cloudfunction.
在我們的案例中, MyStringHandlers
:
然後在環境變量中,我們通過FUNCTION_NAME
環境變量指示要調用哪個Spring函數bean:
這樣做之後,是時候通過創建測試事件並提供示例字符串來測試Lambda函數了:
4.2。在AWS上測試功能
現在,我們Save
測試,然後單擊“ Test
按鈕。
而且,正如預期的那樣,我們得到的輸出與在本地測試該函數時得到的輸出相同:
4.3。測試另一個功能
記住,我們的應用程序還有一個功能: greeter
。讓我們確保它也起作用。
我們將FUNCTION_NAME
環境變量更改為greeter
:
單擊Save
按鈕,最後單擊Test
按鈕:
5.結論
總之,儘管處於早期階段, Spring Cloud Function是一個強大的工具,可用於將業務邏輯與任何特定的運行時目標分離。
有了它,相同的代碼可以作為Web端點,在雲平台上或作為流的一部分運行。它抽像出了所有傳輸細節和基礎結構,使開發人員可以保留所有熟悉的工具和流程,並專注於業務邏輯。
與往常一樣,在GitHub上查看本教程的源代碼。