第3章 Spring Boot基础:快速搭建、自动配置原理与Actuator监控
说实话,Spring Boot 这东西,刚出来那会儿我还有点抵触。心想 Spring 那一套 XML 配置虽然繁琐,但好歹可控啊。结果真用上之后……嗯,真香。今天咱们就聊聊 Spring Boot 的三个核心点:怎么快速搭起来、自动配置到底是个什么魔法、以及 Actuator 怎么帮你盯着生产环境。
3.1 快速搭建:从零到能跑,五分钟够不够?
我个人习惯,新项目从来不用 IDE 那套向导。直接去 start.spring.io 选依赖,或者用 IDEA 的 Spring Initializr。选什么?Web、Actuator、Lombok 这三样基本是标配。
举个例子,一个最简单的 REST 服务:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, 微服务!";
}
}
这就完了?对,这就完了。你不需要配置 Tomcat,不需要配 web.xml,甚至连 application.properties 都可以是空的。跑起来之后访问 localhost:8080/hello,就能看到结果。
server.port: 0,这样每次启动端口随机,避免端口冲突。当然,生产环境别这么干。
3.2 自动配置原理:它到底是怎么猜中我心思的?
很多新手觉得 Spring Boot 自动配置很玄乎。其实说白了,就是一套「条件装配」机制。核心注解就一个:@EnableAutoConfiguration。
它的工作流程大致是这样:
- Spring Boot 启动时,扫描所有 jar 包里的
META-INF/spring.factories文件 - 这个文件里列出了所有可能的自动配置类,比如
DataSourceAutoConfiguration - 每个配置类上都有
@ConditionalOnClass、@ConditionalOnMissingBean这类条件注解 - 只有条件满足时,这个配置才会生效
举个例子,你引入了 spring-boot-starter-data-redis,classpath 里就有了 Redis 相关的类。自动配置类检测到这些类存在,就会自动帮你创建 RedisTemplate、StringRedisTemplate 这些 Bean。
核心理解: 自动配置不是「猜」,而是「根据你引入的依赖和当前环境,做最合理的默认配置」。你随时可以用自己的 Bean 覆盖它。
我在项目中遇到过一个问题:明明引入了 Redis 依赖,但 RedisTemplate 就是没生效。查了半天,发现是某个依赖把 RedisConnectionFactory 给排除了。嗯,这种坑其实挺常见的。
3.3 Actuator 监控:生产环境的「仪表盘」
Actuator 这名字听着挺唬人,其实就是个监控模块。你引入依赖后,它自动暴露一堆 HTTP 端点,让你看应用的「内脏」。
引入方式很简单:
<dependency>
<groupId>org.springframework.boot></groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
默认情况下,只有 /actuator/health 和 /actuator/info 是开放的。但生产环境你肯定想看更多,比如:
| 端点 | 路径 | 作用 |
|---|---|---|
| 健康检查 | /actuator/health | 返回 UP 或 DOWN,可自定义组件健康状态 |
| 指标 | /actuator/metrics | JVM 内存、线程、GC 等数据 |
| 环境信息 | /actuator/env | 所有配置属性,包括系统环境变量 |
| Bean 列表 | /actuator/beans | 所有 Spring 管理的 Bean |
| 日志级别 | /actuator/loggers | 查看和动态修改日志级别 |
| 线程转储 | /actuator/threaddump | 当前所有线程的快照 |
要开放这些端点,在配置里加一行:
management.endpoints.web.exposure.include=health,metrics,env,beans,loggers,threaddump
* 全暴露出去。我曾经见过有人把 /actuator/env 暴露到公网,结果数据库密码直接被人看到了……嗯,那场面挺尴尬的。
3.4 自定义健康检查:让监控更懂你的业务
默认的健康检查只检查数据库连接、Redis 连接这些基础设施。但你的业务可能有自己的健康标准。比如,某个核心缓存必须可用,或者某个外部 API 必须能调通。
实现一个自定义健康指示器很简单:
@Component
public class MyServiceHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 模拟检查某个外部服务
boolean serviceUp = checkExternalService();
if (serviceUp) {
return Health.up()
.withDetail("service", "外部服务正常")
.build();
} else {
return Health.down()
.withDetail("service", "外部服务不可用")
.build();
}
}
private boolean checkExternalService() {
// 实际项目中这里会发 HTTP 请求或检查连接池
return true;
}
}
这样,你的 /actuator/health 返回的 JSON 里就会多一个 myService 字段。配合负载均衡器的健康检查,可以实现更精细的流量控制。
3.5 动态日志级别:线上排错的利器
这个功能我特别喜欢。线上出了问题,想看看某个包的 DEBUG 日志,但又不想重启应用?Actuator 的 /actuator/loggers 端点可以动态修改日志级别。
比如,我想看 com.example.service 包的 DEBUG 日志:
POST /actuator/loggers/com.example.service
Content-Type: application/json
{
"configuredLevel": "DEBUG"
}
改完之后,日志立刻生效。排查完问题,再改回 INFO 就行。不用重启,不用改配置,非常方便。
3.6 小结
Spring Boot 的这三个基础能力,说白了就是:快速开发、智能配置、可观测性。快速搭建让你专注于业务代码,自动配置帮你省掉大量样板配置,Actuator 则让你在生产环境里能看清应用的状态。
下一章咱们聊聊 Spring Cloud 的核心组件,看看怎么把这些单体应用拆成真正的微服务。到时候你会发现,今天学的这些基础,全都会用上。