SpringCloud 将功能与传统的Bean定义进行比较
这是一种普通的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
,否则其中的一些信息会丢失。
使用ApplicationContextInitializer
和FunctionRegistration
的替代方法是使应用程序本身实现Function
(或Consumer
或Supplier
)。
示例(与上述等效):
@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
应该没事。
更多建议: