Cách hỗ trợ các phiên bản API khác nhau


15

Tôi đang viết API nghỉ ngơi và đang tự hỏi làm thế nào tốt nhất để xử lý hỗ trợ các phiên bản khác nhau. Bằng cách này, tôi không có nghĩa là làm thế nào để xác định URI là V2 hoặc V3, mà là cách cấu trúc mã được cung cấp mà nó cần:

  • Hỗ trợ nhiều phiên bản cùng một lúc, ví dụ. Các URI V1 & V2 & V3 phải được phát cùng lúc. Tôi sẽ nghỉ hưu V1 khi nói V4 xuất hiện để hạn chế số tiền được hỗ trợ bất cứ lúc nào.
  • Tránh sao chép mã càng nhiều càng tốt
  • Giúp dễ dàng thêm các thay đổi không phá vỡ vào một phiên bản mà không ảnh hưởng đến các phiên bản khác

Dường như có một vài cách tiếp cận có thể được thực hiện:

  • Sử dụng Git để kiểm soát các phiên bản, với một nhánh cho các phiên bản khác nhau (và các phiên bản cũ về cơ bản không có công việc phát triển mới nào được thực hiện trên đó). Điều này có nghĩa là không có sự sao chép mã vì chỉ có phiên bản mới nhất trong mã, nhưng các phiên bản trước sẽ cần phải hoạt động với phiên bản mới của DB cho đến khi chúng bị loại bỏ.

  • Mã trùng lặp để mỗi phiên bản được xử lý trong cùng một ứng dụng và có đường dẫn mã hoàn toàn riêng biệt, nhưng điều này có nghĩa là rất nhiều sự trùng lặp

  • Sử dụng lại rất nhiều mã trên các phiên bản, nhưng điều này sẽ khiến việc duy trì khó khăn hơn vì việc thay đổi một phiên bản có nhiều khả năng ảnh hưởng đến phiên bản trước

Có cách thực hành tốt nhất nào để giải quyết vấn đề này không vì tất cả các lựa chọn dường như đều có vấn đề của riêng họ?


1
Nếu bạn chỉ định số phiên bản trong URL (ví dụ: myserver / api / 3.1.4 / user / get), bạn có thể chuyển số phiên bản vào bất kỳ chức năng nào bạn gọi để bạn có thể bản địa hóa hành vi cụ thể của phiên bản mà không chia sẻ quá nhiều mã.
James McLeod

Câu trả lời:


5

Làm cái này:

Sử dụng lại rất nhiều mã trên các phiên bản, nhưng điều này sẽ khiến việc duy trì khó khăn hơn vì việc thay đổi một phiên bản có nhiều khả năng ảnh hưởng đến phiên bản trước

nhưng đừng phá vỡ các phiên bản trước.

Bạn nên có các bài kiểm tra xác minh rằng tất cả các phiên bản được hỗ trợ đều hoạt động chính xác. Nếu bạn không có các thử nghiệm đó, thì trước tiên bạn nên tạo chúng để bao gồm bất kỳ mã nào bạn đang thay đổi.


2

Một sự kết hợp của việc sử dụng các nhánh phát hành GIT (hoặc phân tách từng phiên bản vào một kho lưu trữ riêng) để hỗ trợ và duy trì các phiên bản API cũ và có thể có một số mã có thể sử dụng lại có thể được chia sẻ như một phụ thuộc, như thư viện commons, rất có thể là cách đi. Vì vậy, mỗi phiên bản API sẽ là một tạo phẩm có thể triển khai riêng. Điều này cho phép linh hoạt, ví dụ, API V1 có thể phụ thuộc vào commons V1, trong khi API V2, V3, V4 có thể phụ thuộc vào commons V2. Đây sẽ là cách dễ nhất và sạch nhất từ ​​góc độ phát triển vì cơ sở mã của bạn không nhân với mỗi phiên bản mới, thay vào đó mọi phiên bản được tách biệt thành cơ sở dự án / mã riêng của nó và chỉ liên quan đến chính nó.

Một lý do khác để triển khai các tạo phẩm riêng biệt là có thể có các mối quan tâm xuyên suốt như cơ chế bảo mật hoặc khung / thư viện như khung tiêm phụ thuộc của bạn có thể thay đổi trong các phiên bản API mới hơn và sẽ gặp nhiều khó khăn trong việc hỗ trợ các API cũ hơn nếu chúng tất cả đều sống trong cùng một cơ sở mã (và Classloader khi chạy, nếu đó là Java).

Mọi cách tiếp cận, cho dù là một nhánh trên mỗi phiên bản hoặc cơ sở mã trùng lặp nguyên khối, sẽ luôn luôn có vấn đề về một điểm tích hợp chung (như DB hoặc lược đồ bộ đệm phân tán) cần phải thay đổi. API phiên bản cũ hơn có thể yêu cầu một số loại bảo trì để hoạt động với những thay đổi đó hoặc giới thiệu một số công cụ khác (như chế độ xem cơ sở dữ liệu) để giúp tương thích. Đây có thể là một khó khăn không thể tránh khỏi tùy thuộc vào bản chất của những thay đổi của bạn.


0

Tôi không biết kết quả khác với các phiên bản API của bạn như thế nào, nhưng bạn có thể có một lớp tương thích ở giữa, có thể chuyển đổi giữa các phiên bản và điền vào các khoảng trống hoặc dịch dữ liệu.

Điều đó đang được nói - nó thường không bao giờ giải quyết được từng cái một - vì vậy một thiết kế loại máy chuyển đổi hoặc trạng thái đã giúp tôi giải quyết vấn đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.