一步一步演進RESTful API版本 - frankel
設計一個直觀、使用者友好的 RESTful API 是一項艱鉅的工作。如果這是您的第一次嘗試,這可能已經是一項艱鉅的任務。規劃 API 的生命週期管理可能是事後才想到的。但無論如何都是有可能的:在這篇文章中,我想提出一種嚴肅的方法來發展你的 API,即使它沒有計劃。
讓我們假設一個在使用時說“Hello”的示例應用程式:
> curl http://org.apisix/hello Hello world > curl http://org.apisix/hello/Joe Hello Joe |
使用 API 閘道器
第一步也是最關鍵的一步是停止將應用程式直接暴露在網際網路上,並在它們之間建立一個 API 閘道器。
版本化 API
演進 API 意味著 API 的多個版本需要在某個時候共存。
三種方法:
curl http://org.apisix/hello?version=1 curl http://org.apisix/hello?version=2 curl -H 'Version: 1' http://org.apisix/hello curl -H 'Version: 2' http://org.apisix/hello curl http://org.apisix/v1/hello curl http://org.apisix/v2/hello |
在這個階段,我們已經配置了兩條路由,一條是版本化的,另一條是非版本化的:
> curl http://org.apisix/hello Hello world > curl http://org.apisix/v1/hello Hello world |
將使用者從非版本化路徑遷移到版本化路徑
我們已經對 API 進行了版本控制,但我們的使用者可能仍在使用舊的非版本控制 API。我們希望他們遷移,但我們不能只刪除舊路由,因為我們的使用者不知道它。幸運的是,301 HTTP 狀態碼是我們的朋友:我們可以讓使用者知道資源已經從 http://org.apisix/hello 移動到了 http://org.apisix/v1/hello。它需要在初始路由上配置重定向外掛:
curl http://apisix:9080/apisix/admin/routes/1 -H 'X-API-KEY: xyz' -X PATCH -d ' { "plugins": { "redirect": { "uri": "/v1$uri", "ret_code": 301 } } }' |
結果很有趣:
要麼使用者將透明地使用新端點,因為他們將跟隨,要麼他們的整合中斷,他們會注意到 301 狀態和要使用的新 API 位置。
瞭解你的使用者
您可能已經注意到,到目前為止,我們不知道誰在使用我們的 API。當我們不得不引入改變時,我們必須要有創意,不要破壞使用者的使用。其他變化可能並不那麼容易應對。因此,我們應該努力瞭解我們的使用者,以便在必要時與他們聯絡。
建立使用者
您可能應該開始看到您的使用者訪問註冊頁面,具體取決於您限制未經身份驗證的使用量。註冊有很多方面;有可能:
- 自動化或需要儘可能多的手動驗證步驟
- 免費或付費
- 就像在沒有進一步驗證的情況下詢問電子郵件一樣簡單,或者像需要更多資料一樣複雜
- 等等。
這取決於您的具體情況。
生產測試
在這個階段,我們現在準備讓使用者瞭解我們的 Hello world API 的改進版本。我假設我們的團隊對其進行了徹底的測試,但新程式碼總是有風險的。部署現有應用程式的漏洞百出的新版本可能會對 API 提供商的形象(以及收入!)產生負面影響。
棄用舊版本
大多數使用者可能會遷移到新版本以從中受益,但其中一小部分會留在 v1.1 上。這可能有多種原因:沒有合適的時間(提示:它永遠不會)、太貴、沒有足夠的遷移動力,等等。但作為 API 提供者,每個部署的版本都有一定的成本。您可能需要在某個時候停用 v1。
結論
在這篇文章中,我們描述了一個簡單的分步流程來管理 API 的生命週期:
- 不要直接暴露你的 API;前面設定一個API閘道器
- 使用路徑、查詢引數或請求標頭對現有 API 進行版本控制
- 將使用者從未版本化端點遷移到具有 301 狀態程式碼的版本化端點
- 輕輕推動您的使用者註冊
- 在生產中進行測試,首先複製流量,然後將一小部分使用者轉移到新版本
- 正式釋出新版本
- 透過標準響應標頭傳達舊版本的棄用
詳細點選標題
這篇文章的完整原始碼可以在Github上以 maven 格式找到。
API版本控制相關文章:
- https://stripe.com/blog/api-versioning
- https://apisyouwonthate.com/blog/api-evolution-for-rest-http-apis
- https://apigility.org/documentation/api-primer/versioning
相關文章
- 終端側生成式AI下一步將如何演進?AI
- Celery:進一步探索
- Markdown 版本演進
- 進一步詳解Wsgi
- Yii2.0 RESTful API 之版本控制RESTAPI
- Gradle 與 AGP 構建 API: 進一步完善您的外掛!GradleAPI
- 一步一步來
- 一步一步上手MyBatisPlusMyBatis
- 只需一步,在Spring Boot中統一Restful API返回值格式與統一處理異常Spring BootRESTAPI
- 一步一步學spring bootSpring Boot
- 如何一步一步配置webpackWeb
- 一步一步理解命令模式模式
- 一步一步手寫GPTGPT
- 雲原生的進一步具象化
- 一步一步分析vue之observeVue
- 一步一步教你寫kubernetes sidecarIDE
- 一步一步搭建腳手架
- 一步一步教你 https 抓包HTTP
- 一步一步分析Redux原始碼?Redux原始碼
- 支撐千萬級併發的架構師如何一步步演進的?架構
- 一步一步編譯最新版Apache Doris 0.15版本的詳細過程編譯Apache
- 品牌營銷的第一步:進行品牌商標註冊,進一步細分市場
- 一步一步分析vue之$mount(1)Vue
- js原型鏈,一步一步找祖宗JS原型
- 一步一步實現一個PromisePromise
- Android新增OpenCV支援,一步一步新增。AndroidOpenCV
- 一步一步實現手寫PromisePromise
- AndroidLifecycle對MVP模式進一步”解耦“AndroidMVP模式解耦
- [C#] (原創)一步一步教你自定義控制元件——04,ProgressBar(進度條)C#控制元件
- [Flink] Flink 版本特性的演進
- API 演進的正確方式API
- 一步一步,實現自己的ButterKnife(二)
- 一步一步讀懂JS繼承模式JS繼承模式
- 一步一步實現單身狗雨
- js 真的是一步一步手寫promiseJSPromise
- 一步一步開發SSL線上工具
- 一步一步理解Generator函式的原理函式
- 一步一步來:手寫Koa2