Spring Boot 60分钟上手:从零到部署的实战速成

前端说你再看
2025-12-28 03:03
阅读 310

去年双11大促前夕,我们基础架构组临时接到一个需求:给前端团队搭个轻量级 Mock 服务,用来模拟后端接口,避免他们卡在联调阶段干瞪眼。产品经理还特别“贴心”地补了一句:“最好今天能上线,明天他们就要对齐 UI 了。”

我当时正用 Vim 写一个 Kafka 消费器的配置文件,听到这话差点把键盘砸了——这哪是需求,这是催命符啊!但转念一想,这不正好是个练手 Spring Boot 的机会?之前一直在搞分布式调度系统,对应用层框架反而有点生疏了。于是花了一个小时撸了个原型,还真跑起来了。今天这篇技术分享,就是基于那次“生死时速”的实战经验,带你 60 分钟快速上手 Spring Boot。


为什么选 Spring Boot?别被“Boot”骗了

很多人以为 Spring Boot 是个“简化版 Spring”,其实完全不是。它更像是 Spring 生态的胶水+脚手架:自动装配、内嵌 Tomcat、开箱即用的 Actuator 监控……这些特性让它特别适合快速搭建微服务或工具型应用。

我们组虽然主攻底层基础设施(比如自研的 RPC 框架、服务网格控制面),但日常也少不了写些小工具:配置中心客户端、日志收集代理、甚至内部 CI/CD 的 webhook 处理器。这些场景下,Spring Boot 的“约定优于配置”哲学简直救我狗命。

而且前端同事真的等不起。他们用 Vue 写界面,接口还没定稿就得先跑起来看效果。以前我们丢个 Postman JSON 文件过去,结果他们改字段改到崩溃。现在直接给个可运行的服务,连文档都省了——Swagger 配上,接口说明自动生成。


环境准备:别在第一步就翻车

首先确认你装了 Java 17(别用 8 了,2024 年了兄弟),Maven 或 Gradle 随便,我个人用 Gradle 因为 build.gradle 比 pom.xml 少写一半代码(Vim 党的执念)。

java -version
# openjdk version "17.0.8" 2023-07-18 LTS

curl https://start.spring.io/starter.zip \
  -d bootVersion=3.2.0 \
  -d dependencies=web,actuator,devtools,lombok \
  -d packageName=com.bytearch.mock \
  -d name=mock-service \
  -o mock-service.zip

unzip mock-service.zip && cd mock-service

踩坑提醒:别手贱点 Spring Initializr 的网页版!网络一卡,依赖下半天。命令行一键生成才是真·效率。

解压后你会看到典型的 Spring Boot 项目结构:

src/
├── main/
│   ├── java/com/bytearch/mock
│   └── resources/
└── test/

resources/application.yml 是你的主战场,后面所有配置都在这儿改。


写个 Hello World?不,我们直接写接口

前端最关心什么?接口能不能调通。所以别搞什么 System.out.println("Hello") 了,直接上 REST Controller。

@RestController
@RequestMapping("/api")
public class MockController {

    @GetMapping("/user/{id}")
    public Map<String, Object> getUser(@PathVariable Long id) {
        return Map.of(
            "id", id,
            "name", "MockUser-" + id,
            "avatar", "https://bytearch.mock/avatar/" + id
        );
    }
}

启动命令就一行:

./gradlew bootRun

然后浏览器打开 http://localhost:8080/api/user/123,立马看到 JSON 返回。前端同事当场感动哭了——这比等后端联调快十倍。

成都生活小贴士:写完这段代码,刚好赶上楼下茶馆开门。端杯碧潭飘雪,看着终端里 Tomcat 启动成功的日志,巴适得板。


数据库?先用内存 H2 对付一下

真实场景肯定要存数据。但为了速度,先用 H2 内存数据库顶着。加个依赖:

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'

application.yml 里配两行:

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true

然后建个 Entity:

@Entity
@Table(name = "mock_records")
@Data // Lombok 注解,省掉 getter/setter
public class MockRecord {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String path;
    private String responseBody;
}

再写个 Repository:

public interface MockRecordRepository extends JpaRepository<MockRecord, Long> {}

Controller 里注入它,就能 CRUD 了。整个过程不到 10 分钟,比你纠结用 MyBatis 还是 JPA 的时间都短。


前端对接:跨域问题必须提前解决

前端本地开发用 localhost:5173(Vite 默认端口),调后端 8080,浏览器直接给你上 CORS 错误:

Access to fetch at 'http://localhost:8080/...' from origin 'http://localhost:5173' has been blocked by CORS policy.

别慌,在 @Configuration 类里加个全局跨域配置:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://localhost:5173", "http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}

友军吐槽:前端同学说“你这个接口怎么又 500 了?”,八成是跨域没配。运维和测试最爱在这种低级问题上甩锅。


生产部署?Dockerfile 三行搞定

我们组推崇“一次构建,到处运行”。Spring Boot 打成 fat jar,配合 Docker,部署贼简单。

先打包:

./gradlew bootJar

生成 build/libs/mock-service.jar,然后写个 Dockerfile

FROM eclipse-temurin:17-jre-alpine
COPY build/libs/mock-service.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建镜像、推到私有仓库、K8s 部署……一套流程下来,比写周报还快。

线上我们还会加些生产级配置:

配置项 开发环境 生产环境
server.port 8080 8080
logging.level DEBUG WARN
management.endpoints.web.exposure.include * health,metrics
spring.datasource.url jdbc:h2:mem:testdb jdbc:mysql://prod-db:3306/mock

Actuator 端点只暴露必要项,安全第一。去年就有实习生把 /actuator/env 暴露公网,差点泄露数据库密码,被 leader 骂到自闭。


学 Spring Boot,光看视频不够

很多新人问我:“有没有推荐的 Spring Boot 书籍?” 我的回答永远一样:先动手,再看书

《Spring Boot 实战》(Craig Walls 著)确实经典,但如果你连 @Autowired 都没写过,直接啃书容易劝退。我的建议是:

  1. 先按本文跑通一个能访问的接口
  2. 遇到问题 Google + Stack Overflow
  3. 再回头看书里的原理章节

我们字节内部有个“721学习法则”:70% 时间写代码,20% 和同事讨论,10% 看文档。死记硬背注解含义不如自己 Debug 一次自动装配流程。


最后说两句:别把工具当终点

Spring Boot 只是个起点。在字节做基础架构,我深知真正的挑战在于如何让服务高可用、可观察、可扩展。一个简单的 Mock 服务,未来可能要支持:

  • 千万级 mock 规则存储(分库分表 or TiDB?)
  • 动态路由匹配(类似 Nginx location)
  • 流量录制回放(这才是高级玩法)

但这一切,都始于 main() 方法里那行 SpringApplication.run()

所以下次产品经理再喊“今晚必须上线”,你可以微微一笑:“给我 60 分钟。” —— 然后默默打开 Vim,敲下第一个 @RestController

毕竟,成都的夜生活才刚开始,代码跑通了,火锅还在等你。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