環境:SpringBoot2.3.12.RELEASE + Spring Cloud 2020.0.5
簡介
Spring Cloud Function是一個具有以下高層目標的項目:
- 通過函數促進業務邏輯的實現。
- 將業務邏輯的開發生命周期與任何特定的運行時目標解耦,這樣相同的代碼就可以作為web端點、流處理器或任務運行。
- 支持跨無伺服器(serverless)提供商的統一編程模型,以及獨立運行(本地或PaaS中)的能力。
- 在無服務(serverless)提供商上啟用Spring Boot特性(自動配置、依賴注入、指標)。
它抽象了所有的傳輸細節和基礎設施,允許開發人員保留所有熟悉的工具和流程,並將重點牢牢地放在業務邏輯上。如下示例:
@SpringBootApplication
public class Application {
@Bean
public Function<Flux<String>, Flux<String>> uppercase() {
return flux -> flux.Map(value -> value.toUpperCase());
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
如上,它只是一個Spring Boot應用程式,所以它可以在本地和CI構建中構建、運行和測試,就像其他Spring Boot應用程式一樣。該 Function來自 Java.util 與 Flux 是反應流發布者Publisher。可以通過HTTP或消息傳遞訪問該功能。
Spring Cloud Function 有4個主要的功能:
簡而言之,Spring Cloud Function提供了以下功能:Function、Consumer和Supplier類型的@Beans的包裝器,將它們作為HTTP端點或消息流偵聽器/發布者與RabbitMQ、Kafka等一起公開給外部使用。
- 編程風格的選擇——反應式、命令式或混合式。
- 函數組合和適配(例如,組合命令式函數和響應式函數)。
- 支持響應式函數,具有多個輸入和輸出,允許函數處理合併、連接和其他複雜的流操作。
- 輸入和輸出的透明類型轉換。
- 針對目標平台(例如,Project Riff, AWS Lambda等)的部署打包功能
- 將函數作為HTTP端點等對外公開的適配器。
- 使用獨立的類加載器部署包含此類應用程式上下文的JAR文件,以便可以將它們打包到單個JVM中。
- 將作為Java函數體的字符串編譯成字節碼,然後將它們轉換成可以像上面那樣包裝的@bean。
- 適用於AWS Lambda、Azure、Google Cloud Functions、Apache OpenWhisk和其他可能的「serverless」服務提供商的適配器。
案例應用
函數可以自動導出為HTTP端點。
Spring -cloud-function-web模塊具有自動配置功能,當它被包含在Spring Boot web應用程式中時(帶有MVC支持)就會被激活。如果你只是想要一個簡單的入門體驗,spring-cloud-starter- functional -web也可以收集所有可選的依賴項。
激活web配置後,你的應用將會有一個MVC端點(默認值為"/",但可以通過spring.cloud.function.web.path配置),它可以用來訪問應用上下文中的函數,其中函數名成為URL路徑的一部分。支持的內容類型是純文本和JSON。
編號 |
Method |
Path |
request |
Response |
Status |
1 |
GET |
/{supplier} |
- |
Items from the named supplier |
200 OK |
2 |
POST |
/{consumer} |
JSON object or text |
Mirrors input and pushes request body into consumer |
202 Accepted |
3 |
POST |
/{consumer} |
JSON array or text with new lines |
Mirrors input and pushes body into consumer one by one |
202 Accepted |
4 |
POST |
/{function} |
JSON object or text |
The result of applying the named function |
200 OK |
5 |
POST |
/{function} |
JSON array or text with new lines |
The result of applying the named function |
200 OK |
6 |
GET |
/{function}/{item} |
- |
Convert the item into an object and return the result of applying the function |
200 OK |
針對以上6中情況,演示示例如下:
- 1 GET /{supplier}
@Bean
public Function<Flux<String>, Flux<String>> uppercase() {
return flux -> flux.map(value -> value.toUpperCase());
}
請求結果:
- 2 POST /{consumer}
@Bean
public Consumer<Person> consumer1() {
return person -> System.out.println("阻塞式調用:" + person) ;
}
請求結果:
- 3 POST /{consumer}
@Bean
public Consumer<Flux<Person>> consumer2() {
return person -> {
person.subscribe(System.out::println) ;
} ;
}
請求結果:
- 4 POST /{consumer}
@Bean
public Consumer<Flux<Person>> consumer3() {
return person -> {
person.subscribe(System.out::println) ;
} ;
}
請求結果:
- 6 GET /{function}/{item}
@Bean
public Function<Flux<Person>, Flux<Map<String, Object>>> function1() {
return person -> person.map(p -> {
Map<String, Object> result = new HashMap<>() ;
result.put("姓名", p.getName()) ;
result.put("年齡", p.getAge()) ;
return result ;
}) ;
}
請求結果:
完畢!!!
spring data jpa 高級應用
Spring Retry重試框架的應用
Spring容器這些擴展點你都清楚了嗎?
Spring MVC 異步請求方式
Spring MVC 異常處理方式
Spring事務實現原理源碼分析
Spring 自定義Advisor以編程的方式實現AOP
SpringBoot WebFlux整合Spring Security進行權限認證