腾讯云CentOS7.5服务器上,手把手教你搞定Spring Boot项目从打包到上线的完整流程

腾讯云CentOS7.5服务器Spring Boot项目全流程部署实战

在当今快速迭代的互联网开发中,将本地开发完成的Spring Boot项目部署到云端服务器是每位开发者必须掌握的技能。本文将带你从零开始,完整走通从项目打包到线上运行的全过程,特别针对腾讯云CentOS7.5环境进行优化,解决实际部署中的各种"坑点"。

1. 环境准备与服务器配置

部署Spring Boot项目前,确保服务器环境准备充分是关键。腾讯云CentOS7.5作为稳定可靠的Linux发行版,是Java项目部署的理想选择。

1.1 服务器基础配置

首先登录腾讯云控制台,在实例列表中找到你的云服务器公网IP。推荐使用SSH密钥对方式登录,安全性更高:

ssh -i your_key.pem root@your_server_ip

登录后,建议先执行系统更新:

yum update -y && yum upgrade -y

注意:生产环境建议创建普通用户而非直接使用root,可通过 adduser deploy 创建部署专用账户

1.2 JDK环境安装

Spring Boot项目需要Java运行环境,推荐安装与开发环境一致的JDK版本。以下是JDK11的安装步骤:

# 安装OpenJDK11
yum install -y java-11-openjdk-devel

# 验证安装
java -version

若需特定版本Oracle JDK,可手动下载rpm包安装:

wget https://download.oracle.com/java/11/latest/jdk-11_linux-x64_bin.rpm
rpm -ivh jdk-11_linux-x64_bin.rpm

配置环境变量:

echo 'export JAVA_HOME=/usr/java/jdk-11.0.xx' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile

2. 项目打包与优化

2.1 Maven打包配置

在本地开发环境,确保pom.xml中包含Spring Boot Maven插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

执行打包命令:

mvn clean package -DskipTests

打包优化技巧

  • 使用 -DskipTests 跳过测试加快打包速度
  • 生产环境建议添加 -Pprod 使用生产环境配置
  • 可执行jar包通常位于target目录下,命名格式为 项目名-版本号.jar

2.2 上传部署包到服务器

推荐使用scp命令直接上传,避免图形化工具依赖:

scp -i your_key.pem target/your-project.jar deploy@your_server_ip:/home/deploy

对于较大项目,可先压缩再上传:

tar -czvf project.tar.gz target/your-project.jar
scp -i your_key.pem project.tar.gz deploy@your_server_ip:/home/deploy
ssh deploy@your_server_ip "tar -xzvf /home/deploy/project.tar.gz -C /home/deploy"

3. 服务器端部署实战

3.1 基础启动与测试

最简单的启动方式:

java -jar your-project.jar

但这种前台运行方式在SSH断开后会终止进程。推荐使用nohup:

nohup java -jar your-project.jar > app.log 2>&1 &

关键参数说明

参数 作用 示例值
-Dserver.port 指定服务端口 8080
-Dspring.profiles.active 指定环境配置 prod
-Xms JVM初始堆大小 256m
-Xmx JVM最大堆大小 1024m

3.2 生产级部署方案

3.2.1 Systemd服务化管理

创建服务配置文件 /etc/systemd/system/your-service.service

[Unit]
Description=Your Spring Boot Application
After=syslog.target network.target

[Service]
User=deploy
ExecStart=/usr/bin/java -jar /home/deploy/your-project.jar
SuccessExitStatus=143
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

启用并启动服务:

systemctl daemon-reload
systemctl enable your-service
systemctl start your-service
3.2.2 日志管理配置

Spring Boot默认使用Logback,可在application.properties中配置:

logging.file.name=app.log
logging.file.max-size=10MB
logging.file.max-history=7
logging.level.root=INFO
logging.level.com.yourpackage=DEBUG

推荐使用logrotate进行日志轮转:

# /etc/logrotate.d/your-app
/home/deploy/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

4. 常见问题排查与优化

4.1 端口冲突解决

检查端口占用:

netstat -tulnp | grep :8080

若需修改Spring Boot端口,可通过以下任一方式:

  1. 启动参数: java -jar your-app.jar --server.port=9090
  2. 配置文件: application.properties 中添加 server.port=9090
  3. 环境变量: export SERVER_PORT=9090

4.2 内存优化配置

根据服务器配置调整JVM参数:

