Skip to content

ADR-0001. Định tuyến động dựa trên label của Traefik thay cho bảng route tĩnh

TrườngGiá trị
Trạng tháiAccepted
Ngày2025-01-20
Người quyết địnhPhat 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ểmNhượ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 K8sPathPrefix 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 pluginTraefik 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 providerMiddleware 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ểmNhược điểmVì sao bị loại
Bảng route trung tâm tĩnh (file Nginx/HAProxy)Chỉ một file để đọc; dễ dự đoánPhải sửa tay và reload mỗi lần thay đổi; dễ lệchTố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ềuQuá 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 meshCấu hình phức tạp nhất; không tự khám phá theo Docker labelQuá mức cần thiết khi chưa có service mesh

Tham khảo

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.