
如何快速實現REST API集成以優化業務流程
curl http://httpbin.org/orders?version=v1
# 請求 v2 版本的API
curl http://httpbin.org/v2/orders?version=v2
# 請求 v1 版本的API
curl http://httpbin.org/orders -H "custom-version: v1"
# 請求 v2 版本的API
curl http://httpbin.org/orders -H "custom-version: v2"
作為一個動態、實時、高性能的 API 網關,Apache APISIX 可以在任何 RESTful API 服務上運行,并使用插件來添加新的服務和擴展其功能,這符合 RESTful 定義中的?Layered system。此外,對于一些沒有遵循 RESTful API 定義的歷史服務, APISIX 也可以幫你在不改動原有業務代碼的情況下完成接口的轉換,使你的接口完成?Uniform interface?這一 REST 限制條件,使你的 API 可以更好地遵守 RESTful API 規范。
你可以只用關注業務邏輯的實現,接口的安全邏輯可以交給 APISIX Authentication 類插件處理,例如?key-auth。APISIX 支持大量的 Authentication 插件,我們以?openid-connet?為例如下圖所示:
我們可以看到,使用 APISIX(API Gateway)在業務服務器前面加一層認證邏輯,就可以起到保護上游服務的作用,讓你的業務邏輯和安全邏輯高效解耦。
APISIX 作為 API 網關,可以設立在客戶端和服務端之間,完成不同的負載需求。你甚至可以自定義負載均衡的邏輯。
支持的負載均衡算法有:
roundrobin
: Round robin balancing with weights.chash
: Consistent hash.ewma
: Pick the node with minimum latency. See?EWMA Chart?for more details.least_conn
: Picks the node with the lowest value of (active_conn + 1) / weight
. Here, an active connection is a connection being used by the request and is similar to the concept in Nginx.require("apisix.balancer.your_balancer")
對于已經存在很久的歷史 API,如果沒有很好地遵循 RESTful API 準則。你可以在不改造原有 API 邏輯的情況下重新通過 APISIX 來封裝新的 API 以滿足不同的業務場景。
在本文中上方提過我們的路徑中不要有動詞。
例如:歷史版本 API 有 /getOrder
接口,我們可以通過 proxy-rewrite
插件來將 API 請求代理到歷史 API 上:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uri": "/orders",
"plugins": {
"proxy-rewrite": {
"uri": "/getOrder",
"scheme": "http",
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:80": 1
}
}
}'
你也可以同樣使用該插件進行 API 版本管理上的操作。
當我們的歷史 API 存在響應狀態碼不規范時,我們可以通過 response-rewrite
代理 response 響應從而達到修改響應狀態碼的目的。
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uri": "/orders",
"plugins": {
"response-rewrite": {
"status_code": 201,
"body": "{\"code\":\"ok\",\"message\":\"new json body\"}",
"vars":[
[ "status","==",200 ]
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:80": 1
}
}
}
例如,這個例子表示將請求?/orders
?路徑的 API 中響應為?200
?的狀態的請求修改為?201
。 APISIX 支持非常豐富的插件,期待你去挖掘更多的玩法。
本文詳細說明了什么是 API,什么是 RESTful API 以及其最佳實踐。另外還介紹了如何通過 APISIX 來實現業務邏輯和安全邏輯分離,如何使用 APISIX 在不改動原有業務代碼的情況下將歷史 API 服務更加 RESTful。希望本文對你了解 RESTful API 有所幫助,也歡迎你來 GitHub 一起玩耍。
文章來源:Why has RESTful API become the top stream API architecture style?