環境: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 | JSON array or text with new lines | Mirrors input and pushes body into consumer one by one | |||
4 | /{function} | The result of applying the named function | |||
5 | |||||
6 | /{function}/{item} | Convert the item into an object and return the result of applying the function |
針對以上6中情況,示範示例如下:
- 1 GET /{supplier}
@Bean
public Function<Flux<String>, Flux<String>> uppercase() {
return flux -> flux.map(value -> value.toUpperCase());
}
請求結果:
GET /{supplier}
- 2 POST /{consumer}
@Bean
public Consumer<Person> consumer1() {
return person -> System.out.println("阻塞式調用:" + person) ;
}
POST /{consumer}
Result
- 3 POST /{consumer}
@Bean
public Consumer<Flux<Person>> consumer2() {
return person -> {
person.subscribe(System.out::println) ;
} ;
}
consumer2
- 4 POST /{consumer}
@Bean
public Consumer<Flux<Person>> consumer3() {
return person -> {
person.subscribe(System.out::println) ;
} ;
}
POST /consumer
- 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 ;
}) ;
}
GET /{function}/{item}
完畢!!!
spring data jpa 進階應用
Spring Retry重試架構的應用
Spring容器這些擴充點你都清楚了嗎?
Spring MVC 異步請求方式
Spring MVC 異常處理方式
Spring事務實作原理源碼分析
Spring 自定義Advisor以程式設計的方式實作AOP
SpringBoot WebFlux整合Spring Security進行權限認證