ADR-0001. Định tuyến động dựa trên label của Traefik thay cho bảng route tĩnh
| Trường | Giá trị |
|---|---|
| Trạng thái | Accepted |
| Ngày | 2025-01-20 |
| Người quyết định | Phat Nguyen |
| Thay thế | - |
Bối cảnh
- Nền tảng chạy khoảng 13 service backend trong Docker Compose, mỗi service sở hữu prefix
/v1/api/<svc>riêng; số lượng service tăng dần theo thời gian. - Một bảng route trung tâm phải duy trì thủ công sẽ dễ lệch khỏi thực tế: mỗi khi thêm service mới hay đổi port lại cần một lần chỉnh sửa phối hợp kèm reload gateway.
- Chúng tôi muốn không phải redeploy gateway khi thêm service, và có một lộ trình chuyển sang Kubernetes một cách máy móc.
- Mỗi service vốn đã đặt
APP_ENV_SERVER_BASE_PATH=/v1/api/<svc>- định tuyến hoàn toàn suy ra được từ chính service.
Quyết định
Chúng tôi sẽ dùng Traefik v3.6 với Docker provider: mỗi service tự đăng ký router, port load-balancer, health check và các tham chiếu middleware qua Docker label. Không có bảng route trung tâm ở lớp proxy production.
Hệ quả
| Ưu điểm | Nhược điểm |
|---|---|
| Route của service mới xuất hiện tự động - không phải đổi config gateway | Định tuyến bị phân tán; bản đồ route đầy đủ nằm rải rác qua nhiều file compose |
Label chuyển đổi máy móc sang IngressRoute CRD của Traefik cho K8s | PathPrefix chỉ khớp theo prefix thuần - khi có chồng lấn phải đặt priority tường minh (xem Routing) |
| Sẵn có khả năng chịu lỗi (circuit breaker, rate limit, health check) mà không cần plugin | Traefik thêm một phụ thuộc vào Docker socket |
| Nạp lại nóng các middleware dùng chung qua file provider | Middleware dùng chung phải có hậu tố @file, nếu không sẽ lỗi âm thầm |
Phương án đã cân nhắc
| Phương án | Ưu điểm | Nhược điểm | Vì sao bị loại |
|---|---|---|---|
| Bảng route trung tâm tĩnh (file Nginx/HAProxy) | Chỉ một file để đọc; dễ dự đoán | Phải sửa tay và reload mỗi lần thay đổi; dễ lệch | Tốn công vận hành; không tự khám phá |
| Kong / APISIX (route lưu trong DB/etcd) | Hệ sinh thái plugin phong phú | Cần PostgreSQL/etcd; nặng hơn nhiều | Quá tốn kém vận hành cho nhu cầu chỉ là gateway |
| Envoy (xDS) | Mạnh nhất, sẵn sàng cho service mesh | Cấu hình phức tạp nhất; không tự khám phá theo Docker label | Quá mức cần thiết khi chưa có service mesh |
Tham khảo
- Gateway Selection Report - Traefik đạt 4.60/5
- Routing