Spring Boot 4.0 chính thức loại bỏ hỗ trợ Undertow: Tomcat mừng rỡ

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:

  1. 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>
-->
  1. 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>
  1. Chuyển cấu hình server.undertow.* sang server.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

Thẻ: Spring Boot Undertow Tomcat Servlet 6.1 Migration

Đăng vào ngày 20 tháng 7 lúc 16:49