插件機制說明
插件有著重複配置層級、執行優先權之分。
一個插件只會在每一個請求內運行一次,且插件運行的配置是依據當時所配置的實體(如:服務、路由、用戶)。
插件可以被配置在許多實體、實體組合甚至全域 (Global) 的範圍上。這是一種非常彈性的架構,例如:當你想要讓大部分的請求以某種方式配置一個插件,但是讓經過身份驗證的請求行為略有不同時。
插件運行順序說明#
某些插件可能會依賴於其他插件先運行後,本身插件才能運行某些特定邏輯操作。
例如,依賴於用戶身份的插件就必須在身份驗證插件運行之後才能接著運行。
所以考慮到這一點,就有定義了插件之間運行的優先順序。
插件執行順序表#
| 插件 | 順序數字 (越大代表越優先) |
|---|---|
| pre-function | +inf |
| zipkin | 100000 |
| tcp-body-log | 99999 |
| actived-scheduler | 99000 |
| api-chain | 89000 |
| database-log | 80000 |
| bot-detection | 2500 |
| cors | 2000 |
| session | 1900 |
| alerting | 1500 |
| acme | 1007 |
| jwt | 1005 |
| oauth2 | 1004 |
| key-auth | 1003 |
| ldap-auth | 1002 |
| basic-auth | 1001 |
| hmac-auth | 1000 |
| grpc-gateway | 998 |
| botw-check-headers | 995 |
| botw-check-token | 994 |
| botw-get-ticket | 993 |
| botw-body-encrypt | 991 |
| ip-restriction | 990 |
| request-size-limiting | 951 |
| acl | 950 |
| iam | 945 |
| rate-limiting | 901 |
| response-ratelimiting | 900 |
| request-transformer | 801 |
| response-transformer | 800 |
| aws-lambda | 750 |
| azure-functions | 749 |
| proxy-cache | 100 |
| gemini-dashboard | 60 |
| api-history | 50 |
| extend-adminapi | 20 |
| prometheus | 13 |
| http-log | 12 |
| statsd | 11 |
| datadog | 10 |
| file-log | 9 |
| udp-log | 8 |
| tcp-log | 7 |
| loggly | 6 |
| syslog | 4 |
| grpc-web | 3 |
| request-termination | 2 |
| correlation-id | 1 |
| api_key | 0 |
| post-function | -1000 |
同名插件配置優先權說明#
一個插件被多次配置時的完整優先順序(由高到低)是:
在以下組合配置的插件: 路由、服務、用戶(代表請求必須經過身份驗證)。
在以下組合配置的插件:路由、用戶(代表請求必須經過身份驗證)。
在以下組合配置的插件:服務、用戶(代表請求必須經過身份驗證)。
在以下組合配置的插件:服務、路由。
在用戶上配置的插件(代表請求必須經過身份驗證)。
在路由上配置的插件。
在服務上配置的插件。
配置範圍為全域 (Global) 的插件。
範例 1
假設 Rate Limiting 插件已被配置兩次:
- 綁定在服務上:(Config A)
- 綁定在用戶上:(Config B)
那驗證此用戶的請求就會忽略運行插件 Config A,而運行 Config B。
但是,沒有通過用戶身份驗證的請求會改回運行插件 Config A。
注意:如果 Config B 被設定為禁用 (enabled 為 false), 原本匹配於 Config B 的請求將會改為運行在 Config A。
範例 2
假設 Basic Authentication 插件已被配置兩次,關係如下:
- 服務 A
- 插件 Basic Authentication
(綁定在服務 A層級範圍,設置:hide_credentials=true) - 路由 v1 (路徑:/api/v1)
- 插件 Basic Authentication
(綁定在路由 v1層級範圍,設置:hide_credentials=false)
- 插件 Basic Authentication
- 路由 v2 (路徑:/api/v2)
- 無插件
- 插件 Basic Authentication
當請求呼叫的路徑是 /api/v1,代表會經過「路由 v1 層級」的 Basic Authentication 插件,此時運行 Basic Authentication 插件時的配置 hide_credentials 是 false。
雖然 路由 v1 所屬 服務 A,但這個情況下,會以 路由 v1 本身綁定的插件來運行,就不會運行「服務 A 層級」的 Basic Authentication 插件。
當請求呼叫的路徑是 /api/v2,代表會經過「服務 A 層級」的 Basic Authentication 插件,此時運行 Basic Authentication 插件時的配置 hide_credentials 是 true。