距離 Apache APISIX 上一次釋出 LTS 版本已經過去了大半年的時間,今天,Apache APISIX 社群帶來了一個全新的 LTS 版本——2.13.0。該 LTS 版本不僅效能更加穩定,而且支援了更多的可觀測性、服務發現外掛和更完善的多語言開發體系。
如果你在追求整體穩定性的同時,也想嘗試一下新功能,不妨考慮將現有的 Apache APISIX 升級到 2.13.0。後續社群也會在 2.13.0 版本的基礎上釋出一系列 patch 版本。
功能更新
新變化:不再預設暴露 API
在 2.13.0 之前的版本中,我們允許外掛註冊可供客戶端呼叫的 API。例如,jwt-auth
外掛會註冊一個 JWT 簽名的介面,客戶端可以訪問該介面,以生成用於校驗的簽名。但這個設計有一個潛在的缺陷——由於暴露出來的是介面而不是路由,因此無法像對待路由一樣為其加強安全防護。雖然現有的機制允許使用者通過編寫對應的 plugin interceptor 來攔截介面訪問,但這種方式仍然存在安全隱患。
所以從 2.13.0 版本開始,我們決定做出重大變更,不再預設暴露 API。如果使用者需要暴露介面,則需要通過 public-api
外掛將介面繫結到對應的路由上。這種方式會帶來兩個好處:
- 註冊的 API 會有更高的能見度,目前註冊的 API 只有通過顯示配置才會生效,訪問方式也是由使用者自定義。
- 允許採用更多的安全防護選項,註冊的 API 和路由擁有同樣的許可權控制。
當然,2.13.0 版本還有其他的新變化,比如修復了歷史版本的不合理行為。如需瞭解具體優化資訊,請查閱 2.13.0 Changelog。
新功能:可觀測性層面對接更多的監控體系
作為 API 閘道器,Apache APISIX 一直致力於連線更多的服務,打通更多的可觀測性上下游。我們在每個版本都會為此添磚加瓦,2.13.0 版本也不例外。
這次我們新增了一個 tracing 外掛:**opentelemetry**
,允許傳送 OpenTelemetry tracing 資料到配置的 collector。下面簡單通過一個示例來看一下。
在靜態配置裡面設定了 collector:
plugin_attr:
opentelemetry:
resource:
service.name: APISIX
tenant.id: business_id
collector:
address: "127.0.0.1:4317"
batch_span_processor:
drop_on_queue_full: false
max_queue_size: 6
batch_timeout: 2
inactive_timeout: 1
max_export_batch_size: 2
之後就可以在特定的路由上開啟 tracing:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uris": [
"/uid/*"
],
"plugins": {
"opentelemetry": {
"sampler": {
"name": "always_on"
}
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:8089": 1
}
}
}'
命中該路由的請求將會上報 OpenTelemetry 的資料到對應的 collector。
此外,我們還新增了兩個日誌外掛,支援把日誌上報到 ClickHouse 和 Loggly 中。
ClickHouse 是地表最快的 OLAP 資料庫之一。Apache APISIX 支援傳送 access log 和 error log 到 ClickHouse,示例如下:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"clickhouse-logger": {
"user": "default",
"password": "a",
"database": "default",
"logtable": "test",
"endpoint_addr": "http://127.0.0.1:8123"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
},
"uri": "/hello"
}'
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/error-log-logger -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"clickhouse": {
"user": "default",
"password": "a",
"database": "error_log",
"logtable": "t",
"endpoint_addr": "http://127.0.0.1:8123"
}
}'
Loggly 是 SolarWinds 旗下的日誌處理 SaaS 平臺,我們支援通過 syslog 或 HTTP/HTTPS 的方式傳送 access log。示例如下:
配置上報方式
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/loggly -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"protocol": "http"
}'
配置需要上報的路由
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins":{
"loggly":{
"customer_token":"xxx",
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"127.0.0.1:80":1
}
},
"uri":"/index.html"
}'
更完善的多語言開發體系
Apache APISIX 自 2.11 版本起開始支援 Wasm(Proxy Wasm SDK),但 LTS 版本一直沒有提供相應支援。在此次釋出的 Apache APISIX 2.13.0 版本中,我們新增並完善了該功能。
在經過半年超過 10000 行程式碼(包括測試和文件)的開發後,APISIX 現已全面支援在處理請求頭、請求體、響應頭、響應體四個階段執行 Wasm 程式碼。2.13.0 版本是第一個支援 Wasm 的 LTS 版本,可以說是一個新的里程碑。
除了 Wasm 之外,我們也正在開發傳統的、基於 RPC 的多語言外掛體系。不久之前,我們釋出了 Python Runner 0.2.0 版本。幾天後,我們也會發布 Go Runner 0.3.0 版本。
Bug 修復
- SkyWalking 和 OpenTelemetry 沒有追蹤認證失敗。
log-rotate
切割日誌不支援按整點完成。deepcopy
沒有複製metatable
。request-validate
對 JSON 裡面重複鍵的處理 。prometheus
重複計算指標。- 當
conf.headers
缺失時,proxy-rewrite
中的conf.method
不生效 。 traffic-split
首條規則失敗時無法匹配。- etcd 超時觸發
resync_delay
。 proto
定義衝突。limit-count
配置不變,重置計數器。- Admin API 的
plugin-metadata
和global-rule
計數有誤。 - 合併 route 和 service 時 labels 丟失。
更多細節
除了上述功能和元件外,Apache APISIX 2.13.0 版本還更新瞭如下功能:
- grpc-transcode 支援通過
.pb
檔案處理帶 import 的 proto 定義。 - 支援從 K8s 配置中獲取上游節點。
- 新增
csrf
外掛,提供跨站請求偽造防護。 - 新增
mocking
外掛,方便生成測試資料。