天天看點

Spring Cloud Function 快速入門

作者:Spring全家桶實戰案例

環境:SpringBoot2.3.12.RELEASE + Spring Cloud 2020.0.5

簡介

Spring Cloud Function是一個具有以下高層目标的項目:

  1. 通過函數促進業務邏輯的實作。
  2. 将業務邏輯的開發生命周期與任何特定的運作時目标解耦,這樣相同的代碼就可以作為web端點、流處理器或任務運作。
  3. 支援跨無伺服器(serverless)提供商的統一程式設計模型,以及獨立運作(本地或PaaS中)的能力。
  4. 在無服務(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等一起公開給外部使用。

  1. 程式設計風格的選擇——反應式、指令式或混合式。
  2. 函數組合和适配(例如,組合指令式函數和響應式函數)。
  3. 支援響應式函數,具有多個輸入和輸出,允許函數處理合并、連接配接和其他複雜的流操作。
  4. 輸入和輸出的透明類型轉換。
  5. 針對目标平台(例如,Project Riff, AWS Lambda等)的部署打包功能
  6. 将函數作為HTTP端點等對外公開的擴充卡。
  7. 使用獨立的類加載器部署包含此類應用程式上下文的JAR檔案,以便可以将它們打包到單個JVM中。
  8. 将作為Java函數體的字元串編譯成位元組碼,然後将它們轉換成可以像上面那樣包裝的@bean。
  9. 适用于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());
}           

請求結果:

Spring Cloud Function 快速入門

GET /{supplier}

  • 2 POST /{consumer}
@Bean
public Consumer<Person> consumer1() {
  return person -> System.out.println("阻塞式調用:" + person) ;
}           
Spring Cloud Function 快速入門

POST /{consumer}

Spring Cloud Function 快速入門

Result

  • 3 POST /{consumer}
@Bean
public Consumer<Flux<Person>> consumer2() {
  return person -> {
    person.subscribe(System.out::println) ;
  } ;
}           
Spring Cloud Function 快速入門

consumer2

Spring Cloud Function 快速入門
  • 4 POST /{consumer}
@Bean
public Consumer<Flux<Person>> consumer3() {
  return person -> {
    person.subscribe(System.out::println) ;
  } ;
}           
Spring Cloud Function 快速入門

POST /consumer

Spring Cloud Function 快速入門
  • 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 Cloud Function 快速入門

GET /{function}/{item}

完畢!!!

spring data jpa 進階應用

Spring Retry重試架構的應用

Spring容器這些擴充點你都清楚了嗎?

Spring MVC 異步請求方式

Spring MVC 異常處理方式

Spring事務實作原理源碼分析

Spring 自定義Advisor以程式設計的方式實作AOP

SpringBoot WebFlux整合Spring Security進行權限認證

Spring Cloud Function 快速入門
Spring Cloud Function 快速入門
Spring Cloud Function 快速入門
Spring Cloud Function 快速入門