【问题标题】:Spring cloud function does not work with spring nativeSpring Cloud 功能不适用于 Spring Native
【发布时间】:2021-05-10 06:39:25
【问题描述】:

我一直在尝试复制这个aws function example 来部署一个具有spring cloud 功能和graalvm 的lambda。

该功能在本地工作,启动没有问题。

❯ ./demo
2021-05-10 15:56:17.964  INFO 10764 --- [           main] o.s.nativex.NativeListener               
: This application is bootstrapped with code generated with Spring AOT

.   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::                (v2.4.5)

2021-05-10 16:42:42.607  INFO 12792 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using Java 11.0.11 on loyalty-C02F70R8MD6R with PID 12792 (/Users/user/Workspace/learning/demo/target/demo started by user in /Users/user/Workspace/learning/demo/target)
2021-05-10 16:42:42.607  INFO 12792 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2021-05-10 16:42:42.637  INFO 12792 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
May 10, 2021 4:42:42 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
May 10, 2021 4:42:42 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Tomcat]
May 10, 2021 4:42:42 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.45]
May 10, 2021 4:42:42 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring embedded WebApplicationContext
2021-05-10 16:42:42.640  INFO 12792 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 32 ms
2021-05-10 16:42:42.650  INFO 12792 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
May 10, 2021 4:42:42 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
2021-05-10 16:42:42.658  INFO 12792 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-05-10 16:42:42.658  INFO 12792 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 0.071 seconds (JVM running for 0.072)

但是,当我将它部署到 aws 时,它失败并出现以下异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop.<init>()
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1316) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1214) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[na:na]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[na:na]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[na:na]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782) ~[demo:na]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774) ~[demo:na]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[demo:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) ~[demo:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340) ~[demo:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[demo:na]
at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[demo:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop.<init>()
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1308) ~[na:na]
... 18 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop.<init>()
at java.lang.Class.getConstructor0(DynamicHub.java:3349) ~[na:na]
at java.lang.Class.getDeclaredConstructor(DynamicHub.java:2553) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) ~[na:na]
... 19 common frames omitted

我检查了 CustomRuntimeEventLoop,发现这个类被注释了

@Configuration
@ConditionalOnProperty("AWS_LAMBDA_RUNTIME_API")

这意味着它仅在 AWS 环境中被初始化。这就是该功能没有在本地失败的原因。我尝试通过将以下 sn-p 添加到我的 Spring Boot 应用程序来在构建时初始化该类

@NativeHint(initialization = {@InitializationHint(types = {CustomRuntimeEventLoop.class}, initTime = BUILD)})

但这仍然没有影响构建或运行时行为。

知道如何在构建时初始化它吗?

【问题讨论】:

  • 您复制的样本非常旧。如果我是你,我会从“main”(github.com/spring-projects-experimental/spring-native/blob/main/…)中的那个开始并修改它。注意父pom中定义的插件。
  • 您为什么更喜欢使用第 3 方 API 而不是官方 AWS SDK for Java API V2(它也为您提供 AWS SDK 团队的支持)?您可以将 AWS Java V2 API 与 Spring 框架一起使用。
  • 我更新了 OP 复制的样本,现在它可以工作了:github.com/dsyer/lambda-aws-demo。 FWIW Spring Cloud 使用 AWS SDK 作为库,所以我认为它在任何方面都不是真正的“非官方”。反正对我有用。
  • 谢谢@DaveSyer

标签: amazon-web-services java-11 graalvm spring-cloud-function spring-native


【解决方案1】:

你有没有看到这个例子 - https://github.com/spring-projects-experimental/spring-native/tree/main/samples/cloud-function-aws

此外,新的CustomRuntimeEventLoop 存在一些问题已得到解决,因此请考虑使用最新的快照。

【讨论】:

  • 谢谢,这个示例和@DavesSyer 评论帮助我启动并运行了我的演示,这是一个正在运行的演示github.com/muhamadto/spring-native-aws-lambda
  • 酷。仅供参考,s-c-function 3.1.3 刚刚发布,所以我提到的所有修复都在那里。
  • 将 org.springframework.cloud:spring-cloud-dependencies:2020.0.2 升级到 2020.0.3 导致服务在 aws 中进入循环。以下内容不断打印 o.s.c.f.web.source.SupplierExporter :发布到:origin reactor.Mono.Peek.169 :onSubscribe(FluxPeek.PeekSubscriber) reactor.Mono.Peek.169 :request(32) reactor.Mono.Peek.169 : onNext(org.springframework.web.reactive.function.client.DefaultClientRespon reactor.Mono.Peek.169:onComplete()reactor.Flux.MonoRepeatPredicate.1:请求(1)reactor.Flux.MonoRepeatPredicate.1:onNext(GenericMessage [有效载荷={"name":"value1"}, hea
  • 您能否将您的应用发布到 Github 的某个位置,以便我们查看?上面的堆栈跟踪没有提供任何相关信息
  • 嘿@Oleg,我发现了问题。当我将依赖项从 org.springframework.cloud:spring-cloud-dependencies:2020.0.2 升级到 org.springframework.cloud:spring-cloud-dependencies:2020.0.3 时发生这种情况。你可以在这里找到项目github.com/muhamadto/spring-native-aws-lambda.git,我把它恢复了,所以现在它可以工作了
猜你喜欢
  • 2018-04-19
  • 2020-10-24
  • 2021-03-31
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 2018-08-17
  • 2019-03-26
  • 2020-10-15
相关资源
最近更新 更多