Tôi đã đọc về các chiến lược lập phiên bản cho các API ReST và điều mà không ai trong số họ đề cập đến là cách bạn quản lý cơ sở mã cơ bản.
Giả sử chúng tôi đang thực hiện một loạt các thay đổi đột phá đối với một API - ví dụ: thay đổi tài nguyên Khách hàng của chúng tôi để nó trả về các trường forename
và surname
trường riêng biệt thay vì một name
trường duy nhất . (Đối với ví dụ này, tôi sẽ sử dụng giải pháp lập phiên bản URL vì rất dễ hiểu các khái niệm liên quan, nhưng câu hỏi này cũng có thể áp dụng cho thương lượng nội dung hoặc tiêu đề HTTP tùy chỉnh)
Bây giờ chúng ta có một điểm cuối tại http://api.mycompany.com/v1/customers/{id}
và một điểm cuối không tương thích khác tại http://api.mycompany.com/v2/customers/{id}
. Chúng tôi vẫn đang phát hành các bản sửa lỗi và cập nhật bảo mật cho API v1, nhưng việc phát triển tính năng mới hiện đang tập trung vào v2. Làm cách nào để chúng tôi viết, kiểm tra và triển khai các thay đổi đối với máy chủ API của mình? Tôi có thể thấy ít nhất hai giải pháp:
Sử dụng nhánh / thẻ kiểm soát nguồn cho cơ sở mã v1. v1 và v2 được phát triển và triển khai độc lập, với các hợp nhất kiểm soát sửa đổi được sử dụng khi cần thiết để áp dụng cùng một bản sửa lỗi cho cả hai phiên bản - tương tự như cách bạn quản lý cơ sở mã cho các ứng dụng gốc khi phát triển một phiên bản mới trong khi vẫn hỗ trợ phiên bản trước.
Làm cho cơ sở mã tự nhận biết các phiên bản API, vì vậy bạn sẽ có một cơ sở mã duy nhất bao gồm cả đại diện khách hàng v1 và đại diện khách hàng v2. Xử lý việc lập phiên bản như một phần của kiến trúc giải pháp của bạn thay vì vấn đề triển khai - có thể sử dụng một số kết hợp không gian tên và định tuyến để đảm bảo các yêu cầu được xử lý bởi phiên bản chính xác.
Ưu điểm rõ ràng của mô hình chi nhánh là việc xóa các phiên bản API cũ là rất dễ dàng - chỉ cần dừng triển khai chi nhánh / thẻ thích hợp - nhưng nếu bạn đang chạy một số phiên bản, bạn có thể kết thúc với một cấu trúc chi nhánh và đường ống triển khai thực sự phức tạp. Mô hình "cơ sở mã hợp nhất" tránh được vấn đề này, nhưng (tôi nghĩ?) Sẽ khiến việc xóa các tài nguyên và điểm cuối không dùng nữa khỏi cơ sở mã sẽ khó hơn nhiều khi chúng không còn được yêu cầu. Tôi biết điều này có thể là chủ quan vì không có câu trả lời chính xác đơn giản, nhưng tôi tò mò muốn hiểu cách các tổ chức duy trì các API phức tạp trên nhiều phiên bản đang giải quyết vấn đề này.