Spring Boot 4.0.0 M2 vừa được phát hành đã nhận được nhiều phản hồi tích cực từ cộng đồng. Một trong những thay đổi đáng chú ý nhất là hủy bỏ hoàn toàn hỗ trợ cho Undertow. Bài viết này sẽ phân tích chi tiết lý do kỹ thuật, tác động đến dự án hiện tại và hướng dẫn chuyển đổi.
1. Lý do loại bỏ Undertow: Đồng bộ hóa quy chuẩn
Trong các phiên bản Spring Boot 3.x và trước đó, người dùng có thể chọn giữa ba container web tích hợp:
- Tomcat (mặc định)
- Jetty
- Undertow
Undertow được ưa chuộng trong các ứng dụng xử lý lượng truy cập lớn nhờ ưu điểm như tiết kiệm bộ nhớ, khả năng xử lý song song cao, hỗ trợ kết nối bền vững. Tuy nhiên, trong Spring Boot 4.0, hỗ trợ Undertow bị xóa hoàn toàn. Đây không phải là quyết định chủ quan của nhóm Spring mà do sự phát triển của hệ sinh thái:
Undertow chưa hỗ trợ Servlet 6.1, trong khi Spring Boot 4.0 dựa trên Spring Framework 7 và bắt buộc sử dụng Servlet 6.1. Red Hat (nhà quản lý Undertow) không đầu tư đủ để cập nhật chuẩn mới, khiến Spring Boot không thể duy trì lớp tương thích.
Kết luận quan trọng: Nếu Undertow hỗ trợ Servlet 6.1 trong tương lai, Spring Boot có thể khôi phục hỗ trợ.
2. Tác động đến dự án hiện tại
Nếu dự án đang sử dụng cấu hình:
server:
servlet:
context-path: /api
undertow:
io-threads: 4
worker-threads: 20
buffer-size: 1024
Hoặc phụ thuộc:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
Sau khi nâng cấp lên Spring Boot 4.0, dự án sẽ không thể khởi động với lỗi:
Caused by: java.lang.IllegalStateException:
Không tìm thấy lớp triển khai WebServer dựa trên Undertow.
Rủi ro chính:
| Rủi ro | Mô tả |
|---|---|
| Khởi động thất bại | Thiếu lớp triển khai Undertow |
| Cấu hình vô hiệu hóa | Các cấu hình server.undertow.\* bị bỏ qua |
| Suy giảm hiệu năng | Phải tối ưu lại sau khi đổi container |
3. Hướng dẫn chuyển đổi
Giải pháp 1: Quay lại Tomcat (khuyến nghị)
Tomcat là container mặc định, có hệ sinh thái phong phú và đã hỗ trợ Servlet 6.1 đầy đủ.
Các bước thực hiện:
- Xóa phụ thuộc Undertow:
<!-- Xóa đoạn code sau -->
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
-->
- Thêm Tomcat (thường không cần thiết vì
spring-boot-starter-webđã bao gồm):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
- Chuyển cấu hình
server.undertow.*sangserver.tomcat.*(nếu cần):
server:
tomcat:
threads:
max: 200
min-spare: 10
max-connections: 8192
Giải pháp 2: Sử dụng Jetty
Jetty cũng hỗ trợ Servlet 6.1 và hiệu quả trong các tình huống I/O nặng.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
⚠️ Lưu ý: Cần loại bỏ Tomcat để tránh xung đột:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat
4. Các thay đổi quan trọng khác trong Spring Boot 4.0
Ngoài việc loại bỏ Undertow, Spring Boot 4 còn mang đến nhiều cập nhật lớn:
| Danh mục | Nội dung thay đổi |
|---|---|
| **Công cụ xây dựng** | Gradle yêu cầu ≥ 8.14 hoặc 9.x |
| **Khả năng quan sát** | Thêm spring-boot-starter-opentelemetry hỗ trợ OTLP |
| **Quản lý API** | Hỗ trợ kiểm soát phiên bản API (Spring MVC/WebFlux) |
| **Client HTTP** | Giới thiệu @HttpServiceClient đơn giản hóa gọi từ xa |
| **An toàn null** | Hỗ trợ JSpecify (@Nullable/@NonNull) |
| **Dây ảo** | Kích hoạt spring.threads.virtual.enabled=true để dùng JDK virtual thread |