java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -jar your-app.jar

内存配置参考表

服务器内存 Xms Xmx 建议场景
1GB 256m 512m 小型测试环境
2GB 512m 1536m 中型应用
4GB+ 1g 3g 生产环境

4.3 数据库连接配置

确保application-prod.properties中包含正确的生产数据库配置:

spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useSSL=false
spring.datasource.username=dbuser
spring.datasource.password=securepassword
spring.jpa.hibernate.ddl-auto=validate

重要:永远不要在版本控制中提交生产数据库密码,推荐使用环境变量或配置中心

5. 高级部署技巧

5.1 蓝绿部署方案

为实现零停机更新,可采用以下步骤:

  1. 新版本部署到不同端口(如8081)
  2. 配置Nginx进行流量切换:
upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081 backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}
  1. 通过API测试新版本
  2. 切换Nginx配置,将8081设为主节点
  3. 逐步停止旧版本

5.2 健康检查与监控

Spring Boot Actuator提供丰富的监控端点:

management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=always

配合Prometheus监控:

<!-- pom.xml添加依赖 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

配置application.properties:

management.metrics.export.prometheus.enabled=true

5.3 安全加固措施

  1. 禁用不必要的Actuator端点:
management.endpoints.web.exposure.exclude=env,beans
  1. 添加HTTP基本认证:
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(EndpointRequest.toAnyEndpoint())
            .authorizeRequests().anyRequest().authenticated()
            .and().httpBasic();
    }
}
  1. 配置服务器防火墙:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

6. 持续集成与自动化部署

6.1 GitHub Actions自动化

创建 .github/workflows/deploy.yml

name: Deploy to Tencent Cloud

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
    - name: Build with Maven
      run: mvn clean package -DskipTests
    - name: Deploy to Server
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_SSH_KEY }}
        source: "target/*.jar"
        target: "/home/deploy"
    - name: Restart Service
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_SSH_KEY }}
        script: |
          sudo systemctl restart your-service

6.2 使用Docker容器化部署

创建Dockerfile:

FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建并运行:

docker build -t your-app .
docker run -p 8080:8080 -d your-app

使用Docker Compose管理依赖:

version: '3'
services:
  app:
    image: your-app
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=appdb

7. 性能调优实战

7.1 JVM调优参数

生产环境推荐配置:

java -server \
     -Xms2g -Xmx2g \
     -XX:MaxMetaspaceSize=512m \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -XX:ParallelGCThreads=4 \
     -XX:ConcGCThreads=2 \
     -XX:+HeapDumpOnOutOfMemoryError \
     -jar your-app.jar

关键GC参数对比

GC算法 适用场景 优点 缺点
Serial GC 单核小内存 简单高效 停顿时间长
Parallel GC 多核CPU 吞吐量高 内存占用大
CMS GC 低延迟需求 并发收集 内存碎片
G1 GC 大内存应用 可预测停顿 复杂配置

7.2 Tomcat优化(嵌入式)

在application.properties中配置:

server.tomcat.max-threads=200
server.tomcat.min-spare-threads=10
server.tomcat.accept-count=100
server.tomcat.connection-timeout=5000
server.tomcat.max-connections=10000

7.3 数据库连接池优化

HikariCP推荐配置:

spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.leak-detection-threshold=5000

8. 备份与灾备方案

8.1 应用备份策略

  1. 定期备份应用jar包:
tar -czvf /backups/app_$(date +%Y%m%d).tar.gz /home/deploy/your-app.jar
  1. 使用cron定时任务:
# 每周日凌晨3点备份
0 3 * * 0 tar -czvf /backups/app_$(date +\%Y\%m\%d).tar.gz /home/deploy/your-app.jar

8.2 数据库备份方案

MySQL定期备份:

mysqldump -u root -p your_db > /backups/db_$(date +%Y%m%d).sql

配合cron实现自动化:

# 每天凌晨2点备份
0 2 * * * mysqldump -u root -pPassword your_db > /backups/db_$(date +\%Y\%m\%d).sql

8.3 全站快照策略

腾讯云控制台提供磁盘快照功能,建议:

  • 每周执行一次系统盘快照
  • 每天增量备份数据盘
  • 重大更新前手动创建快照
# 通过CLI创建快照(需安装腾讯云CLI工具)
tccli cbs CreateSnapshot --DiskId disk-xxxx --SnapshotName "Before_Update_$(date +%Y%m%d)"

