Learning Outcome & Exercises: Spring Cloud
Tổng kết chương Spring Cloud: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/spring-cloud.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Dựng gateway định tuyến tới 2 service đăng ký qua discovery.
- Cấu hình Resilience4j timeout + retry + circuit breaker và chứng minh fallback khi downstream chết.
- Lần theo một request qua nhiều service bằng traceId.
2. Basic: Gateway + discovery
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Gateway route /orders/** và /payments/** tới service qua lb://; tắt một instance và quan sát.
Bài liên quan: Service discovery, Spring Cloud Gateway
Hoàn thành khi:
- curl qua gateway thành công
- Log khi instance biến mất
3. Intermediate: Feign + Resilience4j
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Feign client gọi payment-service; payment trễ/lỗi → retry có backoff, mạch mở, fallback trả trạng thái PENDING.
Bài liên quan: OpenFeign & load balancer, Resilience4j
Hoàn thành khi:
- Test bằng WireMock cho lỗi 5xx và timeout
- Metric trạng thái circuit breaker
4. Challenge: Tracing end-to-end
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Gateway → order → Kafka → notification; cùng traceId xuất hiện ở cả 3 log.
Bài liên quan: Distributed tracing, Spring Cloud Stream
Hoàn thành khi:
- Log 3 service có cùng traceId
- Ghi rõ phần cần Docker
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Gateway + discovery | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Feign + Resilience4j | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Tracing end-to-end | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/spring-cloud. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Spring Cloud, câu nào hay gặp nhất và trả lời sao?
Q1. Retry và circuit breaker kết hợp thế nào cho đúng?
🇻🇳 Tiếng Việt:
Retry cho lỗi tạm thời, có giới hạn và backoff; circuit breaker bọc ngoài để khi downstream chết thì fail nhanh thay vì retry dồn dập. Chỉ retry thao tác idempotent.
🇬🇧 English:
Retry handles transient errors with a limit and backoff; the circuit breaker wraps it so that when the downstream is down we fail fast instead of piling up retries. Only retry idempotent operations.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Gateway + discovery) được coi là xong khi nào?
curl qua gateway thành công; Log khi instance biến mất. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Feign + Resilience4j) được coi là xong khi nào?
Test bằng WireMock cho lỗi 5xx và timeout; Metric trạng thái circuit breaker. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Tracing end-to-end) được coi là xong khi nào?
Log 3 service có cùng traceId; Ghi rõ phần cần Docker. Chưa có code chạy và bằng chứng thì chưa tính là xong.