Kong API Gateway 管理API詳解

2021-01-10 IT程式設計師alian

一、前言

安裝好了Kong,那麼如何使用和管理它呢?Kong附帶了一個管理的API接口,我們通過這個API接口來管理所有的API以及其他的資源,這個接口具有最高的權限,所以在生產環境中我們要特別注意這個接口的權限,通常我們不會將這個接口暴露在外網中。

如果Kong是以集群的狀態的運行的,那麼你只需要將管理API的請求發送到其中的一個節點中,Kong會自動同步信息到其他的節點。Kong默認監聽8001和8444兩個埠用接受管理API的請求,8001為http埠,8444為https埠

Kong支持application/x-www-form-urlencoded和application/json兩種類型,POST的數據我們需要以json的格式發送。

Kong大概有以下幾個管理對象:

節點信息服務路由用戶插件證書SNI上遊信息目標在Kong0.13.0版本以前,有API對象,但是從0.13.0之後開始逐步拋棄API對象,使用路由和服務組合來取代API對象,這提高了Kong的靈活性。基於此本文也將不介紹有關API對象的操作

本文約定:

我使用的是Kong_0.14.1版本節點管理地址為 http://192.168.0.184:8001使用curl請求接口,並且將得到的結果通過管道送給python進行格式化例如:

linuxops@deepin:~$curl -s http://192.168.0.184:8001/status | python -m json.tool{ "database": { "reachable": true }, "server": { "connections_accepted": 112, "connections_active": 1, "connections_handled": 112, "connections_reading": 0, "connections_waiting": 0, "connections_writing": 1, "total_requests": 65 }}在以上的示例中,-s參數表示靜默模式,curl將不輸入信息,這樣我們就可以不列印我們不需要關注的信息。

然後將得到的結果通過管道送給python進行格式化,這樣列印出來的就是格式化的json,方便我們查看。

下面我們一起看一下每一種對象的操作

二、節點信息

1、查看節點信息

接口信息:

接口名稱查看節點詳細信息請求端點/請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s http://192.168.0.184:8001 | python -m json.tool返回值:

查詢節點詳細信息返回的信息非常多,這裡就顯示了。

2、查看節點狀態

這個接口查詢節點的狀態,主要是顯示nginx進程處理連接的情況,以及資料庫連接的情況。

如果Kong是以集群的方式運行,那麼如果要查看其他節點的情況,必須要要一個一個訪問節點的此接口。

因為Kong是基於nginx的,你也可以直接使用Nginx的監控工具。

接口信息:

接口名稱查看節點狀態請求端點/status請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s http://192.168.0.184:8001/status | python -m json.tool返回值:

{ "database": { "reachable": true }, "server": { "connections_accepted": 111, "connections_active": 1, "connections_handled": 111, "connections_reading": 0, "connections_waiting": 0, "connections_writing": 1, "total_requests": 64 }}在返回的數據中,各個值的含義如下::

total_requests:客戶端請求的總數。connections_active:當前活動客戶端連接數,包括等待連接。connections_accepted:已接受的客戶端連接總數。connections_handled:已處理連接的總數。通常,參數值與accept相同,除非已達到某些資源限制。connections_reading:Kong正在讀取請求標頭的當前連接數。connections_writing:nginx將響應寫回客戶端的當前連接數。connections_waiting:等待請求的當前空閒客戶端連接數。三、服務

服務是每一個後端真實接口的抽象,它與路由關聯,客戶端發起請求,如果路由匹配到了,那麼會將這個請求代理到與匹配路由相關聯的服務中。

1、添加服務

接口信息:

接口名稱添加服務請求端點/services/請求方法POST返回狀態HTTP 201 Created

請求參數:

參數名類型默認值是否必須說明namestring否服務名稱,全局唯一protocolstringhttp是和上遊通訊的協議取值http或httpshoststring是上遊伺服器的主機portint80是上遊伺服器的埠pathstring否上遊伺服器請求中的路徑,必須以/開頭retriesint5否代理失敗時要執行的重試次數connect_timeoutint60000否與上遊連接的超時時間,單位毫秒write_timeoutint60000否向上遊發送請求兩次連續寫操作的超時時間 ,單位毫秒read_timeoutint60000否用於向上遊伺服器發送請求的兩次連續讀取操作之間的超時 ,單位毫秒

請求示例:

curl -s -X POST --url http://192.168.0.184:8001/services/ \-d 'name=linuxops_server' \-d 'protocol=http' \-d 'host=www.baidu.com'\| python -m json.tool返回值:

