Spring Boot 60分钟上手:从零到部署的实战速成
去年双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 都没写过,直接啃书容易劝退。我的建议是:
- 先按本文跑通一个能访问的接口
- 遇到问题 Google + Stack Overflow
- 再回头看书里的原理章节
我们字节内部有个“721学习法则”:70% 时间写代码,20% 和同事讨论,10% 看文档。死记硬背注解含义不如自己 Debug 一次自动装配流程。
最后说两句:别把工具当终点
Spring Boot 只是个起点。在字节做基础架构,我深知真正的挑战在于如何让服务高可用、可观察、可扩展。一个简单的 Mock 服务,未来可能要支持:
- 千万级 mock 规则存储(分库分表 or TiDB?)
- 动态路由匹配(类似 Nginx location)
- 流量录制回放(这才是高级玩法)
但这一切,都始于 main() 方法里那行 SpringApplication.run()。
所以下次产品经理再喊“今晚必须上线”,你可以微微一笑:“给我 60 分钟。” —— 然后默默打开 Vim,敲下第一个 @RestController。
毕竟,成都的夜生活才刚开始,代码跑通了,火锅还在等你。

评论 0