SpringCloud 将功能与传统的Bean定义进行比较

2024-01-06 11:16 更新

这是一种普通的Spring Cloud函数应用程序,具有相似的@Configuration@Bean声明样式:

@SpringBootApplication
public class DemoApplication {

  @Bean
  public Function<String, String> uppercase() {
    return value -> value.toUpperCase();
  }

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

}

您可以在无服务器平台(如AWS Lambda或Azure Functions)中运行以上命令,也可以仅在类路径中包含spring-cloud-function-starter-web,即可在其自己的HTTP服务器中运行上述命令。运行main方法将公开一个端点,您可以使用该端点ping uppercase函数:

$ curl localhost:8080 -d foo
FOO

spring-cloud-function-starter-web中的web适配器使用Spring MVC,因此您需要一个Servlet容器。您也可以在默认服务器为netty的地方使用Webflux(即使您仍然愿意使用Servlet容器),也可以使用spring-cloud-starter-function-webflux依赖项。 功能相同,并且两者都可以使用用户应用程序代码。

现在,对于功能beans:用户应用程序代码可以重铸为“功能”形式,如下所示:

@SpringBootConfiguration
public class DemoApplication implements ApplicationContextInitializer<GenericApplicationContext> {

  public static void main(String[] args) {
    FunctionalSpringApplication.run(DemoApplication.class, args);
  }

  public Function<String, String> uppercase() {
    return value -> value.toUpperCase();
  }

  @Override
  public void initialize(GenericApplicationContext context) {
    context.registerBean("demo", FunctionRegistration.class,
        () -> new FunctionRegistration<>(uppercase())
            .type(FunctionType.from(String.class).to(String.class)));
  }

}

主要区别在于:

  • 主要类是ApplicationContextInitializer
  • @Bean方法已转换为对context.registerBean()的调用
  • @SpringBootApplication已替换为@SpringBootConfiguration,以表示我们未启用Spring引导自动配置,但仍将该类标记为“入口点”。
  • Spring Boot中的SpringApplication已被Spring Cloud函数中的FunctionalSpringApplication取代(它是一个子类)。

您在Spring Cloud Function应用程序中注册的业务逻辑beans的类型为FunctionRegistration这是一个包装,其中包含函数以及有关输入和输出类型的信息。在本应用程序的@Bean形式中,信息可以反射性地导出,但是在功能性bean注册中,除非我们使用FunctionRegistration,否则其中的一些信息会丢失。

使用ApplicationContextInitializerFunctionRegistration的替代方法是使应用程序本身实现Function(或ConsumerSupplier)。 示例(与上述等效):

@SpringBootConfiguration
public class DemoApplication implements Function<String, String> {

  public static void main(String[] args) {
    FunctionalSpringApplication.run(DemoApplication.class, args);
  }

  @Override
  public String uppercase(String value) {
    return value.toUpperCase();
  }

}

如果您添加类型为Function的独立类,并使用run()方法的另一种形式向SpringApplication注册,它也将起作用。最主要的是,泛型类型信息可在运行时通过类声明获得。

如果您添加spring-cloud-starter-function-webflux,则该应用程序将在其自己的HTTP服务器上运行(由于尚未实现嵌入式Servlet容器的功能形式,因此它目前无法与MVC启动器一起使用)。该应用程序还可以在AWS Lambda或Azure Functions中正常运行,并且启动时间的改善是巨大的。

“精简型” web服务器对Function签名的范围有一些限制-特别是它(目前)还不支持Message输入和输出,但是POJO和任何类型的Publisher应该没事。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号