在之前的 几篇 文章中,我描述了如何设置Spring Boot应用程序并在AWS Elastic Beanstalk上运行它。 尽管这是从物理服务器到云服务器的伟大一步,但还有更好的可能! 走向无服务器 。 这意味着无需花费任何服务器费用,也无需维护或配置服务器! 听起来不错吧? 结合使用AWS Lambda和AWS API Gateway , AWS使得无服务器变得非常容易。 在这篇文章中,我将描述运行在Elastic BeanStalk上的Spring Boot应用程序要在无服务器上运行相同功能时需要做什么。
我采取的第一步是摆脱Spring Boot依赖关系,因为我们不再需要该容器了。 我用Spring Core和Spring Configuration的依赖关系替换了它们。 此外,还对插件进行了更改,以构建可用于AWS Lambda的jar。
pom最重要的部分来自于此:
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
...
对此:
...
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
...
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
...
下一步是修改Java代码,以便通过实现AWS Lambda接口来调用RestController功能:
public class LambdaFunctionHandler implements RequestHandler<InvoiceRequest, InvoiceResponse> {
private static final Logger LOGGER = LoggerFactory.getLogger(EasyInvoiceController.class);
private EasyInvoiceController easyInvoiceController;
@Override
public InvoiceResponse handleRequest(InvoiceRequest input, Context context) {
easyInvoiceController = Application.getBean(EasyInvoiceController.class);
InvoiceResponse result = null;
try {
result = easyInvoiceController.generate(input);
} catch (ExecutionException e) {
LOGGER.error(e);
} catch (InterruptedException e) {
LOGGER.error(e);
}
return result;
}
}
使用此类(以及一些普通的Spring配置),最初由传入HTTP请求调用的RestController功能现在由Lambda请求调用。
就我而言,我也可以摆脱我的Spring Security代码,因为我不需要保护Lambda代码中的传入请求,因为这将在API网关中完成。
下一步是上载Lambda功能(目标文件夹中生成的jar文件),并通过对其进行测试来确保其正常工作。 我利用了S3存储桶上传工具,并添加了一些环境变量:
最后一步是通过定义API从API网关调用Lambda。 有关示例,请参见屏幕截图:
我必须说,这种无服务器体系结构可能不适用于所有用例,但至少在设计新的应用程序/(微)服务时或无论如何进行体系结构更改时都应考虑它。
另一个需要注意的是,我花了相当多的精力才能使API网关与我创建的Lambda一起使用,但是我仍然认为这对于某些情况是一个很好的解决方案。
翻译自: https://www.javacodegeeks.com/2016/12/making-spring-boot-application-run-serverless-aws.html