天天看点

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 快速入门