Modern Java trong Spring — tổng quan
Module này mổ chỗ Java hiện đại chạm vào Spring: record ở ranh giới HTTP, virtual threads trong Boot, RestClient/@HttpExchange, và sealed Result nghiệp vụ.
TL;DR: Module này dạy đúng bốn chỗ Java 17-21 chạm vào runtime Spring Boot 3, theo một trình tự có lý do: record khoá cửa mutation ở tầng DTO, virtual threads đổi cách Boot xử lý request I/O-bound, RestClient và @HttpExchange gọi HTTP ra ngoài tường minh, và sealed Result thay exception cho lỗi nghiệp vụ dự đoán được. Bốn kỹ thuật không đứng độc lập — record bất biến làm nền cho cả ba bài sau, mini-challenge TaskFlow v4 ráp lại toàn bộ vào một service thật. Module không dạy lại cú pháp Java; nó chỉ dạy phần Java chạm Spring.
Vì sao module này tồn tại
Bạn vừa xong course Spring Security & Testing, API TaskFlow đã có JWT, method security, test pyramid với Testcontainers. Nhưng phần thân code chưa ai đụng tới từ ngày viết theo phong cách Spring Boot 2: DTO là class mutable share qua tham chiếu async (264/1.200 task bị ghi sai trong một lần import CSV thật), RestTemplate gọi Profile Service không set timeout (một transaction DB bị lock là đủ treo cả node), và mọi lỗi nghiệp vụ như hết hàng, quá hạn mức, không đủ quyền đều ném bằng IllegalStateException chung chung mà compiler không ép ai xử lý.
Module này sửa đúng bốn chỗ đó qua sáu bài concept, theo một thứ tự không ngẫu nhiên: mỗi bài dùng lại thứ bài trước vừa dựng.
- Record khoá cửa mutation trước (bài 01): DTO bất biến sẽ là kiểu trả về của mọi client ở các bài sau.
- Runtime xử lý request đổi tiếp (bài 02-03): virtual threads thay đổi cách Boot cấp phát thread cho tải I/O-bound, cùng ba cạm bẫy đi kèm khi bật.
- Client gọi ra ngoài dùng đúng nền đó (bài 04-05): RestClient và
@HttpExchangechạy trên virtual thread vừa học, trả về record vừa học. - Kết quả nghiệp vụ được model lại cuối cùng (bài 06): sealed Result thay
IllegalStateExceptionnói dối, dùng chính record làm dữ liệu mỗi nhánh.
Mini-challenge TaskFlow v4 (bài 07) ráp cả bốn mảnh vào cùng một service, rồi đo lại throughput trước và sau khi hiện đại hoá.
Sau module này bạn sẽ
- Implement record làm DTO request/response và justify ranh giới nơi record hỏng (JPA entity, bean mutable).
- Choose bật hay không bật virtual threads theo hồ sơ tải I/O-bound so với CPU-bound.
- Diagnose ba hỏng hóc khi bật virtual threads trong Spring: pinning, ThreadLocal, mất backpressure của pool.
- Implement HTTP client outbound bằng RestClient và
@HttpExchangevới timeout và xử lý lỗi tường minh. - Design kết quả nghiệp vụ bằng sealed type và pattern matching, map sang ProblemDetail thay vì ném exception.
Lộ trình module
- Record làm DTO — nơi record hợp và nơi record gãy: record giải quyết dứt điểm lớp bug DTO mutable nào, và tại sao nó không dùng được làm JPA entity?
- Virtual threads trong Boot — một dòng config đổi những gì:
spring.threads.virtual.enabled=truechạm vào đâu trong runtime Boot, và khi nào nó đáng bật? - Ba thứ gãy sau khi bật virtual threads: pinning, ThreadLocal đắt lên, mất backpressure, ba cạm bẫy nào chờ sẵn ngay sau khi bật cấu hình ở bài trước?
- RestClient — gọi HTTP ra ngoài mà không mất kiểm soát: vì sao không set timeout thì một downstream treo có thể kéo sập cả node, và RestClient khai timeout với xử lý lỗi ra sao?
- @HttpExchange — khai báo interface, Spring sinh client: khi nào khai báo interface gọn hơn viết tay RestClient, và proxy sinh implementation bằng cơ chế gì?
- Sealed Result — lỗi nghiệp vụ không phải exception: lỗi nghiệp vụ dự đoán được nên là kiểu dữ liệu hay exception, và transaction rollback ở đâu khi trả về nhánh lỗi?
- Mini-challenge: TaskFlow v4: ráp cả bốn kỹ thuật trên vào một service thật, rồi đo lại throughput trước/sau khi hiện đại hoá.
flowchart LR A["01 Record DTO"] --> B["02 Virtual threads"] B --> C["03 Cam bay VT"] C --> D["04 RestClient"] D --> E["05 HttpExchange"] E --> F["06 Sealed Result"] F --> G["07 Mini-challenge"]
Yêu cầu trước khi bắt đầu
- Hoàn thành course Spring Security & Testing.
- Module này không dạy lại cú pháp Java. Nó giả định bạn đã nắm:
- Record, sealed type và pattern matching cho switch: Record — data class với 1 dòng, Sealed class — kiểm soát tập subtype với pattern matching exhaustive.
- Cơ chế virtual thread ở mức JVM (mount/unmount, continuation, carrier thread): Virtual Threads (java-internals).
Module chỉ dạy phần Java 17-21 chạm vào runtime và API của Spring Boot: record ở tầng DTO, virtual threads ở tầng Tomcat/@Async/scheduler, RestClient/@HttpExchange ở tầng gọi ra ngoài, sealed type ở tầng kết quả nghiệp vụ. Cú pháp record/sealed/pattern matching, bạn học ở hai link trên trước khi vào bài 01.
Time budget
- Module: ~2 giờ tổng (đọc + mini-challenge).
| Bài | Chủ đề | Phút |
|---|---|---|
| 00 | Tổng quan | 8 |
| 01 | Record làm DTO | 12 |
| 02 | Virtual threads trong Boot | 12 |
| 03 | Virtual threads: ba cạm bẫy | 13 |
| 04 | RestClient | 12 |
| 05 | HTTP Interface @HttpExchange | 11 |
| 06 | Sealed Result | 13 |
| 07 | Mini-challenge TaskFlow v4 | 30 |
| 08 | Tổng kết & cheat sheet | 6 |
Cách học module này hiệu quả
- Mở IDE bật JDK 21+, tự chạy lại record/virtual threads/RestClient thật. Nhiều pitfall trong module chỉ lộ ra khi đo đúng tải (throughput ở concurrency cao), không phải đọc lý thuyết suông.
- Đọc bài 02 và 03 liền mạch. Bài 03 giả định bạn nhớ đúng bảng quyết định bật virtual threads ở bài 02, và
<Recall>sẽ nhắc lại trước khi vào bài. - Đừng bỏ qua mini-challenge (bài 07): đó là chỗ duy nhất kiến thức sáu bài ráp lại thành một service thật, và là bằng chứng cho cả năm learning outcome ở trên.
Bài tiếp theo: Record làm DTO — nơi record hợp và nơi record gãy
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên