Spring Production-Ready/Modern Java trong Spring — tổng quan
1/26
Bài 1 / 26~8 phútModern Java trong SpringMiễn phí lượt xem

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.

  1. 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.
  2. 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.
  3. Client gọi ra ngoài dùng đúng nền đó (bài 04-05): RestClient và @HttpExchange chạy trên virtual thread vừa học, trả về record vừa học.
  4. Kết quả nghiệp vụ được model lại cuối cùng (bài 06): sealed Result thay IllegalStateException nó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à @HttpExchange vớ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

  1. 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?
  2. Virtual threads trong Boot — một dòng config đổi những gì: spring.threads.virtual.enabled=true chạm vào đâu trong runtime Boot, và khi nào nó đáng bật?
  3. 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?
  4. 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?
  5. @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ì?
  6. 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?
  7. 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

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àiChủ đềPhút
00Tổng quan8
01Record làm DTO12
02Virtual threads trong Boot12
03Virtual threads: ba cạm bẫy13
04RestClient12
05HTTP Interface @HttpExchange11
06Sealed Result13
07Mini-challenge TaskFlow v430
08Tổng kết & cheat sheet6

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

Đặt 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

Bài tiếp theo

Record làm DTO — nơi record hợp và nơi record gãy