Spring Cloud的无服务器函数Bean简介

Spring Cloud函数可以实现无服务器功能,快速浏览Spring Cloud 2.0提供的一些改进,包括更快的启动和“全函数”的能力。而且,由于它是在Spring Boot之上构建的,因此不再需要servlet容器。Spring Cloud Function 2.0是基于Spring Boot 2.1和Spring Framework 5.1以上版本实现,不同于传统的Bean的定义,显著改善了在无服务器架构中的冷启动性能。

下面是1.0版本的Spring的云函数功能应用,通过@Configuration和@Bean等声明式注解一起实现:

@SpringBootApplication
<b>public</b> <b>class</b> DemoApplication {

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

  <b>public</b> <b>static</b> <b>void</b> main(String args) {
    SpringApplication.run(DemoApplication.<b>class</b>, args);
  }

}

可以在AWS Lambda中运行,还支持 Azure Functions
和 Apache OpenWhisk
,以及其他无服务器支持(例如 Oracle Fn
和 Riff
)。

spring-cloud-function-starter-web放在类路径中,就能访问端点:

$ curl localhost:8080 -d foo

返回的是大写FOO,说明上面代码中@Bean注解的函数转换功能起作用了。

1.0中Web适配器是使用Spring MVC实现的,这样你就需要启动一个Servlet容器才能运行Spring MVC。在Spring Cloud Function 2.0中,如果想使用Servlet容器,默认服务器是netty;还可以使用Webflux – 只需包含 spring-cloud-starter-function-webflux依赖项。

在2.0中,云函数功能实现代码有所区别:

@SpringBootConfiguration
<b>public</b> <b>class</b> DemoApplication
    implements ApplicationContextInitializer<GenericApplicationContext> {

  <b>public</b> <b>static</b> <b>void</b> main(String args) {
    FunctionalSpringApplication.run(DemoApplication.<b>class</b>, args);
  }

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

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

}
</font>

主要区别是:

  • 主要实现类是ApplicationContextInitializer。
  • @Bean方法已被转换为调用context.registerBean()
  • @SpringBootApplication已被替换@SpringBootConfiguration,表示不会让Spring启动后实现自动配置,但是仍然标记这个类作为一个启动“入口点”。
  • SpringApplication已经被替换为FunctionalSpringApplication,这是云功能新类(SpringApplication的一个子类)。

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

还有一种方法是使应用自己直接实现Function (或Consumer 或Supplier):

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

  <b>public</b> <b>static</b> <b>void</b> main(String args) {
    FunctionalSpringApplication.run(DemoApplication.<b>class</b>, args);
  }

  @Override
  <b>public</b> String apply(String value) {
    <b>return</b> value.toUpperCase();
  }

}

Spring Boot在函数功能bean注册方面运行良好 – Spring Cloud Function在Spring Boot基础上构建和运行 – 但Spring Boot中的一些最有用的功能,即自动配置,都是以非函数性方式编码的。与整个Spring Boot相比,大多数Spring Cloud Function应用程序的范围相对较小,因此我们可以轻松地将其适应这些功能bean定义。

原文 

https://www.jdon.com/50537

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring Cloud的无服务器函数Bean简介

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址