要在 AWS 上运行你的 Spring Boot Web 应用,最常见的方法是使用 AWS Elastic Beanstalk 或 AWS Lambda。以下是如何通过这两种方式部署 Spring Boot 应用的详细步骤:
方法 1:使用 AWS Elastic Beanstalk
AWS Elastic Beanstalk 是 AWS 提供的全托管平台,能够自动处理应用程序的部署、扩展和监控。它非常适合传统的 Spring Boot Web 应用。
1. 打包 Spring Boot 应用
- 先确保你的 Spring Boot 应用可以打包为一个可执行的 JAR 文件。通常你会在项目目录中运行以下命令:
或者如果使用 Gradle:./mvnw clean package
这会在./gradlew clean build
target
目录下生成一个*.jar
文件。
2. 设置 AWS Elastic Beanstalk
- 登录 AWS Management Console。
- 搜索并进入 Elastic Beanstalk 服务。
- 点击 Create Application,然后填写应用的名称。
- 选择平台为 Java,并指定合适的 Java 版本(比如 Java 11)。
- 在 Source Code 部分上传你打包好的
*.jar
文件。 - 点击 Create Application,AWS 会自动为你创建一个 EC2 实例,并将你的 Spring Boot 应用部署到该实例上。
3. Elastic Beanstalk 自动管理
- Elastic Beanstalk 会自动为你处理服务器配置、负载均衡和扩展。你可以通过管理控制台监控应用的健康状态,甚至配置自动扩展策略。
- 部署完成后,你可以通过分配的 URL 访问你的 Spring Boot 应用。
方法 2:使用 AWS Lambda + API Gateway(无服务器)
如果你希望使用无服务器架构,可以通过 AWS Lambda 部署 Spring Boot 应用。不过,由于 Lambda 适合运行较小的任务,Spring Boot 需要一些额外的设置。你可以使用 AWS Serverless Java Container 库来支持 Spring Boot。
1. 改造应用以支持 AWS Lambda
- 引入 AWS Serverless Java Container 依赖。将以下依赖添加到你的
pom.xml
:<dependency> <groupId>com.amazonaws.serverless</groupId> <artifactId>aws-serverless-java-container-springboot2</artifactId> <version>1.5</version> </dependency>
2. 创建 Lambda 入口类
创建一个新类 StreamLambdaHandler
,它将作为你的 Lambda 函数的入口:
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import java.io.InputStream;
import java.io.OutputStream;
public class StreamLambdaHandler implements RequestStreamHandler {
private static SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
static {
try {
handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(MySpringBootApplication.class);
} catch (ContainerInitializationException e) {
e.printStackTrace();
throw new RuntimeException("Could not initialize Spring Boot application", e);
}
}
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
handler.proxyStream(inputStream, outputStream, context);
}
}
3. 打包并部署到 AWS Lambda
- 使用 Maven 或 Gradle 打包应用为一个
*.jar
文件。这个步骤和 Elastic Beanstalk 类似。 - 使用 AWS SAM(Serverless Application Model)或 AWS Management Console 创建 Lambda 函数,上传
*.jar
文件,并配置触发器,比如通过 API Gateway 来触发 HTTP 请求。
4. 配置 API Gateway
- 创建一个 API Gateway,配置 RESTful API 接口,设置触发器为 AWS Lambda,并将 API 请求转发到你的 Lambda 函数上。
- 部署 API Gateway,你会得到一个可以访问的 URL,这个 URL 就相当于是你无服务器 Spring Boot 应用的入口。
总结
- AWS Elastic Beanstalk 更适合传统的 Spring Boot Web 应用,它能提供全托管的服务器环境,适合需要长时间运行的 Web 应用。
- AWS Lambda 则适合无服务器架构,可以通过 API Gateway 实现 HTTP 请求处理,但需要将 Spring Boot 适配为 AWS Lambda 环境。
对于大多数情况,如果你的应用是一个常规的 Web 应用,Elastic Beanstalk 是更简单的选择。如果你想尝试无服务器架构,Lambda 也是一个不错的选择,但需要一些额外的设置。