我正在向 AWS Lambda 部署一个相当简单的 Spring Cloud 函数,并且遇到了冷启动缓慢的问题,并且在部署后调用该函数时偶尔会出现故障。
首先,这是我的单节课。(最终这个函数将对数据库进行一些域记录查找,所以这里使用的名称“域”相当自由。我还删除了任何实际的数据处理,只是返回字符串。
<< imports >>
@SpringBootConfiguration
public class DomainApplication implements ApplicationContextInitializer<GenericApplicationContext> {
private static Log logger = LogFactory.getLog(DomainApplication.class);
public static void main(String[] args) throws Exception {
FunctionalSpringApplication.run(DomainApplication.class, args);
}
public Supplier<String> domains(){
return () -> {
logger.info("Return a List of Domains");
return "All Domains";
};
}
public Function<String, String> domain() {
return value -> {
logger.info("Return A Single Domains");
return "This Domain" + value;
};
}
@Override
public void initialize(GenericApplicationContext context) {
context.registerBean("domain", FunctionRegistration.class,
() -> new FunctionRegistration<Function<String, String>>(domain())
.type(FunctionType.from(String.class).to(String.class).getType()));
context.registerBean("domains", FunctionRegistration.class,
() -> new FunctionRegistration<Supplier<String>>(domains())
.type(FunctionType.from(String.class).to(String.class).getType()));
}
}
这是项目的依赖项:
...
set('springCloudVersion', '2.1.0.RELEASE')
...
implementation "org.springframework.cloud:spring-cloud-function-context:${springCloudVersion}"
implementation "org.springframework.cloud:spring-cloud-starter-function-webflux:${springCloudVersion}"
implementation "org.springframework.cloud:spring-cloud-function-adapter-aws:${springCloudVersion}"
implementation 'com.amazonaws:aws-lambda-java-core:1.2.0'
implementation 'com.amazonaws:aws-lambda-java-events:2.2.6'
testCompile("org.springframework.boot:spring-boot-starter-test:${springCloudVersion}")
现在,当我将应用程序的“shadowJar”版本打包并部署到 AWS Lambda 时,启动日志显示连接被拒绝失败:
2019-05-14 20:45:21.205 ERROR 1 --- [or-http-epoll-3] reactor.Flux.MonoRepeatPredicate.1 : onError(io.netty.channel.AbstractChannel$AnnotatedConnectException: syscall:getsockopt(..) failed: Connection refused: localhost/127.0.0.1:80)
... 启动尝试在本地连接到端口 80 是否有原因?(同样重要的是——我可以把它关掉吗?)