ADR-009 - Chính sách Quản trị API (API Governance) cho hệ thống dx-vas
📌 Bối cảnh¶
Hệ thống dx-vas bao gồm nhiều dịch vụ cung cấp và tiêu thụ API: - API Gateway (điểm vào trung tâm) - Các backend: CRM Adapter, LMS Proxy, Notification Service, SIS Adapter... - Frontend webapp (Portal, Admin) - Dịch vụ bên ngoài (Zalo, Google OAuth, Firebase...)
Để đảm bảo sự thống nhất, bảo trì lâu dài và khả năng mở rộng, toàn hệ thống cần có chính sách quản trị API (API Governance) chung.
🧠 Quyết định¶
Áp dụng chính sách API Governance chuẩn, bao gồm versioning, linting, schema hóa OpenAPI, quy trình review, và tài liệu hoá tự động. Áp dụng cho tất cả các API nội bộ và external-facing trong dx-vas.
📐 Nguyên tắc chung¶
1. API phải có version rõ ràng¶
- Sử dụng prefix trong path:
/api/v1/... - Thay đổi breaking → tạo version mới (
v2) - Các version song song được duy trì trong thời gian chuyển tiếp (6–12 tháng)
2. API phải có tài liệu OpenAPI¶
- Viết OpenAPI schema (YAML/JSON) theo chuẩn 3.x
- Mỗi service cần expose
GET /openapi.json - Dùng Swagger UI hoặc Redoc để render trong CI hoặc Docs
3. Linting & kiểm tra tự động¶
- Dùng
speccy,spectral, hoặcoas-linterđể: - Bắt lỗi thiếu description, type
- Kiểm tra naming convention, security scheme, 2xx/4xx đầy đủ
- Tích hợp trong CI/CD:
- Fail build nếu OpenAPI có lỗi nặng
4. Tên endpoint và schema có quy tắc¶
- Tên endpoint RESTful:
/students/{id},/grades/{student_id} - Tham số đường dẫn
snake_case, danh từ số nhiều - Dữ liệu trả về dạng JSON, response chuẩn hoá
{data, error, meta}
5. Versioning & Deprecation Policy¶
- Mỗi version API được ghi rõ ngày phát hành và ngày dự kiến ngưng hỗ trợ (sunset date)
- Endpoint cũ được thêm header:
- Có endpoint
/api/docs/deprecationđể liệt kê API sắp ngưng hỗ trợ
6. Quy trình review và phê duyệt¶
- Mỗi thay đổi schema cần mở Pull Request với:
- File OpenAPI mới hoặc diff
- Ghi rõ breaking / non-breaking
- Chạy pass linter + test contract (xem ADR-010)
- Review bởi team kiến trúc và đại diện frontend/backend liên quan
7. Gắn metadata cho mỗi API¶
- Thêm tag, owner, description trong OpenAPI
- Mục tiêu: giúp team phân tích và hiểu rõ từng API endpoint
🛠 Công cụ đề xuất¶
| Mục tiêu | Công cụ |
|---|---|
| Lint & kiểm tra schema | Spectral, Speccy, oasdiff |
| So sánh version | oasdiff, schemathesis diff |
| Render docs | Redoc, Swagger UI, Stoplight |
| CI/CD tích hợp | GitHub Actions (lint-openapi.yml) |
✅ Lợi ích¶
- API dễ hiểu, dễ tích hợp và mở rộng
- Giảm lỗi khi tích hợp đa dịch vụ / frontend
- Tăng khả năng tuân thủ, kiểm soát thay đổi API
- Giúp các team làm việc trơn tru hơn nhờ tài liệu tự động và thống nhất
❌ Rủi ro & Giải pháp¶
| Rủi ro | Giải pháp |
|---|---|
| API không có schema rõ ràng → lỗi tích hợp | Bắt buộc check trong CI/CD, fail nếu thiếu OpenAPI |
| Không quản lý version tốt → phá vỡ tích hợp | Gắn version, áp dụng chính sách deprecation rõ ràng |
| Review bị chậm | Có checklist PR + phân quyền người duyệt theo module |
🔄 Các phương án đã loại bỏ¶
| Phương án | Lý do không chọn |
|---|---|
| Không dùng version prefix | Dễ gây breaking change ngầm |
| Chỉ viết tài liệu Markdown | Không tự sinh schema, khó check tự động |
| Quản lý API tự do theo từng team | Thiếu chuẩn hoá, khó maintain hệ thống lớn |
📎 Tài liệu liên quan¶
“API tốt là tài liệu – nhưng API có governance tốt là tài sản của cả tổ chức.”