第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,就能看到结果。

我的小技巧: 开发阶段我习惯在 application.yml 里加一行 server.port: 0,这样每次启动端口随机,避免端口冲突。当然,生产环境别这么干。

3.2 自动配置原理:它到底是怎么猜中我心思的?

很多新手觉得 Spring Boot 自动配置很玄乎。其实说白了,就是一套「条件装配」机制。核心注解就一个:@EnableAutoConfiguration

它的工作流程大致是这样:

  1. Spring Boot 启动时,扫描所有 jar 包里的 META-INF/spring.factories 文件
  2. 这个文件里列出了所有可能的自动配置类,比如 DataSourceAutoConfiguration
  3. 每个配置类上都有 @ConditionalOnClass@ConditionalOnMissingBean 这类条件注解
  4. 只有条件满足时,这个配置才会生效

举个例子,你引入了 spring-boot-starter-data-redis,classpath 里就有了 Redis 相关的类。自动配置类检测到这些类存在,就会自动帮你创建 RedisTemplateStringRedisTemplate 这些 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 的核心组件,看看怎么把这些单体应用拆成真正的微服务。到时候你会发现,今天学的这些基础,全都会用上。