具有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,我們可以將FunctionConsumerSupplier類型的@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還附帶了SpringBootStreamHandlerFunctionInvokingS3EventHandler作為其他示例

現在, 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字段中指示實現SpringBootRequestHandlercom.baeldung.spring.cloudfunction.的類的全限定名稱com.baeldung.spring.cloudfunction.在我們的案例中, MyStringHandlers

具有Spring Cloud功能的無服務器功能

然後在環境變量中,我們通過FUNCTION_NAME環境變量指示要調用哪個Spring函數bean:

具有Spring Cloud功能的無服務器功能

這樣做之後,是時候通過創建測試事件並提供示例字符串來測試Lambda函數了:

具有Spring Cloud功能的無服務器功能

4.2。在AWS上測試功能

現在,我們Save測試,然後單擊“ Test按鈕。

而且,正如預期的那樣,我們得到的輸出與在本地測試該函數時得到的輸出相同:

具有Spring Cloud功能的無服務器功能

4.3。測試另一個功能

記住,我們的應用程序還有一個功能: greeter 。讓我們確保它也起作用。

我們將FUNCTION_NAME環境變量更改為greeter

具有Spring Cloud功能的無服務器功能

單擊Save按鈕,最後單擊Test按鈕:

具有Spring Cloud功能的無服務器功能

5.結論

總之,儘管處於早期階段, Spring Cloud Function是一個強大的工具,可用於將業務邏輯與任何特定的運行時目標分離。

有了它,相同的代碼可以作為Web端點,在雲平台上或作為流的一部分運行。它抽像出了所有傳輸細節和基礎結構,使開發人員可以保留所有熟悉的工具和流程,並專注於業務邏輯。

與往常一樣,在GitHub上查看本教程的源代碼。