博客 / 詳情

返回

Apache APISIX 2.15 版本發佈,為插件增加更多靈活性

不出意外的話,2.15 將會是 Apache APISIX 3.0 版本發佈之前最後一個 minor 版本。從兩年前發佈第一個 2.0 版本開始,APISIX 已經發布了 15 個 minor 版本和許多個 patch 版本。作為 2.x 系列最後的一個 minor 版本,2.15 版本可以説是個承上啓下的版本。
「承上」是因為該版本繼續引入了更多的功能,使得插件配置更加靈活;「啓下」則是因為該版本將會是 2.x 版本的最後一個 LTS 版本,後續 APISIX 就要向 3.0 版本進發了。更多細節一起來看下文吧!

自定義插件優先級

新版本支持用户自定義插件的優先級,而非直接應用插件默認的優先級屬性。
有了這個功能,我們可以在某個特定的路由上調整某幾個插件的執行順序,從而打破之前插件優先級屬性的束縛。
例如,在默認情況下,serverless-post-function 插件是在 serverless-pre-function 插件之後執行的。但是通過此功能,可以讓 serverless-post-function 插件優先執行。配置示例如下:

 {
    "serverless-post-function": {
        "_meta": {
            "priority": 10000
        },
        "phase": "rewrite",
        "functions" : ["return function(conf, ctx)
                    ngx.say(\"serverless-post-function\");
                    end"]
    },
    "serverless-pre-function": {
        "_meta": {
            "priority": -2000
        },
        "phase": "rewrite",
        "functions": ["return function(conf, ctx)
                    ngx.say(\"serverless-pre-function\");
                    end"]
    }
}

如果一個插件配置中沒有註明優先級,則會根據插件代碼中的優先級屬性值進行排序。
如果你在 Service 或者 Plugin Config 的插件配置中指定了插件的優先級,那麼在合併到路由後依然生效。

自定義插件是否執行

除了能夠調整執行順序外,還可以動態決定插件是否需要執行。2.15 版本中引入了插件配置級別的過濾器,由過濾器的執行結果控制插件執行與否。
下方配置中,只有變量 $status 大於或等於 400 時,才會執行 http-logger 插件。這麼一來,只有 4xx 和 5xx 的請求才會被報告到遠端的 HTTP 日誌服務器上。

{
    "http-logger": {
        "_meta": {
            "filter": {
                {"status", "!", "<", "400"}
            }
        },
        ...
    }
}

同時,藉助 APISIX 的另一個功能 自定義變量,則可以玩出更多花樣。比如客户端地址為內網地址,則跳過某個 Logger 之類的場景。

自定義錯誤響應

該功能也是在具體插件層面配置的新功能,屬於插件配置級別上的錯誤信息。
如果需求方對特定路由上的錯誤響應有所要求,那麼這一功能就能派上用場了。無論是什麼插件,通過該配置都能設置一個固定的響應結果,避免因為插件內置的錯誤響應信息而帶來困擾。

如下述配置所示,不管 jwt-auth 插件返回了什麼錯誤信息,都會被改寫成 "Missing credential in request" 返回給客户端。

{
    "jwt-auth": {
        "_meta": {
            "error_response": {
                "message": "Missing credential in request"
            }
        }
    }
}

允許採集 Stream Route 上的指標

本版本中還進行了一個較大的改動,就是允許在 Stream Route 上採集 metrics 的指標,並通過 Prometheus 的接口暴露出來。
該功能默認為關閉狀態,如果需要啓用,請在 APISIX-Base 版本上構建 APISIX,並在 config.yaml 中啓用 prometheus 插件,示例如下:

stream_plugins:
  - ...
  - prometheus

在啓用該插件後,即使只用 APISIX 來代理四層上的 TCP 流量,也會專門監聽 9091 的端口,響應 Prometheus 發來的 HTTP 請求。

跟 HTTP 代理子系統部分的 prometheus 插件一樣,下一步則是在需要採集指標的 Stream Route 上配置該插件:

curl http://127.0.0.1:9080/apisix/admin/stream_routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "prometheus":{}
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:80": 1
        }
    }
}'

在對該 Stream Route 發起連接之後,訪問 http://127.0.0.1:9091/apisix/... 就會看到如下 TCP 代理統計數據:

...
# HELP apisix_node_info Info of APISIX node
# TYPE apisix_node_info gauge
apisix_node_info{hostname="desktop-2022q8f-wsl"} 1
# HELP apisix_stream_connection_total Total number of connections handled per stream route in APISIX
# TYPE apisix_stream_connection_total counter
apisix_stream_connection_total{route="1"} 1

目前該功能只實現了統計連接數,後續還會按需加入更多的統計指標。

除了普通的 Stream Route 外,該版本中還給 xRPC 下的 Redis 代理功能提供了統計指標。如按照路由和 Command 細分的命令計數指標 apisix_redis_commands_total 和延遲時間指標 apisix_redis_commands_latency_seconds_bucket

更多功能

在新增功能層面,除了上述提到的幾個功能外,此版本也包含很多細節改動:

  • 支持 Upstream 對象從 SSL 對象中引用證書
  • prometheus 指標中提供 ngx.shared.dict 統計信息
  • openid-connect 插件支持 PKCE 拓展
    ……

更多具體發版細節,請參考 2.15 Changelog:https://github.com/apache/api...

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.