9. 安全防护进阶

9.1 SSL证书配置

使用Let's Encrypt免费证书:

yum install -y certbot
certbot certonly --standalone -d yourdomain.com

Spring Boot配置HTTPS:

server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=yourpassword

9.2 防火墙深度配置

只开放必要端口:

firewall-cmd --permanent --add-port=22/tcp   # SSH
firewall-cmd --permanent --add-port=443/tcp  # HTTPS
firewall-cmd --permanent --add-port=80/tcp   # HTTP
firewall-cmd --permanent --remove-service=dhcpv6-client
firewall-cmd --reload

9.3 入侵检测系统

安装fail2ban防止暴力破解:

yum install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban

配置 /etc/fail2ban/jail.local

[sshd]
enabled = true
maxretry = 3
bantime = 1h

10. 成本优化技巧

10.1 资源监控与调整

使用腾讯云监控查看资源使用率:

# 安装云监控Agent
wget https://mirrors.tencent.com/install/monitor/linux_stable/tencentcloud_monitor_install.sh
chmod +x tencentcloud_monitor_install.sh
./tencentcloud_monitor_install.sh

资源调整建议

  • CPU持续>70%超过1小时 → 考虑升级
  • 内存使用<30%持续1周 → 考虑降配
  • 带宽峰值<50% → 调整带宽计费模式

10.2 按量计费优化

  1. 非生产环境可设置定时开关机
  2. 利用竞价实例降低成本(适合可中断任务)
  3. 购买预留实例券获得长期折扣

10.3 日志与存储优化

  1. 设置日志自动清理:
find /var/log -name "*.log" -type f -mtime +7 -delete
  1. 使用OSS存储静态资源
  2. 启用腾讯云COS生命周期管理自动归档旧文件

11. 真实案例:博客系统部署实战

以典型Spring Boot博客系统为例,分享实际部署中的经验:

  1. 配置分离 :将敏感信息如数据库密码、API密钥等移至环境变量
  2. 静态资源处理 :使用Nginx直接服务静态文件,减轻Java应用负担
  3. 缓存配置 :集成Redis缓存热门文章和页面
  4. 搜索优化 :为Elasticsearch配置单独的内存分配
  5. 定时任务 :使用Spring Scheduler时注意线程池配置
// 示例:生产环境线程池配置
@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(5);
    scheduler.setThreadNamePrefix("blog-scheduler-");
    scheduler.setAwaitTerminationSeconds(60);
    scheduler.setWaitForTasksToCompleteOnShutdown(true);
    return scheduler;
}

12. 故障应急手册

12.1 服务不可用排查流程

  1. 检查服务状态: systemctl status your-service
  2. 查看日志: journalctl -u your-service -n 100 -f
  3. 检查端口监听: ss -tulnp | grep java
  4. 验证数据库连接: telnet db_host 3306
  5. 检查磁盘空间: df -h du -sh /path

12.2 常见错误解决方案

问题1 :端口冲突

  • 解决方案:修改 server.port 或终止占用进程

问题2 :内存溢出

  • 解决方案:分析heap dump,调整Xmx参数

问题3 :数据库连接耗尽

  • 解决方案:优化连接池配置,检查慢查询

问题4 :文件权限问题

  • 解决方案:确保运行用户有读写权限: chown -R deploy:deploy /path/to/app

12.3 回滚操作指南

  1. 停止当前服务: systemctl stop your-service
  2. 恢复备份jar包: cp /backups/app_20230101.jar /home/deploy/
  3. 重启服务: systemctl start your-service
  4. 验证功能: curl -I http://localhost:8080/health

13. 监控与告警体系

13.1 基础监控配置

  1. 系统级监控:

    • CPU使用率
    • 内存占用
    • 磁盘I/O
    • 网络流量
  2. 应用级监控:

    • JVM内存
    • GC频率
    • 线程状态
    • HTTP请求量

13.2 Prometheus+Grafana方案

部署Prometheus监控Spring Boot:

# prometheus.yml 配置示例
scrape_configs:
  - job_name: 'spring'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['your-app:8080']

关键监控指标:

  • jvm_memory_used_bytes
  • tomcat_threads_busy_threads
  • http_server_requests_seconds_count
  • process_cpu_usage

13.3 告警规则设置

示例告警规则:

