Java Spring Boot 项目从创建到上线的完整流程梳理

下面是一个 Java Spring Boot 项目从创建到上线的完整流程梳理,我会分为 6 个主要阶段:


1. 项目创建与初始化

(1) 创建项目

  • 方式一:使用 Spring Initializr
    • 选择依赖:Spring Web、Spring Data JPA、MySQL Driver、Lombok 等
    • 生成项目并解压
  • 方式二:使用 IDE(IntelliJ IDEA)
    • File → New → Project → Spring Initializr
  • 方式三:命令行创建
    curl https://start.spring.io/starter.zip -d dependencies=web,data-jpa,mysql \
    -d type=maven-project -d groupId=com.example -d artifactId=myapp -o myapp.zip

(2) 项目结构

myapp/
├── src/
│   ├── main/
│   │   ├── java/com/example/myapp/
│   │   │   ├── MyappApplication.java      # 主启动类
│   │   │   ├── controller/                # 控制器层
│   │   │   ├── service/                   # 服务层
│   │   │   ├── repository/                # 数据访问层
│   │   │   └── model/                     # 实体类
│   │   └── resources/
│   │       ├── application.properties      # 配置文件
│   │       ├── static/                    # 静态资源
│   │       └── templates/                 # 模板文件
│   └── test/                              # 测试代码
├── pom.xml                                # Maven 配置文件
└── .gitignore                             # Git 忽略规则

2. 本地开发

(1) 配置开发环境

  • 数据库:配置 application-dev.properties
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.jpa.hibernate.ddl-auto=update
  • API 测试:使用 Postman 或 Swagger
    • 添加依赖:springdoc-openapi-starter-webmvc-ui

(2) 核心开发

  • 使用分层架构:

    // Controller 示例
    @RestController
    @RequestMapping("/api/users")
    public class UserController {
        @Autowired
        private UserService userService;
    
        @GetMapping
        public List<User> getUsers() {
            return userService.getAllUsers();
        }
    }

(3) 本地运行

mvn spring-boot:run
# 或
./mvnw spring-boot:run

3. 测试阶段

(1) 单元测试

  • 使用 JUnit 5 + Mockito

    @ExtendWith(MockitoExtension.class)
    class UserServiceTest {
        @Mock
        private UserRepository userRepository;
    
        @InjectMocks
        private UserService userService;
    
        @Test
        void testGetUserById() {
            when(userRepository.findById(1L)).thenReturn(Optional.of(new User()));
            assertNotNull(userService.getUserById(1L));
        }
    }

(2) 集成测试

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIntegrationTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    void shouldReturnUsers() throws Exception {
        mockMvc.perform(get("/api/users"))
               .andExpect(status().isOk());
    }
}

(3) 测试覆盖率

  • 使用 JaCoCo 插件(pom.xml 配置)
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.8</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
  • 生成报告:mvn testtarget/site/jacoco/index.html

4. 构建与打包

(1) 生产环境配置

  • application-prod.properties
    server.port=8080
    spring.profiles.active=prod
    spring.datasource.url=${DB_URL}
    spring.datasource.username=${DB_USER}
    spring.datasource.password=${DB_PASS}

(2) 打包应用

  • 可执行 JAR(推荐):
    mvn clean package -DskipTests
    # 生成文件:target/myapp-0.0.1-SNAPSHOT.jar
  • WAR 包(如需部署到外部 Tomcat):
    <!-- pom.xml 修改 -->
    <packaging>war</packaging>

(3) Docker 化(可选)

# Dockerfile
FROM openjdk:17-alpine
COPY target/myapp-*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像:

docker build -t myapp:1.0 .

5. 部署上线

(1) 服务器准备

  • 最小化要求:
    • OS:Linux (Ubuntu/CentOS)
    • Java:JDK 17+
    • 数据库:MySQL/PostgreSQL
    • 防火墙开放端口:8080(应用)、3306(DB)

(2) 部署方式

方式一:直接运行 JAR

java -jar myapp-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

方式二:使用 Systemd 托管

# /etc/systemd/system/myapp.service
[Unit]
Description=My Spring Boot App
After=syslog.target

[Service]
User=appuser
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
SuccessExitStatus=143
Environment="DB_URL=jdbc:mysql://db-server:3306/proddb"
Environment="DB_USER=produser"
Environment="DB_PASS=prodpwd"

[Install]
WantedBy=multi-user.target

操作命令:

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp

方式三:Docker 部署

docker run -d -p 8080:8080 \
  -e DB_URL=jdbc:mysql://host.docker.internal:3306/proddb \
  -e DB_USER=produser \
  -e DB_PASS=prodpwd \
  --name myapp myapp:1.0

6. 运维与监控

(1) 基础监控

  • 添加 Actuator 依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  • 监控端点:/actuator/health, /actuator/metrics

(2) 日志管理

  • 使用 Logback 配置日志轮转:
    <!-- resources/logback-spring.xml -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

(3) 告警与 APM

  • 集成方案:
    • 监控:Prometheus + Grafana
    • 链路追踪:Zipkin/SkyWalking
    • 日志:ELK Stack

关键注意事项

  1. 环境隔离:严格区分 dev/test/prod 配置
  2. 安全规范
    • 禁止明文密码(使用环境变量/配置中心)
    • 启用 HTTPS
    • 使用 Spring Security 做权限控制
  3. CI/CD:集成 Jenkins/GitLab CI
    # .gitlab-ci.yml 示例
    build:
      stage: build
      script:
        - mvn clean package -DskipTests
    deploy_prod:
      stage: deploy
      script:
        - scp target/*.jar user@server:/opt/myapp/
        - ssh user@server "sudo systemctl restart myapp"
  4. 回滚方案:保留历史版本 JAR,快速切换

完整流程耗时参考:小型项目(1-2天),中型项目(1-2周)

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!