วิธีสนับสนุน API รุ่นต่างๆ


15

ฉันกำลังเขียน API ส่วนที่เหลือและสงสัยว่าจะจัดการกับเวอร์ชันต่าง ๆ ได้ดีที่สุดอย่างไร จากนี้ฉันไม่ได้หมายถึงวิธีการกำหนด URI เป็น V2 หรือ V3 แต่วิธีการจัดโครงสร้างรหัสที่กำหนดว่าจะต้อง:

  • รองรับหลายรุ่นในเวลาเดียวกันเช่น URIs V1 & V2 และ V3 ต้องใช้งานพร้อมกัน ฉันจะออก V1 เมื่อพูดว่า V4 เข้ามาเพื่อ จำกัด จำนวนเงินที่สนับสนุนในแต่ละครั้ง
  • หลีกเลี่ยงการทำซ้ำรหัสมากที่สุด
  • ทำให้ง่ายต่อการเพิ่มการเปลี่ยนแปลงที่ไม่ทำลายกับเวอร์ชันโดยไม่ส่งผลกระทบกับเวอร์ชันอื่น

ดูเหมือนว่ามีวิธีการบางอย่างที่สามารถทำได้:

  • ใช้ Git เพื่อควบคุมเวอร์ชันโดยมีสาขาสำหรับเวอร์ชันต่าง ๆ (และเวอร์ชันเก่าเป็นหลักโดยที่ไม่มีงานพัฒนาใหม่เกิดขึ้น) นี่หมายความว่าจะไม่มีการทำสำเนารหัสเนื่องจากมีเพียงเวอร์ชันล่าสุดเท่านั้นที่อยู่ในรหัส แต่รุ่นก่อนหน้านี้จะต้องทำงานกับ DB เวอร์ชันใหม่จนกว่าจะถูกยกเลิก

  • ทำซ้ำรหัสเพื่อให้แต่ละรุ่นได้รับการจัดการในแอปพลิเคชันเดียวกันและมีเส้นทางรหัสแยกกันโดยสิ้นเชิง แต่สิ่งนี้จะหมายถึงการทำซ้ำจำนวนมาก

  • ใช้รหัสจำนวนมากซ้ำในเวอร์ชันต่าง ๆ แต่สิ่งนี้จะทำให้ยากต่อการบำรุงรักษาเนื่องจากการเปลี่ยนหนึ่งเวอร์ชันมีแนวโน้มที่จะกระทบกับเวอร์ชันก่อนหน้ามากกว่า

มีวิธีปฏิบัติที่ดีที่สุดในการจัดการกับปัญหานี้เนื่องจากตัวเลือกทั้งหมดดูเหมือนจะมีปัญหาของตัวเองหรือไม่?


1
หากคุณระบุหมายเลขเวอร์ชั่นใน URL (เช่น myserver / api / 3.1.4 / user / get) คุณสามารถส่งหมายเลขเวอร์ชันไปยังฟังก์ชั่นที่คุณเรียกใช้เพื่อให้คุณสามารถ จำกัด การทำงานเฉพาะเวอร์ชั่นได้โดยไม่ต้องใช้รหัสมากเกินไป
James McLeod

คำตอบ:


5

ทำเช่นนี้:

ใช้รหัสจำนวนมากซ้ำในเวอร์ชันต่าง ๆ แต่สิ่งนี้จะทำให้ยากต่อการบำรุงรักษาเนื่องจากการเปลี่ยนหนึ่งเวอร์ชันมีแนวโน้มที่จะกระทบกับเวอร์ชันก่อนหน้ามากกว่า

แต่อย่าทำลายเวอร์ชันก่อนหน้า

คุณควรมีการทดสอบที่ตรวจสอบว่ารุ่นที่รองรับทั้งหมดทำงานอย่างถูกต้อง หากคุณไม่มีการทดสอบเหล่านั้นคุณควรสร้างการทดสอบเพื่อให้ครอบคลุมรหัสที่คุณกำลังเปลี่ยนแปลง


2

การรวมกันของการใช้สาขาปล่อย GIT (หรือแยกแต่ละรุ่นเป็นที่เก็บแยกต่างหาก) เพื่อสนับสนุนและรักษาเวอร์ชัน API เก่าและอาจมีรหัสที่ใช้งานได้อีกครั้งหนึ่งซึ่งสามารถใช้ร่วมกันเป็นการพึ่งพาเช่นไลบรารีคอมมอนส์ ไป. ดังนั้นแต่ละรุ่น API จะเป็นสิ่งประดิษฐ์ที่ปรับใช้แยกต่างหาก สิ่งนี้ทำให้เกิดความยืดหยุ่นตัวอย่างเช่น API V1 สามารถขึ้นอยู่กับคอมมอนส์ V1 ในขณะที่ APIs V2, V3, V4 สามารถพึ่งพาคอมมอนส์ V2 ได้ นี่จะเป็นวิธีที่ง่ายที่สุดและสะอาดที่สุดจากมุมมองการพัฒนาเนื่องจากฐานรหัสของคุณจะไม่คูณกับเวอร์ชันใหม่แต่ละรุ่น แต่ทุกเวอร์ชันจะแยกเป็นโครงการฐาน / รหัสของตัวเองและเกี่ยวข้องกับตัวเองเท่านั้น

อีกเหตุผลหนึ่งในการปรับใช้ส่วนแยกต่างหากคืออาจมีข้อกังวลข้ามเช่นกลไกการรักษาความปลอดภัยหรือกรอบ / ไลบรารีเช่นกรอบการฉีดพึ่งพาของคุณที่สามารถเปลี่ยนแปลงใน API รุ่นใหม่กว่าและจะสร้างความยากลำบากมากในการสนับสนุน API เก่า ๆ ทั้งหมดอยู่ในฐานรหัสเดียวกัน (และ Classloader ตอนรันไทม์หากเป็นจาวา)

ทุกวิธีการไม่ว่าจะเป็นสาขาต่อรุ่นหรือฐานรหัสซ้ำเสาหินมักจะมีปัญหาของจุดรวมทั่วไป (เช่น DB หรือสคีแคชแบบกระจาย) จำเป็นต้องเปลี่ยน API เวอร์ชันเก่ากว่าอาจต้องการการบำรุงรักษาบางอย่างเพื่อทำงานกับการเปลี่ยนแปลงเหล่านั้นหรือการแนะนำเครื่องมืออื่น ๆ (เช่นมุมมองฐานข้อมูล) เพื่อช่วยในการทำงานร่วมกัน นี่อาจเป็นปัญหาที่หลีกเลี่ยงไม่ได้ทั้งนี้ขึ้นอยู่กับลักษณะของการเปลี่ยนแปลงของคุณ


0

ฉันไม่ทราบว่าผลลัพธ์ต่างจากเวอร์ชัน API ของคุณอย่างไร แต่คุณอาจมีเลเยอร์ความเข้ากันได้อยู่ตรงกลางซึ่งสามารถสลับระหว่างเวอร์ชันและเติมช่องว่างหรือแปลข้อมูล

ที่ถูกกล่าวว่า - มันมักจะไม่ทำงาน 1-1 ต่อหนึ่งดังนั้นการออกแบบสวิทช์หรือเครื่องรัฐได้ช่วยฉันด้วยปัญหานี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.