groups:
- name: spring-alerts
  rules:
  - alert: HighErrorRate
    expr: rate(http_server_requests_seconds_count{status=~"5.."}[1m]) / rate(http_server_requests_seconds_count[1m]) > 0.05
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High error rate on {{ $labels.instance }}"
      description: "Error rate is {{ $value }}"

14. 扩展与集群部署

14.1 负载均衡配置

使用Nginx作为负载均衡器:

upstream backend {
    least_conn;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;
}

server {
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
    }
}

14.2 分布式Session方案

  1. Spring Session + Redis:
<!-- pom.xml 添加依赖 -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

配置application.properties:

spring.session.store-type=redis
spring.redis.host=your-redis-host

14.3 配置中心集成

使用Nacos作为配置中心:

// 启动类添加注解
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

bootstrap.properties配置:

spring.application.name=your-app
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties

15. 现代化部署演进

15.1 Kubernetes集群部署

创建Deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: your-app
  template:
    metadata:
      labels:
        app: your-app
    spec:
      containers:
      - name: app
        image: your-registry/your-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"

15.2 Service Mesh集成

通过Istio实现高级流量管理:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: your-app
spec:
  hosts:
  - your-app.example.com
  http:
  - route:
    - destination:
        host: your-app
        subset: v1
      weight: 90
    - destination:
        host: your-app
        subset: v2
      weight: 10

15.3 Serverless方案

腾讯云Serverless部署:

# serverless.yml
component: springboot
name: your-app

inputs:
  src: ./target/your-app.jar
  region: ap-guangzhou
  runtime: Java8
  memorySize: 512
  timeout: 10
  environment:
    variables:
      SPRING_PROFILES_ACTIVE: prod

部署命令:

sls deploy

16. 开发与运维协作

16.1 标准化部署文档

建议包含以下内容:

  1. 服务器规格要求
  2. 依赖软件及版本
  3. 部署步骤checklist
  4. 健康检查API列表
  5. 监控指标说明
  6. 常见问题速查表

16.2 变更管理流程

  1. 预发布环境验证
  2. 变更窗口申请
  3. 分批次灰度发布
  4. 发布后监控
  5. 回滚预案准备

16.3 性能基准测试

使用JMeter进行压力测试:

jmeter -n -t your_test.jmx -l result.jtl

关键测试指标:

  • 平均响应时间<500ms
  • 错误率<0.1%
  • 95线<1s
  • 吞吐量>100rps

17. 前沿技术展望

17.1 GraalVM原生镜像

将Spring Boot编译为原生可执行文件:

native-image -jar your-app.jar \
             -H:Name=your-app \
             --initialize-at-build-time=org.springframework \
             -J-Xmx6G

优势:

  • 启动时间<100ms
  • 内存占用减少2/3
  • 无需JVM环境

17.2 服务网格优化

利用Linkerd实现零代码修改的微服务治理:

  1. 自动重试失败请求
  2. 智能负载均衡
  3. 透明TLS加密
  4. 细粒度流量控制

17.3 AI运维辅助

  1. 异常检测:自动识别异常模式
  2. 根因分析:智能定位问题源头
  3. 容量预测:基于历史数据预测资源需求
  4. 自愈系统:自动执行修复操作

18. 经验总结与最佳实践

经过多个项目的实战部署,总结出以下黄金法则:

  1. 环境一致性 :开发、测试、生产环境保持高度一致
  2. 配置外置 :所有环境相关配置通过外部化方式管理
  3. 健康检查 :实现完善的健康检查接口
  4. 优雅停机 :确保服务关闭时处理完现有请求
  5. 监控先行 :先搭建监控再上线服务
  6. 渐进式发布 :采用金丝雀发布降低风险
  7. 文档即代码 :将部署文档纳入版本控制
  8. 自动化一切 :减少人工操作带来的不确定性
// 示例:优雅停机处理
@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(connector -> {
        connector.setProperty("relaxedQueryChars", "|{}[]");
        connector.setProperty("relaxedPathChars", "|{}[]");
    });
    factory.addConnectorCustomizers(new GracefulShutdown());
    return factory;
}

private static class GracefulShutdown implements TomcatConnectorCustomizer {
    private volatile Connector connector;
    
    @Override
    public void customize(Connector connector) {
        this.connector = connector;
    }
    
    public void pause() {
        connector.pause();
        connector.getProtocolHandler().getExecutor().shutdown();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值