Skip to content

ADR-0002. Bảng route Nginx cục bộ để đồng nhất với môi trường dev native

TrườngGiá trị
Trạng tháiAccepted
Ngày2025-01-20
Người quyết địnhPhat Nguyen
Thay thế-

Bối cảnh

  • Khi phát triển ở chế độ native, các service chạy thẳng trên host (127.0.0.1:31xx) chứ không nằm trong Docker - nên cơ chế tự khám phá theo Docker label của Traefik không áp dụng được.
  • Frontend muốn một base URL duy nhất (http://sgw.local.bana.com.vn/v1/api) bất kể gọi tới service nào, giống hệt như edge production.
  • Chạy toàn bộ stack Docker/Traefik trên máy cục bộ rất nặng và làm chậm vòng lặp phát triển.
  • Prefix của các service vốn đã khớp với APP_ENV_SERVER_BASE_PATH, nên không cần viết lại path.

Quyết định

Chúng tôi sẽ đặt phía trước các service native một container Nginx duy nhất (local-nx-gateway) dùng host networking, điều khiển bằng một bảng route trung tâm tường minh trong local/nginx.conf (các block upstream + location /v1/api/<svc>/ cho từng service, cùng với /stream/__gateway_health).

Hệ quả

Ưu điểmNhược điểm
Một base URL ổn định cho FE - khớp hành vi edge productionHost networking chỉ chạy trên Linux
Nhẹ - một container, không cần stack Traefik/DockerBảng route phải sửa tay: mỗi service mới cần thêm upstream + location
Path không khớp sẽ trả lỗi ngay với JSON 404 rõ ràngHai định nghĩa route phải giữ đồng bộ (label prod và nginx.conf dev)
WebSocket /stream và health probe hoạt động được cục bộKhông có middleware chịu lỗi trong dev (cố ý - gần với hành vi service thô hơn)

Phương án đã cân nhắc

Phương ánƯu điểmNhược điểmVì sao bị loại
Chạy luôn Traefik ở cục bộProxy giống hệt prodPhải Docker hoá mọi service dev; nặngTriệt tiêu vòng lặp dev native nhanh
FE trỏ thẳng tới từng 127.0.0.1:31xxKhông cần gateway nào cảNhiều base URL; không giống prod; khổ vì CORSDX kém, lệch khỏi prod
Stack dev Docker Compose kèm TraefikĐồng nhất hoàn toànBuild lại chậm, ngốn tài nguyênGây ma sát cho vòng lặp phát triển

Tham khảo

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