{ "connect_timeout": 60000, "created_at": 1537924532, "host": "www.baidu.com", "id": "27f30248-fef1-4ddc-9fdc-4ca73f354c64", "name": "linuxops_server", "path": null, "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1537924532, "write_timeout": 60000}如果在創建服務的時候沒有指定name,那麼Kong並不會自動創建name,但是會創建UUID形式的ID,Kong在調用、匹配等等的操作都是可以基於這個ID,所以這個ID絕對是全局唯一的。

在其他的對象管理中,name欄位可能是必須的,通常這個name資源也是全局唯一的,即便如此,Kong也會創建ID欄位,也可以通過這個ID欄位來匹配。

在服務對象中,能組合起來成為上遊服務也是唯一的,也就是說,在一個服務中無法同時存在 http和https,如果上遊提供http和https服務,同時也需要Kong代理它們的話,那必須要設置兩個服務。

2、查詢服務

接口信息:

接口名稱查詢服務請求端點/services/{name or id}請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s --url http://192.168.0.184:8001/services/27f30248-fef1-4ddc-9fdc-4ca73f354c64 | python -m json.tool返回值:

{ "connect_timeout": 60000, "created_at": 1537986798, "host": "www.baidu.com", "id": "27f30248-fef1-4ddc-9fdc-4ca73f354c64", "name": "linuxops_server", "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1537986798, "write_timeout": 60000}查詢服務的接口我們可以通過id來查詢,也可以通過name來查詢,在創建服務的時候可以不指定name欄位,在系統中顯示為null,這種服務就無法通過指定name來查詢了,必須要使用id來查詢,所以,強烈建議在創建服務的時候指定name,這是一個好習慣。

3、查詢所有服務

接口信息:

接口名稱查詢所有服務請求端點/services/請求方法GET返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明offsetstring否分頁偏移,用於定義列表中的唯一sizeint100否每頁返回的對象的數量

請求示例:

curl -s --url http://192.168.0.184:8001/services/?size=1 | python -m json.tool返回值:

{ "data": [ { "connect_timeout": 60000, "created_at": 1537986798, "host": "www.baidu.com", "id": "27f30248-fef1-4ddc-9fdc-4ca73f354c64", "name": "linuxops_server", "path": null, "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1537986798, "write_timeout": 60000 } ], "next": "/services?offset=WyIyN2YzMDI0OC1mZWYxLTRkZGMtOWZkYy00Y2E3M2YzNTRjNjQiXQ", "offset": "WyIyN2YzMDI0OC1mZWYxLTRkZGMtOWZkYy00Y2E3M2YzNTRjNjQiXQ"}在上面的請求示例中,我們帶了一個size的參數來限定每一頁的數量,在返回的結果中有兩個欄位,next表示下一頁的端點,offset是本頁的偏移。

當然,如果你在讀取下一頁的時候還需要限定返回的數據,還是依然要使用size的參數

4、更新服務

接口信息:

接口名稱查詢所有服務請求端點/services/{name or id}請求方法PATCH返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明namestring否服務名稱,全局唯一protocolstringhttp是和上遊通訊的協議取值http或httpshoststring是上遊伺服器的主機portint80是上遊伺服器的埠pathstring否上遊伺服器請求中的路徑,必須以/開頭retriesint5否代理失敗時要執行的重試次數connect_timeoutint60000否與上遊連接的超時時間,單位毫秒write_timeoutint60000否向上遊發送請求兩次連續寫操作的超時時間 ,單位毫秒read_timeoutint60000否用於向上遊伺服器發送請求的兩次連續讀取操作之間的超時 ,單位毫秒

請求示例:

curl -s -X PATCH --url http://192.168.0.184:8001/services/linuxops_server \-d 'name=linuxops_server_patch' \-d 'protocol=http' \-d 'host=www.baidu.com' \ | python -m json.tool返回值:

{ "connect_timeout": 60000, "created_at": 1537986798, "host": "www.baidu.com", "id": "27f30248-fef1-4ddc-9fdc-4ca73f354c64", "name": "linuxops_server_patch", "path": null, "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1537989418, "write_timeout": 60000}和查看服務的接口一樣,接入點是需要帶上id或者name的,只不過方法變成了PATCH,參數和添加的參數一樣。

在上面的示例中,我修改了一個服務的name,從返回值中可以可能出來id是不會變化的。

5、更新或者創建服務

接口信息:

接口名稱更新或者創建服務請求端點/services/{name or id}請求方法PUT返回狀態HTTP 201 Created or HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明namestring否服務名稱,全局唯一protocolstringhttp是和上遊通訊的協議取值http或httpshoststring是上遊伺服器的主機portint80是上遊伺服器的埠pathstring否上遊伺服器請求中的路徑,必須以/開頭retriesint5否代理失敗時要執行的重試次數connect_timeoutint60000否與上遊連接的超時時間,單位毫秒write_timeoutint60000否向上遊發送請求兩次連續寫操作的超時時間 ,單位毫秒read_timeoutint60000否用於向上遊伺服器發送請求的兩次連續讀取操作之間的超時 ,單位毫秒

請求示例:

curl -s -X PUT --url http://192.168.0.184:8001/services/linuxops_server_put \-d 'name=linuxops_server_patch' \-d 'protocol=http' \-d 'host=www.baidu.com' \ | python -m json.tool返回值:

{ "connect_timeout": 60000, "created_at": 1537991524, "host": "www.baidu.com", "id": "7242306f-3a55-46b5-9cda-cfb6c25a421c", "name": "linuxops_server_put", "path": null, "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1537991524, "write_timeout": 60000}這個接口是更新或者創建一個服務,接入點和查詢、更新是一樣的,不一樣的是用了PUT的方法。

此接口帶了{name or id},Kong會根據{name or id}的信息查詢資料庫,如果對應的數據存在,那麼更新,如果對於的數據不存在,那麼就新增。

在更新服務的接口中,我們也是可以帶{name or id},無論是帶了id還是name,服務中的name欄位都是能被更新到的,但是這個接口就有點不一樣了。

有以下幾種情況:

1.如果這個接口帶的是name,例如/services/linuxops_server Kong會判斷name為」linuxops_server「的服務存不存在,如果存在,則更新,這個時候POST到Kong的數據中name欄位無效,Kong並不會修改。 如果不存在」linuxops_server「這個服務存,那麼會創建name為"linuxops_server"的服務,並且Kong會生成UUID形式的id,此時POST上來的數據中的name欄位依然無效。

2.如果這個接口帶的是id,例如/services/ca4f16bc-1562-4ab8-b201-131c7ac393f0 Kong會判斷id為"ca4f16bc-1562-4ab8-b201-131c7ac393f0"的服務是否存在,如果存在,那麼更新它,這個時候如果POST上來的數據中有name欄位,那麼Kong會更新name。 如果id為"ca4f16bc-1562-4ab8-b201-131c7ac393f0"的服務不存在,那麼Kong會創建name為"ca4f16bc-1562-4ab8-b201-131c7ac393f0"的服務,並且Kong會生成UUID形式的id,這個時候POST上來的數據中如果有name欄位,那麼這個欄位無效。

6、刪除服務

接口信息:

接口名稱刪除服務請求端點/services/{name or id}請求方法DELETE返回狀態HTTP 204 No Content

請求參數:

請求示例:

curl -i -X DELETE --url http://192.168.0.184:8001/services/b6094754-07da-4c31-bb95-0a7caf5e6c0b返回值:

此接口沒有返回值

四、路由

路由用來匹配客戶端請求的規則,每一個路由都要與一個服務相關聯,當一個請求到達Kong的時候,會先給路由匹配,如果匹配成功,那麼會將請求轉發給服務,服務再去後端請求數據。所以路由是Kong的入口。

在Kong0.13.0之前的版本有API實體,因為API實體使用用起來並不方便,所以將API實體拆分成路由和服務,這樣提供了最大的自由度。

Kong的一個API實體必須是路由和服務的組合。

1、添加路由

接口信息:

接口名稱添加路由請求端點/routes/請求方法POST返回狀態HTTP 201 Created

請求參數:

參數名類型默認值是否必須說明protocolsstring or list["http", "https"]否此路由允許的協議,取值http或httpsmethodsstring or listnull*否此路由允許的方法hostsstring or listnull*否此路由允許的域名pathsstring or listnull*否此路由匹配的pathstrip_pathbooltrue否匹配到path時,是否刪除匹配到的前綴preserve_hostboolfalse否匹配到hosts時,使用請求頭部的值為域名向後端發起請求,請求的頭部為"host",例如"host:api.abc.com"servicestring是關聯的服務id。這裡需要特別注意,如果是以表達的形式發送的,需要以 service.id=<service_id>形式發送,如果是json,需要以"service":{"id":"<service_id>"}形式發送

請求示例:

curl -s -X POST --url http://192.168.0.184:8001/routes \-d 'protocols=http' \-d 'methods=GET' \-d 'paths=/weather' \-d 'service.id=43921b23-65fc-4722-a4e0-99bf84e26593' \| python -m json.tool返回值:

{ "created_at": 1538089234, "hosts": null, "id": "cce1a279-d05a-4faa-8c10-1f9d27b881c9", "methods": [ "GET" ], "paths": [ "/weather" ], "preserve_host": false, "protocols": [ "http" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538089234}在上面的示例中,我們創建了一個路由並且關聯了一個服務,在創建路由的時候並沒有指定hosts,路由匹配到host的時候會允許所有,因為默認值為null。當然如果不指定其他的也是一樣的。

值得注意的是,methods,hosts,paths這三個參數必須要指定一個,否則無法創建路由。

路由和服務組合的規則相對比較複雜,我們將會重新開一篇文章來專門講解這個,本文僅僅關注管理API的使用。

2、查看路由

接口信息:

接口名稱查看路由請求端點/routes/{id}請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s http://192.168.0.184:8001/routes/6c6b7863-9a05-4d51-bf7e-8e4e5866a131 | python -m json.tool返回值:

{ "created_at": 1538089668, "id": "6c6b7863-9a05-4d51-bf7e-8e4e5866a131", "paths": [ "/weather" ], "preserve_host": false, "protocols": [ "http", "https" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538089668}路由中沒有name欄位,所以只能通過ID來查看。

3、查詢所有路由

接口信息:

接口名稱查詢所有路由請求端點/routes請求方法GET返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明offsetstring否分頁偏移,用於定義列表中的唯一sizeint100否每頁返回的對象的數量

請求示例:

curl -s --url http://192.168.0.184:8001/routes/?size=1 | python -m json.tool返回值:

{ "data": [ { "created_at": 1538004899, "hosts": [], "id": "19377681-ba1c-43dc-9eb6-ff117467ce96", "methods": [ "GET", "POST" ], "paths": [], "preserve_host": false, "protocols": [ "http", "https" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538071225 } ], "next": "/routes?offset=WyIxOTM3NzY4MS1iYTFjLTQzZGMtOWViNi1mZjExNzQ2N2NlOTYiXQ", "offset": "WyIxOTM3NzY4MS1iYTFjLTQzZGMtOWViNi1mZjExNzQ2N2NlOTYiXQ"}在上面的請求示例中,我們帶了一個size的參數來限定每一頁的數量,在返回的結果中有兩個欄位,next表示下一頁的端點,offset是本頁的偏移。

當然,如果你在讀取下一頁的時候還需要限定返回的數據,還是依然要使用size的參數

4、更新路由

接口信息:

接口名稱更新路由請求端點/routes/{id}請求方法PATCH返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明protocolsstring or list["http", "https"]否此路由允許的協議,取值http或httpsmethodsstring or listnull*否此路由允許的方法hostsstring or listnull*否此路由允許的域名pathsstring or listnull*否此路由匹配的pathstrip_pathbooltrue否匹配到path時,是否刪除匹配到的前綴preserve_hostboolfalse否匹配到hosts時,使用請求頭部的值為域名向後端發起請求,請求的頭部為"host",例如"host:api.abc.com"servicestring是關聯的服務id。這裡需要特別注意,如果是以表達的形式發送的,需要以 service.id=<service_id>形式發送,如果是json,需要以"service":{"id":"<service_id>"}形式發送

請求示例:

curl -s -X PATCH --url http://192.168.0.184:8001/routes/6c6b7863-9a05-4d51-bf7e-8e4e5866a131 \-d 'protocols=http' \-d 'methods=GET' \-d 'paths=/weather' \-d 'service.id=43921b23-65fc-4722-a4e0-99bf84e26593' \| python -m json.tool返回值:

{ "created_at": 1538089668, "hosts": null, "id": "6c6b7863-9a05-4d51-bf7e-8e4e5866a131", "methods": [ "GET" ], "paths": [ "/weather" ], "preserve_host": false, "protocols": [ "http" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538090658}此接口的參數和添加路由的參數一樣,接入點帶了路由的id,路由沒有name欄位,所有的匹配都是以ID匹配的。

5、更新或者添加路由

接口信息:

接口名稱更新或者添加路由請求端點/routes/{id}請求方法PUT返回狀態HTTP 201 Created or HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明protocolsstring or list["http", "https"]否此路由允許的協議,取值http或httpsmethodsstring or listnull*否此路由允許的方法hostsstring or listnull*否此路由允許的域名pathsstring or listnull*否此路由匹配的pathstrip_pathbooltrue否匹配到path時,是否刪除匹配到的前綴preserve_hostboolfalse否匹配到hosts時,使用請求頭部的值為域名向後端發起請求,請求的頭部為"host",例如"host:api.abc.com"servicestring是關聯的服務id。這裡需要特別注意,如果是以表達的形式發送的,需要以 service.id=<service_id>形式發送,如果是json,需要以"service":{"id":"<service_id>"}形式發送

請求示例:

curl -s -X PUT --url http://192.168.0.184:8001/routes/6c6b7863-9a05-4d51-bf7e-2962c1d6b0e6 \-d 'protocols=http' \-d 'methods=GET' \-d 'paths=/weather' \-d 'service.id=43921b23-65fc-4722-a4e0-99bf84e26593' \| python -m json.tool返回值:

{ "created_at": 1538091038, "hosts": null, "id": "6c6b7863-9a05-4d51-bf7e-2962c1d6b0e6", "methods": [ "GET" ], "paths": [ "/weather" ], "preserve_host": false, "protocols": [ "http" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538091038}此接口的參數和添加路由的參數一樣,接入點帶了路由的id,路由沒有name欄位,所有的匹配都是以ID匹配的。

和服務的更新創建接口差不多,只不過路由沒有name的欄位,所以匹配均是按照id來匹配,所以規則比較簡單:如果id存在則更新,如果id不存在則添加。

但是,此處的ID必須是UUID形式的ID,否則添加不成功。

6、查看和服務關聯的路由

接口信息:

接口名稱查看和服務關聯的路由請求端點/services/{service name or id}/routes請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s http://192.168.0.184:8001/services/wechat/routes | python -m json.tool返回值:

{ "data": [ { "created_at": 1538089623, "id": "cdfee2bc-a5eb-4f80-96f5-64bfe3b85507", "methods": [ "GET" ], "preserve_host": false, "protocols": [ "http", "https" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538089623 }, { "created_at": 1538089397, "id": "f8ef8876-9681-4629-a2ee-d7fac8a8094a", "methods": [ "GET" ], "paths": [ "/weather" ], "preserve_host": false, "protocols": [ "http", "https" ], "regex_priority": 0, "service": { "id": "43921b23-65fc-4722-a4e0-99bf84e26593" }, "strip_path": true, "updated_at": 1538089397 } ], "next": null}7、查看和路由關聯的服務

接口信息:

接口名稱查看和路由關聯的服務請求端點/routes/{route id}/service請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s http://192.168.0.184:8001/routes/f8ef8876-9681-4629-a2ee-d7fac8a8094a/service | python -m json.tool返回值:

{ "connect_timeout": 60000, "created_at": 1538000258, "host": "t.weather.sojson.com", "id": "43921b23-65fc-4722-a4e0-99bf84e26593", "name": "wechat", "path": "/api/weather/city/", "port": 80, "protocol": "http", "read_timeout": 60000, "retries": 5, "updated_at": 1538005796, "write_timeout": 60000}8、刪除路由

接口信息:

接口名稱刪除路由請求端點/routes/{id}請求方法DELETE返回狀態HTTP 204 No Content

請求參數:

請求示例:

curl -s http://192.168.0.184:8001/routes/f8ef8876-9681-4629-a2ee-d7fac8a8094a/service | python -m json.tool返回值:

此接口沒有返回值

五、用戶

1、添加用戶

接口信息:

接口名稱添加用戶請求端點/consumers/請求方法POST返回狀態HTTP 201 Created

請求參數:

參數名類型默認值是否必須說明usernamestringnull*否全局唯一的用戶名custom_idstringnull*否全局唯一的用戶ID

請求示例:

curl -s -X POST --url http://192.168.0.184:8001/consumers -d 'username=linuxops' | python -m json.tool返回值:

{ "created_at": 1538126090, "custom_id": null, "id": "376a9ccf-7d10-45a7-a956-77eb129d8ff0", "username": "linuxops"}在上面示例中,我們指定了一個username來創建一個用戶,從返回值看出,如果沒有指定參數,那麼默認值為空。

在調用這個接口,必須要指定username 和 custom_id其中一個參數,不能同時不指定。

在創建用戶的時候,系統都將會生成一個UUID的形式的唯一ID。

2、查詢用戶

接口信息:

接口名稱查詢用戶請求端點/consumers/{username or id}請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s http://192.168.0.184:8001/consumers/linuxops | python -m json.tool返回值:

{ "created_at": 1538126090, "id": "376a9ccf-7d10-45a7-a956-77eb129d8ff0", "username": "linuxops"}查詢用戶只能通過系統ID和username來查詢,無法通過custom_id查詢

3、查詢所有用戶

接口信息:

接口名稱查詢所有用戶請求端點/consumers請求方法GET返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明offsetstring否分頁偏移,用於定義列表中的唯一sizeint100否每頁返回的對象的數量

請求示例:

curl -s http://192.168.0.184:8001/consumers?size=1 | python -m json.tool返回值:

{ "data": [ { "created_at": 1538126090, "custom_id": null, "id": "376a9ccf-7d10-45a7-a956-77eb129d8ff0", "username": "linuxops" } ], "next": "/consumers?offset=WyIzNzZhOWNjZi03ZDEwLTQ1YTctYTk1Ni03N2ViMTI5ZDhmZjAiXQ", "offset": "WyIzNzZhOWNjZi03ZDEwLTQ1YTctYTk1Ni03N2ViMTI5ZDhmZjAiXQ"}在上面的請求示例中,我們帶了一個size的參數來限定每一頁的數量,在返回的結果中有兩個欄位,next表示下一頁的端點,offset是本頁的偏移。

當然,如果你在讀取下一頁的時候還需要限定返回的數據,還是依然要使用size的參數

4、更新用戶

接口信息:

接口名稱更新用戶請求端點/consumers/{username or id}請求方法PATCH返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明usernamestringnull*否全局唯一的用戶名custom_idstringnull*否全局唯一的用戶ID

請求示例:

curl -s -X PATCH --url http://192.168.0.184:8001/consumers/376a9ccf-7d10-45a7-a956-77eb129d8ff0 -d "custom_id=linuxops123456789" | python -m json.tool返回值:

{ "created_at": 1538126090, "custom_id": "linuxops123456789", "id": "376a9ccf-7d10-45a7-a956-77eb129d8ff0", "username": "linuxops"}5、更新或者添加用戶

接口信息:

接口名稱更新或者添加用戶請求端點/consumers/{username or id}請求方法PUT返回狀態HTTP 201 Created or HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明usernamestringnull*否全局唯一的用戶名custom_idstringnull*否全局唯一的用戶ID

請求示例:

curl -s -X PUT --url http://192.168.0.184:8001/consumers/376a9ccf-7d10-45a7-a956-77eb129d8ff0 -d "custom_id=linuxops123456789" | python -m json.tool返回值:

{ "created_at": 1538127246, "custom_id": "linuxops123456789", "id": "376a9ccf-7d10-45a7-a956-77eb129d8ff0", "username": null}這個接口和更新添加服務的接口類似,當{username or id}屬性具有UUID的結構時,插入/更新的Consumer將由其標識id。否則它將由它識別username。

6、刪除用戶

接口信息:

接口名稱刪除用戶請求端點/consumers/{username or id}請求方法DELETE返回狀態HTTP 204 No Content

請求參數:

請求示例:

curl -i -X DELETE --url http://192.168.0.184:8001/consumers/376a9ccf-7d10-45a7-a956-77eb129d8ff0 返回值:

此操作沒有返回值

六、插件

Kong提供了一個插件的功能,你可以通過配置指定某個服務或者路由或者用戶啟用某個插,插件始終只運行一次,所以對於不同的實體配置相同插件時就有優先級的概念。

多次配置插件的優先級如下:

在以下組合上配置的插件:路由,服務和使用者。 (消費者意味著必須對請求進行身份驗證)。在Route和Consumer的組合上配置的插件。 (消費者意味著必須對請求進行身份驗證)。在服務和使用者的組合上配置的插件。 (消費者意味著必須對請求進行身份驗證)。在路由和服務的組合上配置的插件。在Consumer上配置的插件。 (消費者意味著必須對請求進行身份驗證)。在路由上配置的插件。在服務上配置的插件。配置為全局運行的插件。從以上的優先級可以看出全局配置的插件優先級最小,而越具體的組合優先級越高。

1、添加插件

可以通過以下幾種不同的方式添加插件:

對於每個Service/Route和consumer。不要設置consumer_id和設置service_id或route_id。適用於每個Service/Route和特定consumer。只有設定consumer_id。適用於每個consumer和特定Service。僅設置service_id(警告:某些插件只允許設置route_id)對於每個consumer和特定的Route。僅設置route_id(警告:某些插件只允許設置service_id)對於特定的Service/Route和consumer。設置兩個service_id/ route_id和consumer_id。並非所有插件都允許指定consumer_id。檢查插件文檔。

接口信息:

接口名稱添加插件請求端點/plugins/請求方法POST返回狀態HTTP 201 Created

請求參數:

參數名類型默認值是否必須說明namestring是要添加的插件的名稱。目前,插件必須分別安裝在每個Kong實例中。consumer_idstringnull否使用者的唯一標識符,用於覆蓋傳入請求中此特定使用者的現有設置。service_idstringnull否服務的唯一標識符,用於覆蓋傳入請求中此特定服務的現有設置。route_idstringnull否路由的唯一標識符,它覆蓋傳入請求中此特定路由的現有設置。config.{property}stringnull否插件的配置屬性,可以在Kong Hub的插件文檔頁面找到。enabledbooltrue否是否應用插件。默認值:true。

請求示例:

curl -s -X POST --url http://192.168.0.184:8001/plugins/ \-d 'name=basic-auth' \-d 'route_id=d1a10507-ea15-4c61-9d8c-7f10ebc79ecb' \| python -m json.tool返回值:

{ "config": { "anonymous": "", "hide_credentials": false }, "created_at": 1540102452000, "enabled": true, "id": "900aeaa3-0a47-49a1-9fea-649e6c90ab7f", "name": "basic-auth", "route_id": "d1a10507-ea15-4c61-9d8c-7f10ebc79ecb"}在上面的請求示例中,我們在route上添加了basic-auth插件,這個插件用於認證,通過http的頭部帶入用戶名和密碼信息進行認證。

當然,啟用插件後,我們要對user設置好basic-auth的憑證,否則訪問不了,並且返回如下信息:

{"message": "Unauthorized"}2、查詢插件

接口信息:

接口名稱查詢插件請求端點/plugins/{id}請求方法GET返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明idstring是要檢索的插件的唯一標識符

請求示例:

curl -s --url http://192.168.0.184:8001/plugins/900aeaa3-0a47-49a1-9fea-649e6c90ab7f | python -m json.tool返回值:

{ "config": { "anonymous": "", "hide_credentials": false }, "created_at": 1540102452000, "enabled": true, "id": "900aeaa3-0a47-49a1-9fea-649e6c90ab7f", "name": "basic-auth", "route_id": "d1a10507-ea15-4c61-9d8c-7f10ebc79ecb"}3、查詢所有插件

接口信息:

接口名稱查詢所有插件請求端點/plugins/請求方法GET返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明idstring否通過id查詢namestring否通過name查service_idstring否通過service_id查route_idstring否通過iroute_id查consumer_idstring否通過consumer_id查offsetstring否分頁偏移,用於定義列表中的唯一sizeint100否每頁返回的對象的數量

請求示例:

curl -s --url http://192.168.0.184:8001/plugins/?size=1 | python -m json.tool返回值:

{ "data": [ { "config": { "anonymous": "", "hide_credentials": false }, "created_at": 1540102452000, "enabled": true, "id": "900aeaa3-0a47-49a1-9fea-649e6c90ab7f", "name": "basic-auth", "route_id": "d1a10507-ea15-4c61-9d8c-7f10ebc79ecb" } ], "total": 1}在上面的請求示例中,我們帶了一個size的參數來限定每一頁的數量,在返回的結果中有兩個欄位,next表示下一頁的端點,offset是本頁的偏移。

當然,如果你在讀取下一頁的時候還需要限定返回的數據,還是依然要使用size的參數

4、更新插件

接口信息:

接口名稱更新插件請求端點/plugins/{plugin id}請求方法PATCH返回狀態HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明plugin idstring是要更新的插件配置的唯一標識符namestringnull否要添加的插件的名稱要添加的插件的名稱consumer_idstringnull否使用者的唯一標識符,用於覆蓋傳入請求中此特定使用者的現有設置。service_idstringnull否服務的唯一標識符,用於覆蓋傳入請求中此特定服務的現有設置。route_idstringnull否路由的唯一標識符,它覆蓋傳入請求中此特定路由的現有設置。config.{property}stringnull否插件的配置屬性,可以在Kong Hub的插件文檔頁面找到。enabledbooltrue否是否應用插件。

請求示例:

curl -s -X PATCH --url http://192.168.0.184:8001/plugins/900aeaa3-0a47-49a1-9fea-649e6c90ab7f -d "service_id=da4dce88-4df3-4723-b544-b11b27184e97" | python -m json.tool返回值:

{ "config": { "anonymous": "", "hide_credentials": false }, "created_at": 1540102452000, "enabled": true, "id": "900aeaa3-0a47-49a1-9fea-649e6c90ab7f", "name": "basic-auth", "route_id": "d1a10507-ea15-4c61-9d8c-7f10ebc79ecb", "service_id": "da4dce88-4df3-4723-b544-b11b27184e97"}在上面的請求示例中,我更新了這個插件,原本只針對route啟用的,現在又增加了對service生效,由此看出,一個插件是可以對多個實體生效的(前提是插件本身要支持此實體生效),因為插件只會在請求的生命周期中運行一次,所以對多個實體啟用同一個插件會受到優先級的限制。

5、更新或添加插件

接口信息:

接口名稱更新或添加插件請求端點/plugins/請求方法PUT返回狀態HTTP 201 Created or HTTP 200 OK

請求參數:

參數名類型默認值是否必須說明namestringnull否要添加的插件的名稱要添加的插件的名稱consumer_idstringnull否使用者的唯一標識符,用於覆蓋傳入請求中此特定使用者的現有設置。service_idstringnull否服務的唯一標識符,用於覆蓋傳入請求中此特定服務的現有設置。route_idstringnull否路由的唯一標識符,它覆蓋傳入請求中此特定路由的現有設置。config.{property}stringnull否插件的配置屬性,可以在Kong Hub的插件文檔頁面找到。enabledbooltrue否是否應用插件。

請求示例:

curl -s -X PUT --url http://192.168.0.184:8001/plugins/900aeaa3-0a47-49a1-9fea-649e6c90ab7f -d "service_id=da4dce88-4df3-4723-b544-b11b27184e97" | python -m json.tool返回值:

{ "config": { "anonymous": "", "hide_credentials": false }, "created_at": 1540102452000, "enabled": true, "id": "900aeaa3-0a47-49a1-9fea-649e6c90ab7f", "name": "basic-auth", "route_id": "d1a10507-ea15-4c61-9d8c-7f10ebc79ecb", "service_id": "da4dce88-4df3-4723-b544-b11b27184e97"}這個接口是更新或者創建一個插件。

如果傳入的參數name已經存在,那麼以傳入的參數修改此插件,如果name不存在,則以傳入的參數創建此插件。

6、刪除插件

接口信息:

接口名稱刪除插件請求端點/plugins/{plugin id}請求方法DELETE返回狀態HTTP 204 No Content

請求參數:

參數名類型默認值是否必須說明plugin idstring是要刪除的插件配置的唯一標識符

請求示例:

curl -s -X DELETE --url http://192.168.0.184:8001/plugins/900aeaa3-0a47-49a1-9fea-649e6c90ab7f | python -m json.tool返回值:

此操作沒有返回值

7、查詢已啟用的插件

接口信息:

接口名稱查詢已啟用的插件請求端點/plugins/enabled請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s -X GET --url http://192.168.0.184:8001/plugins/enabled | python -m json.tool返回值:

{ "enabled_plugins": [ "response-transformer", "oauth2", "acl", "correlation-id", "pre-function", "jwt", "cors", "ip-restriction", "basic-auth", "key-auth", "rate-limiting", "request-transformer", "http-log", "file-log", "hmac-auth", "ldap-auth", "datadog", "tcp-log", "zipkin", "post-function", "request-size-limiting", "bot-detection", "syslog", "loggly", "azure-functions", "udp-log", "response-ratelimiting", "aws-lambda", "statsd", "prometheus", "request-termination" ]}返回Kong示例啟用了那些插件,只有已經啟用的插件才能被應用在實體上,需要說明的是,在kong集群中,插件啟用的情況要一致。

8、檢索插件架構

接口信息:

接口名稱檢索插件架構請求端點/plugins/schema/{plugin name}請求方法GET返回狀態HTTP 200 OK

請求參數:

請求示例:

curl -s -X GET --url http://192.168.0.184:8001/plugins/schema/basic-auth | python -m json.tool返回值:

{ "fields": { "anonymous": { "default": "", "func": "function", "type": "string" }, "hide_credentials": { "default": false, "type": "boolean" } }, "no_consumer": true}可以通過此接口了解插件接受哪些欄位。

相關焦點

  • Go 開源網關 API-Gateway 2.1.0 發布
    2.1.0版本發布修復新特性支持針對API的結果Cache支持PathValue作為路由和校驗的參數取值api server支持restful
  • kong——API gateway配置RS實踐 連接資料庫postgres主從流複製
    下面記錄的是針對kong開發的需求驗證,這裡主要是用kong做一些簡單服務的添加驗證下面操作對應的接口可用性,比如添加upstream及其後端的RS,並將其掛到某個location後面,用於做proxy。
  • asp.net web api中的版本管理
    應用是演進的,通常我們用版本號來管理。api也是演進的,這篇博文就說說asp.net web api演進時的版本管理。
  • 詳解API網關核心功能和API管理擴展
    在請求api的時候,將apikey=test keyauth,作為一個參數附加到請求url後,或者放置到headers中。Hmac-auth插件是設置綁定的service和rout,以啟動hmac驗證。然後在Consumers頁面中Hmac credentials of Consumer設置中添加一個username和secret。
  • 可編程社會的基石-API網關
    同時,API網關對接入的API提供基礎管理服務,包含API生命周期管理,統一身份認證服務,訪問策略控制(緩存,黑白名單,熔斷,限流),API監控告警,負載均衡,計量計費,灰度發布等擴展功能。隨著全球信息化程度的提高,許多IT廠商都推出各種各樣的API GateWay產品,除了公有雲阿里api網關,華為api網關還有google apigee,kong,tyk等,琳琅滿目的API GateWay,不同網關產品對應功能,使用細節差異,混淆和模糊著API GateWay的邊界,讓大家對API GateWay的映像並非非常清晰。
  • 清網行動-通過apiban實現SIP黑白名單的動態處理
    目前,很多基於SIP的公網伺服器如果沒有SBC來進行管理的話,經常會遇到一些攻擊者的侵入。一般的解決辦法就是通過IPtables或者fail2ban來進行過濾處理。但是,以上這兩個服務相對不是那麼太靈活,實現不了動態處理,有時黑白名單之間不能實現消息互通,有時不能提前啟動黑名單過來。
  • 寄快遞在線下單寄件|上門取件|快遞單號查詢接口-快遞鳥API
    >1、移動端APP、公眾號、電商等提供的散客寄件下單模塊,通過上門取件直接預約快遞員上門攬件,支持在線支付運費;2、電商平臺、自營電商售後退貨退款時,買家通過平臺直接預約快遞員上門攬件,支持在線支付運費;一、接口描述/說明(1)上門取件接口是快遞鳥提供給獨立電商、倉儲管理系統
  • smart-doc 2.0.1 發布,Java 零註解 API 文檔生成工具
    smart-doc是一款同時支持java restful api和apache dubbo rpc接口文檔生成的工具
  • Resty 1.2.0-SNAPSHOT 更新,可通過header來控制api的版本,數據源...
    個多月滿一年了,在沒有推廣的情況下如果能積累到500 star,真是棒棒的,如果覺得不錯可以給顆心(https://github.com/Dreampie/Resty),希望大家多多鼓勵,也希望有心的同學參與維護,開源說明它屬於大家,無論你使用或者作為一個框架的基礎學習還是從中得到靈感做出好用的東西 都希望你能和大家一起分享 開源希望大家互相幫助本次更新說大不大說小不小,主要解決一下對api
  • eoLinker 開源 API 網關 GoKu-API-Gateway 發布
    一、簡介GoKu支持OpenAPI與微服務管理,支持私有雲部署,實現API轉發、請求參數轉換、數據校驗等功能,提供圖形化界面管理,能夠快速管理多個API網關,提高API業務安全性。二、相關特性免費且開源:GoKu API Gateway秉承開源精神,是國內第一個企業級開源的API接口網關,為廣大的開發、運維以及管理人員提供專業的產品;多種鑑權方式:支持Basic 認證、API Key授權、IP認證、無認證等方式;支持Open API:不同帳戶擁有獨立的訪問密鑰;權限管理:可針對不同策略組設置流量控制策略
  • 海外黨使用 G-Core 免費 CDN 服務反代 B 站 API 觀看港澳臺限定番劇
    目前根據 Github 中的信息,在指定區域反代 B 站 API 域名 api.bilibili.com 即可解鎖該區域的版權限定番劇。這意味著只需要擁有一個香港,一個臺灣(有番劇為臺灣限定),一個中國大陸地區的伺服器即可解鎖目前已有的番劇。CDN 服務的核心和反代一樣,自然可以被用來反代 B 站 API。
  • 因為不想付費,「摳門」程式設計師業餘開發了款網站截圖API 順便賺了點錢
    Screenshot API(網址:https://screenshotapi.net/)是一個網頁截圖API接口,可以將指定地址保存為圖片,對比其它同類產品,其優勢在於保存的圖片像素高,訪問速度快,可以擴展並託管在谷歌雲上。
  • eoLinker 開源 API 網關 GoKu-API-Gateway V2.0.0 發布
    一、簡介GoKu支持OpenAPI與微服務管理,支持私有雲部署,實現API轉發、請求參數轉換、數據校驗等功能,提供圖形化界面管理,能夠快速管理多個API網關,提高API業務安全性。二、相關特性免費且開源:GoKu API Gateway秉承開源精神,是國內第一個企業級開源的API接口網關,為廣大的開發、運維以及管理人員提供專業的產品;多種鑑權方式:支持Basic 認證、API Key授權、IP認證、無認證等方式;支持Open API:
  • 開放平臺:搭建API安全預警平臺
    二、風險防範方式api安全問題主要有數據的傳輸安全問題、數據安全問題、伺服器安全問題。1. 傳輸安全接口傳輸風險可能會導致接口被隨意調取、傳輸劫持等。
  • 為什麼AWS API Gateway會成為一項重要業務?
    在做了一點作業之後,我總結了一下API Gateway對於企業來說具有吸引力的地方大概在於以下幾點:Ÿ連接服務正在激增,部署授權、負載均衡、通信管理、分析和改變的難度也變得越來越大。同時,這些連接也需要軟體開發工具包。這些零碎的工作等同於以往大量的工作,而這些大量的工作還沒有開始產生任何真正的價值。你還記得保持數據中心亮燈嗎?管理API很可能會成為等效的軟體。
  • 分享一款新浪短連結在線生成器-新浪短網址api接口平臺
    首頁 > 傳媒 > 關鍵詞 > 短連結最新資訊 > 正文 分享一款新浪短連結在線生成器-新浪短網址api接口平臺