作为一å天天和Spring Boot打交é“çš„Javaå¼€å‘者,从Spring Boot 2.x一路å‡çº§åˆ°3.xï¼Œè¸©è¿‡çš„å‘æ¯”åƒè¿‡çš„ç›è¿˜å¤šã€‚今天把这些血泪ç»éªŒåˆ†äº«å‡ºæ¥ï¼Œå¸Œæœ›èƒ½å¸®åˆ°æ£åœ¨å‡çº§æˆ–者准备å‡çº§çš„æœ‹å‹ã€‚
## å‡çº§å‰çš„心ç†å»ºè®¾
å½“ä½ å†³å®šæŠŠé¡¹ç›®ä»ŽSpring Boot 2.7å‡çº§åˆ°3.x之å‰ï¼Œè¯·å…ˆæ·±å‘¼å¸ï¼Œç„¶åŽåšå¥½ä»¥ä¸‹å‡†å¤‡ï¼š
**Java版本是第一个拦路虎**。Spring Boot 3.xæœ€ä½Žè¦æ±‚Java 17,这æ„味ç€ä½ å¯èƒ½éœ€è¦å’ŒJava 8/11说å†è§äº†ã€‚我们项目组当时为了å‡çº§ï¼Œå…‰æ˜¯ç»Ÿä¸€JDK版本就折腾了两周——有的åŒäº‹ç”¨IDEA内置的JDK,有的用系统安装的,还有的用Docker镜åƒé‡Œçš„,版本å„ä¸ç›¸åŒï¼Œèšé¤æ—¶èŠèµ·æ¥éƒ½æ˜¯æ³ªã€‚
**Jakarta EE是第二个大å‘**。Spring Boot 3从Java EEå…¨é¢è¿ç§»åˆ°äº†Jakarta EE,这æ„味ç€ä½ 所有的javax.*包åéƒ½è¦æ”¹æˆjakarta.*。Controller层ã€Entity层ã€Filter层……但凡用到javax.servletã€javax.persistenceçš„åœ°æ–¹ï¼Œä¸€ä¸ªéƒ½è·‘ä¸æŽ‰ã€‚æˆ‘å½“æ—¶å†™äº†ä¸ªè„šæœ¬æ‰¹é‡æ›¿æ¢ï¼Œç»“æžœå› ä¸ºæ£åˆ™è¡¨è¾¾å¼æ²¡å†™å¯¹ï¼Œæ›¿æ¢å‡ºäº†é—®é¢˜ï¼Œç¡¬æ˜¯debug了一下åˆã€‚
## 那些年我们踩过的é…ç½®å‘
### é…ç½®æ–‡ä»¶æ ¼å¼å˜ä¸¥æ ¼äº†
Spring Boot 3对é…ç½®æ–‡ä»¶çš„è§£æžæ›´ä¸¥æ ¼äº†ã€‚以å‰ä½ å¯èƒ½ä¹ æƒ¯è¿™æ ·å†™ï¼š
server:
port: 8080
çœ‹èµ·æ¥æ²¡é—®é¢˜ï¼Ÿä½†å¦‚æžœä¸å°å¿ƒå¤šäº†ä¸ªç©ºæ ¼æˆ–者缩进ä¸å¯¹ï¼ŒSpring Boot 3会直接罢工,报错信æ¯è¿˜ç‰¹åˆ«æŠ½è±¡ã€‚建议å‡çº§åŽè·‘一次./mvnw spring-boot:run看看有没有é…置相关è¦å‘Šã€‚
### 新的安全é…置让人头皮å‘麻
Spring Security 6çš„å˜åŒ–å ªç§°è„±èƒŽæ¢éª¨ã€‚以剿ˆ‘们å¯èƒ½è¿™æ ·é…置:
http.authorizeRequests()
.antMatchers(“/api/**”).authenticated()
.anyRequest().permitAll();
现在?对ä¸èµ·ï¼Œè¯·ç”¨æ–°çš„Lambda DSL:
http.authorizeHttpRequests(auth -> auth
.requestMatchers(“/api/**”).authenticated()
.anyRequest().permitAll());
说实è¯ï¼Œåˆšçœ‹åˆ°è¿™ç§å†™æ³•我是拒ç»çš„,但用久了å‘现确实更清晰——至少ä¸ä¼šæŠŠæ‰€æœ‰é…ç½®å †åœ¨ä¸€è¡Œé‡Œäº†ã€‚
## 实际项目ä¸çš„æ€§èƒ½ä¼˜åŒ–心得
å‡çº§å®ŒæˆåŽï¼ŒçœŸæ£çš„æŒ‘战æ‰åˆšåˆšå¼€å§‹ã€‚䏋颿˜¯å‡ æ¡å®žæˆ˜å¿ƒå¾—:
**1. å¯åŠ¨é€Ÿåº¦ç¡®å®žå˜å¿«äº†**
我们的项目有12ä¸ªåæ¨¡å—,Spring Boot 2.xå¯åŠ¨ä¸€æ¬¡è¦40多秒,å‡çº§åŽç›´æŽ¥ç 到20ç§’å·¦å³ã€‚åŽŸå› ä¸»è¦æ˜¯GraalVM原生编译和更智能的beanåˆå§‹åŒ–ã€‚å½“ç„¶ï¼Œå¦‚æžœä½ è¿˜åœ¨ç”¨è€æ—§çš„XMLé…置,那当我没说。
**2. 虚拟线程是下一代神器**
Java 19引入的虚拟线程(Virtual Threads)在Java 21æ£å¼ç¨³å®šï¼ŒSpring Boot 3.2+完美支æŒã€‚之剿ˆ‘ä»¬ç”¨ä¼ ç»Ÿçº¿ç¨‹æ± å¤„ç†é«˜å¹¶å‘è¯·æ±‚ï¼Œçº¿ç¨‹èµ„æºæ¶ˆè€—巨大。改æˆè™šæ‹Ÿçº¿ç¨‹åŽï¼ŒåŒæ ·çš„åžåé‡ï¼Œå†…å˜å 用下é™äº†60%ã€‚ä»£ç æ”¹èµ·æ¥ä¹Ÿç®€å•:
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
å°±è¿™ä¸€è¡Œï¼Œä¼ ç»Ÿçº¿ç¨‹æ± ç›´æŽ¥é€€å½¹ã€‚
**3. Observability更强大了**
Spring Boot 3集æˆäº†Micrometer Tracing,分布å¼è¿½è¸ªé…置简å•åˆ°æ„Ÿäººã€‚ä¹‹å‰æˆ‘们为了排查一个跨æœåŠ¡è°ƒç”¨é—®é¢˜ï¼Œè¦åœ¨æ—¥å¿—里翻åŠå¤©ï¼ŒçŽ°åœ¨ç›´æŽ¥çœ‹traceId,一目了然。
## 那些ä¸å»ºè®®é©¬ä¸Šå‡çº§çš„æƒ…况
虽然我å¹äº†è¿™ä¹ˆå¤šï¼Œä½†æœ‰äº›æƒ…况真的ä¸å»ºè®®æ€¥ç€å‡ï¼š
– ä½ çš„é¡¹ç›®è¿˜åœ¨ç”¨Spring Cloud Netflix全家桶(Hystrixã€Ribbon这些),先看看兼容性
– ä¾èµ–的第三方SDK还没支æŒJava 17
– 团队里没人熟悉新特性,出了问题没人能debug
## 写在最åŽ
从Spring Boot 2.x到3.x,å˜åŒ–之大ä¸äºšäºŽä»ŽiPhone 13å‡çº§åˆ°iPhone 15——看似差ä¸å¤šï¼Œä½†ç”¨èµ·æ¥å“ªå„¿å“ªå„¿éƒ½ä¸ä¸€æ ·ã€‚å‡çº§å‰åšå¥½å……分测试,å‡çº§åŽè€å¿ƒè¸©å‘ï¼Œç›¸ä¿¡æˆ‘ï¼Œå½“ä½ çœ‹åˆ°é¡¹ç›®å¯åŠ¨æ—¶é—´ä»Ž40ç§’å˜æˆ20秒的那一刻,一切都值了。
技术债这ç§ä¸œè¥¿ï¼Œæ¬ 久了是è¦åˆ©æ¯çš„。早点还清,早点轻æ¾ã€‚
—
*æœ¬æ–‡é€‚åˆæœ‰ä¸€å®šSpring Boot基础的开å‘者,如果是新手,建议先在本地æä¸ªdemo练练手å†ä¸Šç”Ÿäº§ã€‚*