淺談Spring Boot 3與2的差異(一)
前言
在2022年11月24日 Spring Boot 版本大升級到3.0.0,是 Spring Boot 近幾年來算是滿大的調整,因此本文主要來聊聊相較於 2 新增及修改的功能簡單介紹。
官方建議要從舊版本升級的不要直接升級成 3 ,而是先從 2.X.X 升級到目前的 2.7.6 再升級到 3 ,會比較容易更新。
開發環境
- Windows 11
- Spring Boot 3.0.0
- Maven 3.6.3
- GraavlVM CE 22.3 - java 17 (JDK)
- Docker (zipkin 使用)
Maven pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
版本差異
Spring Boot 3 版本最低限制:
• Spring Framework 6
• Java 17
• Tomcat 10
• Lombok 1.18.22+
• Maven 3.5
• Gradle 7.3
Spring Boot 3 與 2 的差別:
移除的依賴
-
Atomikos
-
EhCache 2 (已調升成 EhCache 3)
-
Hazelcast 3
-
Apache ActiveMQ
Jakarta EE
Spring Boot 3 使用 Jakarta EE 9/10,在 Jakarta EE 9 將原先 javax 的 package 全部都改成 jakarta package,如下面範例:
// Spring Boot 2
import javax.persistence.Entity;
// Spring Boot 3
import jakarta.persistence.Entity;
Jakarta EE 9 若要使用第三方依賴所需要的最低版本:
- Hibernate 6.1
- Hibernate Validator 8.0
- SLF4J 2.0
- Tomcat 10
- Thymeleaf 3.1.0.M2
GraalVM
Sprong Boot 3 開始引用了 GraalVM Native Image,與原先 JVM 相比 ,啟動效率快且打包成占用空間極小的 Image。
只是要使用 GraalVM 需使用指定的JDK,且需要版本 GraalVM 22.3 + 和 Native Build Tools Plugin 0.9.17 + 才能建構 Native Image,可以輸入 java -version 確定自己本機現在的版本。
Maven 可以直接執行 mvn -Pnative native:compile 編譯 Image , 文件會生成在 /target 底下
特別注意: Windows 環境會產生無cl.exe的報錯,目前查出的唯一解法需下載 Visual Studio 2019 裡的 cl.exe 才能執行,這邊就不特別另外示範
Mac 的部分則可以直接打包執行,發現啟動時間真的跟以前比起來快了好幾倍
Observability
Observability是以下三個組合而成,也取代了像 Spring Cloud Sleuth 的存在:
- Logging
- Metrics
- Traces
Maven pom.xml
<!-- Observability-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
準備 zipkin ,使用 docker 補助(需先下載Docker)所以需要一個docker-compose.yml:
version: "3"
services:
zipkin:
container_name: zipkin
image: openzipkin/zipkin
extra_hosts: ['host.docker.internal:host-gateway']
restart: always
ports:
- "9411:9411"
# Zipkin: http://localhost:9411/zipkin/
application.yml:
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
tracing:
sampling:
probability: 1.0
執行Docker 及 application後,先執行 API 取得資料再進到 zipkin http://localhost:9411/ ,就能找到剛剛的紀錄,並看詳細內容
♦因為篇幅關係這邊只做比較簡單的示範,還有像Observation的使用與介紹,再請到 spring-boot.observability 官網看詳細介紹
♦以上的範例是直接從 github 範例 下載做練習及研究,有興趣可以看看喔
接續請看 淺談Spring Boot 3與2的差異(二)
參考文獻
- 範例
- https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0
- https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/native-image.html#native-image
- https://docs.spring.io/spring-boot/docs/3.0.0/reference/html/actuator.html#actuator.observability
- https://docs.spring.io/spring-framework/docs/6.0.0-RC2/reference/html/integration.html#rest-client-access
- https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html
- https://www.baeldung.com/java-pattern-matching-instanceof
- https://www.youtube.com/watch?v=-mwpoE0x0JQ