探索GitHub顶级项目:Spring Boot在AWS EC2平台的实战应用

云信安装大师
90
AI 质量分
10 5 月, 2025
3 分钟阅读
0 阅读

探索GitHub顶级项目:Spring Boot在AWS EC2平台的实战应用

引言

Spring Boot作为GitHub上最受欢迎的Java框架之一,以其”约定优于配置”的理念大大简化了Spring应用的开发。而AWS EC2作为云计算的基石服务,为应用提供了弹性可扩展的计算能力。本文将带您从零开始,将一个Spring Boot项目部署到AWS EC2实例上,并分享实战中的关键技巧。

准备工作

环境要求

  1. AWS账号(免费层即可)
  2. JDK 11或以上版本
  3. Maven 3.6+
  4. Git客户端
  5. SSH客户端(如PuTTY或终端)

示例项目准备

我们将使用GitHub上的一个经典Spring Boot示例项目:

代码片段
git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic

第一步:创建AWS EC2实例

1.1 登录AWS控制台

访问AWS管理控制台,使用您的凭证登录。

1.2 启动EC2实例

  1. 导航到EC2服务
  2. 点击”启动实例”
  3. 选择Amazon Linux 2023 AMI(免费层适用)
  4. 选择t2.micro实例类型(免费层)
  5. 配置安全组:
    • 添加规则:SSH (22), HTTP (80), HTTPS (443)
  6. 创建新密钥对(保存.pem文件到安全位置)
代码片段
# 示例安全组配置命令(了解即可,通常通过控制台操作)
aws ec2 create-security-group --group-name my-springboot-sg --description "Security group for Spring Boot"
aws ec2 authorize-security-group-ingress --group-name my-springboot-sg --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name my-springboot-sg --protocol tcp --port 80 --cidr 0.0.0.0/0

注意事项:

  • 密钥对是连接EC2的唯一方式,务必妥善保管.pem文件
  • 安全组相当于防火墙规则,生产环境应限制IP范围

第二步:连接并配置EC2实例

2.1 SSH连接到实例

代码片段
chmod 400 your-key-pair.pem   # 关键步骤!修改密钥权限
ssh -i "your-key-pair.pem" ec2-user@your-instance-public-dns

2.2 安装必要软件

代码片段
# Java安装(Amazon Linux使用corretto)
sudo amazon-linux-extras enable corretto8
sudo yum install -y java-11-amazon-corretto-devel

# Maven安装
sudo wget https://mirrors.cnnic.cn/apache/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz -P /tmp/
sudo tar xf /tmp/apache-maven-*.tar.gz -C /opt/
sudo ln -s /opt/apache-maven-3.8.6 /opt/maven

# Git安装(通常已预装)
sudo yum install -y git

# MySQL安装(可选,用于持久化数据)
sudo yum install -y mysql-server

环境变量配置:

代码片段
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64' >> ~/.bashrc
echo 'export PATH=$PATH:/opt/maven/bin' >> ~/.bashrc
source ~/.bashrc

#验证安装:
java -version && mvn -v && git --version 

第三步:部署Spring Boot应用

3.1 Clone项目到EC2服务器

代码片段
git clone https://github.com/spring-projects/spring-petclinic.git 
cd spring-petclinic 

3.2 Maven打包应用

代码片段
mvn clean package 

这个命令会:
1. clean:清理target目录
2. package:编译代码并打包为可执行jar
3.(可选)-DskipTests跳过测试

经验分享

当内存不足时(t2.micro只有1GB内存),可以增加交换空间:

代码片段
sudo dd if=/dev/zero of=/swapfile bs=128M count=8 
sudo chmod 600 /swapfile 
sudo mkswap /swapfile 
sudo swapon /swapfile 

重要原理

Spring Boot的打包插件会创建一个”fat jar”,包含:
– Your compiled classes
– Your dependencies
– Embedded Tomcat server
– Spring Boot loader

查看生成的jar包结构:

代码片段
unzip -l target/*jar | more 

第四步:运行与维护

4种运行方式对比

方式 命令 特点 适用场景
直接运行 java -jar target/*jar Ctrl+C退出即停止 开发测试
后台运行 nohup java -jar target/*jar & SSH断开后继续运行 临时部署
Systemd服务 (见下方) 自动重启+日志管理 生产环境推荐
Docker容器 (进阶方案) 隔离环境+易扩展 CI/CD流水线

Systemd服务配置(推荐生产使用)

1)创建服务文件:

代码片段
sudo vi /etc/systemd/system/petclinic.service 

[Unit]
Description=PetClinic Spring Boot Service 
After=syslog.target 

[Service] 
User=ec2-user 
ExecStart=/usr/bin/java -jar /home/ec2-user/spring-petclinic/target/*jar 
SuccessExitStatus=143 

[Install] 
WantedBy=multi-user.target 

#启用服务:
sudo systemctl daemon-reload  
sudo systemctl enable petclinic  
sudo systemctl start petclinic  

#查看状态:  
journalctl -u petclinic.service -f #实时日志  
systemctl status petclinic.service #当前状态  

Nginx反向代理配置(可选)

虽然Spring Boot内置Tomcat可以直接暴露8080端口,但生产环境建议:

代码片段
sudo yum install nginx 

#编辑配置文件:  
sudo vi /etc/nginx/conf.d/petclinic.conf  

server {
    listen       80;
    server_name  你的域名或IP;

    location / {
        proxy_pass http://127:0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
} 

#启动Nginx:  
sudo systemctl enable nginx && sudo systemctl start nginx  

第五步:验证与监控

访问应用:

代码片段
http://<你的EC2公网IP>:8080/

关键检查点:

1)查看启动日志中的关键信息:

代码片段
cat nohup.out #或 journalctl查看systemd日志  

... Started PetClinicApplication in X seconds (JVM running for Y) ...
Tomcat started on port(s):8080 (http) with context path ''

常见问题排查

🔴 端口冲突netstat -tulnp检查占用情况
🟡 内存不足 → JVM参数调优 -Xmx512m
🟢 数据库连接失败 → application.properties检查

高级技巧

CI/CD自动化部署(概念示例)

.github/workflows/deploy.yml:

代码片段
name: Deploy to EC2 

on: [push] 

jobs:
 deploy:
 runs-on: ubuntu-latest

 steps:
   - uses: actions/checkout@v3

   # Maven构建阶段   
   - name: Set up JDK11   
     uses: actions/setup-java@v3   
     with: { java-version:'11', distribution:'corretto' }  

   # SSH部署阶段   
   - name: Install via SCP+SSH   
     uses: appleboy/scp-action@master   
     with: { host:${{ secrets.AWS_HOST }}, username:'ec2-user', key:${{ secrets.SSH_KEY }}, source:'target/*jar', target:'~/app/' }   

   # Systemd重启服务   
   run:|   
     ssh ${{ secrets.AWS_HOST }} 'systemctl restart petclinic'   

需要提前在GitHub仓库设置Secrets:AWSHOST、SSHKEY

总结

通过本教程我们完成了:

✅ Spring Boot项目打包与核心原理解析
✅ EC2实例创建与安全最佳实践
✅ Linux系统服务管理方案对比(Systemd vs nohup)
✅ Nginx反向代理配置技巧

延伸学习建议

📌 AWS Elastic Beanstalk更简单的PaaS方案
📌 ECS/EKS容器化部署进阶路线
📌 CloudFormation/Terraform基础设施即代码

欢迎在评论区分享你的部署经验!遇到问题可以提供详细的日志信息以便诊断。

原创 高质量