Spring Boot 以“开箱即用”著称,但恰恰是这个“开箱即用”让无数开发者在生产环境栽了跟头。默认配置跑得通本地,不等于跑得稳生产。下面梳理几个最常踩的配置坑,以及对应的排查思路。
误区一:迷信默认配置,上线就炸
这是最普遍、后果最严重的误区。Spring Boot 给了你一套“能用”的默认值,但绝不是“够用”的生产值。
Tomcat 线程池:默认最大线程数只有 200。峰值 QPS 3000 时,200 个线程处理 3000 QPS 意味着排队超过 2 秒直接超时。
HikariCP 连接池:默认最大连接数只有 10 个。QPS 超过 100 就开始等待连接。
排查思路:上线前必须过一遍生产级配置清单——Tomcat 线程数建议按“峰值 QPS × 平均 RT × 1.5”公式估算,至少配到 500;HikariCP 连接池单实例建议不超过 30;Actuator 端点最小暴露,禁用/env、/heapdump等敏感端点;生产环境强制激活prodprofile。
误区二:配置文件“写”了,但根本没生效
你明明在application.yml里配了数据库连接,启动时却报Failed to configure a DataSource: 'url' attribute is not specified。配置根本没被读到。
常见原因:
路径不对:配置文件不在src/main/resources目录下
命名不对:文件名拼写错误,比如applicaton.yml少了个i
Profile 未激活:用了application-dev.yml却没激活devprofile
排查思路:用@Value("${spring.application.name:unknown}")打印配置值,如果输出unknown说明配置没加载。启动日志里看active profiles列表,确认当前激活了哪个环境。
误区三:两种配置文件混用,被覆盖了还不知道
.properties和.yml同时存在时,Spring Boot 的加载顺序会导致一个覆盖另一个。有开发者把端口配在application.yml里写8081,.properties里写8080,启动后发现访问的是8080。
排查思路:统一用一种格式,推荐.yml。如果必须混用,记住.properties优先级高于.yml。排查时可以用 Actuator 的/env端点查看某个配置项的最终值来自哪个来源。
误区四:YAML 缩进错了,解析直接失败
YAML 对缩进极其敏感。server: port: 8080少了一个空格,整个配置段解析失败。
排查思路:启动日志里看到Config parsing failed或YAMLException,十有八九是缩进问题。统一用两个空格缩进,别用 Tab。
误区五:Profile 命名不规范,环境切不过去
把文件命名为application.Dev.yml或app-dev.yml,Spring 根本认不出来。
排查思路:严格遵循命名规范——application-{profile}.yml,profile 必须全小写、短横线分隔。激活方式用--spring.profiles.active=prod命令行参数最可靠。
误区六:@ConfigurationProperties 绑定失败
写了配置类、配了前缀,属性就是绑不上。
常见原因:没加@Component或@EnableConfigurationProperties;配置类不在组件扫描路径下;缺少 setter 方法;属性名与配置 key 不一致;YAML 中嵌套对象未正确缩进。
排查思路:设置ignoreUnknownFields=false快速定位不匹配的属性;启动时观察是否有ConfigurationPropertiesBindException异常。
误区七:日志配置了,但就是不输出
你配了日志级别,控制台就是没日志。
常见原因:多个日志框架冲突(log4j 和 logback 同时存在);日志级别设置太高,比如设成ERROR而业务日志是INFO;logback-spring.xml配置了但路径不对。
排查思路:用mvn dependency:tree检查是否有 log4j 依赖冲突;确认logging.level.root至少是INFO;用-Dlogging.config=classpath:logback-spring.xml强制指定配置文件。
写在最后
配置问题的排查,核心就三句话:
第一,看日志——启动日志里藏着 90% 的线索,active profiles列表、配置加载路径、异常堆栈,都在那里。
第二,查优先级——Spring Boot 支持十几种配置来源,优先级从高到低依次是:命令行参数 > 环境变量 > 外部配置文件 > 内部配置文件 > 默认值。配置不生效,先确认有没有被更高优先级的来源覆盖了。
第三,用对工具——Actuator 的/env端点可以查看每个配置项的最终值及来源;IDEA 的 Spring Boot 插件会高亮配置文件中无效或已废弃的配置 key。
“开箱即用”是 Spring Boot 给开发者的礼物,但“上线即用”从来不是默认配置能做到的。别等线上 502 了才想起来改配置——那时候,改的每一行配置都带着血的教训。