Apache APISIX 是 Apache 軟件基金會(huì)下的云原生 API 網(wǎng)關(guān),它具有動(dòng)態(tài)、實(shí)時(shí)、高性能等特點(diǎn),提供了負(fù)載均衡、動(dòng)態(tài)上游、灰度發(fā)布(金絲雀發(fā)布)、服務(wù)熔斷、限速、防御惡意攻擊、身份認(rèn)證、可觀測(cè)性等豐富的流量管理功能。我們可以使用 Apache APISIX 來(lái)處理傳統(tǒng)的南北向流量,也可以處理服務(wù)間的東西向流量。同時(shí),它也支持作為 Kubernetes Ingress Controller 來(lái)使用。
APISIX 基于 Nginx 和 etcd,與傳統(tǒng) API 網(wǎng)關(guān)相比,APISIX 具有動(dòng)態(tài)路由和熱加載插件功能,避免了配置之后的 reload 操作,同時(shí) APISIX 支持 HTTP(S)、HTTP2、Dubbo、QUIC、MQTT、TCP/UDP 等更多的協(xié)議。而且還內(nèi)置了 Dashboard,提供強(qiáng)大而靈活的界面。同樣也提供了豐富的插件支持功能,而且還可以讓用戶自定義插件。
主要具有以下幾個(gè)特點(diǎn):
- 多平臺(tái)支持 :APISIX 提供了多平臺(tái)解決方案,它不但支持裸機(jī)運(yùn)行,也支持在 Kubernetes 中使用,還支持與 AWS Lambda、Azure Function、Lua 函數(shù)和 Apache OpenWhisk 等云服務(wù)集成。
- 全動(dòng)態(tài)能力 :APISIX 支持熱加載,這意味著你不需要重啟服務(wù)就可以更新 APISIX 的配置。請(qǐng)?jiān)L問(wèn)為什么 Apache APISIX 選擇 Nginx + Lua 這個(gè)技術(shù)棧?以了解實(shí)現(xiàn)原理。
- 精細(xì)化路由 :APISIX 支持使用 NGINX 內(nèi)置變量做為路由的匹配條件,你可以自定義匹配函數(shù)來(lái)過(guò)濾請(qǐng)求,匹配路由。
- 運(yùn)維友好 :APISIX 支持與以下工具和平臺(tái)集成:HashiCorp Vault、Zipkin、Apache SkyWalking、Consul、Nacos、Eureka。通過(guò) APISIX Dashboard,運(yùn)維人員可以通過(guò)友好且直觀的 UI 配置 APISIX。
- 多語(yǔ)言插件支持 :APISIX 支持多種開(kāi)發(fā)語(yǔ)言進(jìn)行插件開(kāi)發(fā),開(kāi)發(fā)人員可以選擇擅長(zhǎng)語(yǔ)言的 SDK 開(kāi)發(fā)自定義插件。
安裝 APISIX
為了簡(jiǎn)單,我們這里可以直接在本地使用 docker 方式來(lái)啟動(dòng) APISIX,首先 Clone 官方提供的 apisix-docker
倉(cāng)庫(kù):
? git clone https://github.com/apache/apisix-docker.git
? cd apisix-docker
在項(xiàng)目根目錄下面的 example
目錄中有啟動(dòng) APISIX 的 docker-compose 配置文件,如下所示:
version: "3"
services:
apisix-dashboard:
image: apache/apisix-dashboard:3.0.0-alpine
restart: always
volumes:
- ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
ports:
- "9000:9000"
networks:
apisix:
apisix:
image: apache/apisix:3.2.0-debian
restart: always
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
depends_on:
- etcd
ports:
- "9180:9180/tcp"
- "9080:9080/tcp"
- "9091:9091/tcp"
- "9443:9443/tcp"
- "9092:9092/tcp"
networks:
apisix:
etcd:
image: rancher/coreos-etcd:v3.4.15-arm64
user: root
restart: always
volumes:
- ./etcd_data:/etcd-data
environment:
ETCD_UNSUPPORTED_ARCH: "arm64"
ETCD_ENABLE_V2: "true"
ALLOW_NONE_AUTHENTICATION: "yes"
ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
ETCD_DATA_DIR: "/etcd-data"
ports:
- "2379:2379/tcp"
networks:
apisix:
web1:
image: nginx:1.19.10-alpine
restart: always
volumes:
- ./upstream/web1.conf:/etc/nginx/nginx.conf
ports:
- "9081:80/tcp"
environment:
- NGINX_PORT=80
networks:
apisix:
web2:
image: nginx:1.19.10-alpine
restart: always
volumes:
- ./upstream/web2.conf:/etc/nginx/nginx.conf
ports:
- "9082:80/tcp"
environment:
- NGINX_PORT=80
networks:
apisix:
networks:
apisix:
driver: bridge
該 compose 里面主要包含了 APISIX 的三個(gè)容器:apisix、etcd 以及 apisix-dashboard。現(xiàn)在我們就可以使用 docker-compose 來(lái)進(jìn)行一鍵啟動(dòng):
? docker-compose -f docker-compose.yml up -d
另外兩個(gè) nginx 容器是用于測(cè)試的:
docker-compose
請(qǐng)確保其他系統(tǒng)進(jìn)程沒(méi)有占用 9000、9080、9091、9092、9180、9443 和 2379 端口。如果啟動(dòng)有錯(cuò)誤,可以嘗試為 examples 目錄設(shè)置成 777 權(quán)限,保證 etcd 數(shù)據(jù)有權(quán)限寫(xiě)入。
當(dāng) APISIX 啟動(dòng)完成后我們就可以通過(guò) curl 來(lái)訪問(wèn)正在運(yùn)行的 APISIX 實(shí)例。比如,可以發(fā)送一個(gè)簡(jiǎn)單的 HTTP 請(qǐng)求來(lái)驗(yàn)證 APISIX 運(yùn)行狀態(tài)是否正常。
? curl "http://127.0.0.1:9080" --head
HTTP/1.1 404 Not Found
Date: Tue, 21 Mar 2023 07:38:45 GMT
Content-Type: text/plain; charset=utf-8
Connection: keep-alive
Server: APISIX/3.2.0
現(xiàn)在,你已經(jīng)成功安裝并運(yùn)行了 APISIX !
功能測(cè)試
接下來(lái)我們來(lái)了解下 APISIX 的一些功能。在了解之前我們需要對(duì) APISIX 的幾個(gè)主要概念和組件簡(jiǎn)單了解下:
上游
Upstream 也稱(chēng)為上游,上游是對(duì)虛擬主機(jī)的抽象,即應(yīng)用層服務(wù)或節(jié)點(diǎn)的抽象。
上游的作用是按照配置規(guī)則對(duì)服務(wù)節(jié)點(diǎn)進(jìn)行負(fù)載均衡,它的地址信息可以直接配置到路由或服務(wù)上。當(dāng)多個(gè)路由或服務(wù)引用同一個(gè)上游時(shí),可以通過(guò)創(chuàng)建上游對(duì)象,在路由或服務(wù)中使用上游的 ID 方式引用上游,減輕維護(hù)壓力。
路由
Route 也稱(chēng)為路由,是 APISIX 中最基礎(chǔ)和最核心的資源對(duì)象。
APISIX 可以通過(guò)路由定義規(guī)則來(lái)匹配客戶端請(qǐng)求,根據(jù)匹配結(jié)果加載并執(zhí)行相應(yīng)的插件,最后把請(qǐng)求轉(zhuǎn)發(fā)給到指定的上游服務(wù)。路由中主要包含三部分內(nèi)容:匹配規(guī)則、插件配置和上游信息。
服務(wù)
Service 也稱(chēng)為服務(wù),是某類(lèi) API 的抽象(也可以理解為一組 Route 的抽象)。它通常與上游服務(wù)抽象是一一對(duì)應(yīng)的,Route 與 Service 之間,通常是 N:1
的關(guān)系。
消費(fèi)者
Consumer 是某類(lèi)服務(wù)的消費(fèi)者,需要與用戶認(rèn)證配合才可以使用。當(dāng)不同的消費(fèi)者請(qǐng)求同一個(gè) API 時(shí),APISIX 會(huì)根據(jù)當(dāng)前請(qǐng)求的用戶信息,對(duì)應(yīng)不同的 Plugin 或 Upstream 配置。如果 Route、Service、Consumer 和 Plugin Config 都綁定了相同的插件,只有消費(fèi)者的插件配置會(huì)生效。插件配置的優(yōu)先級(jí)由高到低的順序是:Consumer > Route > Plugin Config > Service。
對(duì)于 API 網(wǎng)關(guān)而言,一般情況可以通過(guò)請(qǐng)求域名、客戶端 IP 地址等字段識(shí)別到某類(lèi)請(qǐng)求方,然后進(jìn)行插件過(guò)濾并轉(zhuǎn)發(fā)請(qǐng)求到指定上游。但有時(shí)候該方式達(dá)不到用戶需求,因此 APISIX 支持了 Consumer 對(duì)象。
插件
Plugin 也稱(chēng)之為插件,它是擴(kuò)展 APISIX 應(yīng)用層能力的關(guān)鍵機(jī)制,也是在使用 APISIX 時(shí)最常用的資源對(duì)象。插件主要是在 HTTP 請(qǐng)求或響應(yīng)生命周期期間執(zhí)行的、針對(duì)請(qǐng)求的個(gè)性化策略。插件可以與路由、服務(wù)或消費(fèi)者綁定。
如果路由、服務(wù)、插件配置或消費(fèi)者都綁定了相同的插件,則只有一份插件配置會(huì)生效,插件配置的優(yōu)先級(jí)由高到低順序是:消費(fèi)者 > 路由 > 插件配置 > 服務(wù)。同時(shí)在插件執(zhí)行過(guò)程中也會(huì)涉及 6 個(gè)階段,分別是
rewrite
、access
、before_proxy
、header_filter
、body_filter
和log
。
Admin API
APISIX 提供了強(qiáng)大的 Admin API 和 Dashboard 供用戶使用,Admin API 是一組用于配置 Apache APISIX 路由、上游、服務(wù)、SSL 證書(shū)等功能的 RESTful API。
我們可以通過(guò) Admin API 來(lái)獲取、創(chuàng)建、更新以及刪除資源。同時(shí)得益于 APISIX 的熱加載能力,資源配置完成后 APISIX 將會(huì)自動(dòng)更新配置,無(wú)需重啟服務(wù),具體的架構(gòu)原理可以查看下面的架構(gòu)圖:
APISIX 架構(gòu)圖
主要分為兩個(gè)部分:
- APISIX 核心 :包括 Lua 插件、多語(yǔ)言插件運(yùn)行時(shí)(Plugin Runner)、Wasm 插件運(yùn)行時(shí)等;
- 功能豐富的各種內(nèi)置插件 :包括可觀測(cè)性、安全、流量控制等。
APISIX 在其核心中,提供了路由匹配、負(fù)載均衡、服務(wù)發(fā)現(xiàn)、API 管理等重要功能,以及配置管理等基礎(chǔ)性模塊。除此之外,APISIX 插件運(yùn)行時(shí)也包含其中,提供原生 Lua 插件的運(yùn)行框架和多語(yǔ)言插件的運(yùn)行框架,以及實(shí)驗(yàn)性的 Wasm 插件運(yùn)行時(shí)等。APISIX 多語(yǔ)言插件運(yùn)行時(shí)提供多種開(kāi)發(fā)語(yǔ)言的支持,比如 Golang、Java、Python、JS 等。
APISIX 目前也內(nèi)置了各類(lèi)插件,覆蓋了 API 網(wǎng)關(guān)的各種領(lǐng)域,如認(rèn)證鑒權(quán)、安全、可觀測(cè)性、流量管理、多協(xié)議接入等。當(dāng)前 APISIX 內(nèi)置的插件使用原生 Lua 實(shí)現(xiàn),關(guān)于各個(gè)插件的介紹與使用方式,后續(xù)我們?cè)俳榻B。
創(chuàng)建路由
下面的示例中我們先使用 Admin API 來(lái)創(chuàng)建一個(gè) Route 并與 Upstream 綁定,當(dāng)一個(gè)請(qǐng)求到達(dá) APISIX 時(shí),APISIX 會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到指定的上游服務(wù)中。
以下示例代碼中,我們將為路由配置匹配規(guī)則,以便 APISIX 可以將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的上游服務(wù):
? curl "http://127.0.0.1:9180/apisix/admin/routes/1" -X PUT -d '
{
"methods": ["GET"],
"host": "youdianzhishi.com",
"uri": "/anything/*",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}' -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
# 正常會(huì)得到如下所示的結(jié)果
{"value":{"create_time":1679392758,"methods":["GET"],"host":"youdianzhishi.com","status":1,"priority":0,"update_time":1679392758,"upstream":{"pass_host":"pass","hash_on":"vars","type":"roundrobin","nodes":{"httpbin.org:80":1},"scheme":"http"},"id":"1","uri":"/anything/*"},"key":"/apisix/routes/1"}
其中的
X-API-KEY
的值在 APISIX 的配置文件中apisix_config.yaml
中有配置,位于deployment.admin.admin_key
下面。
該配置意味著,當(dāng)請(qǐng)求滿足下述的所有規(guī)則時(shí),請(qǐng)求將被轉(zhuǎn)發(fā)到上游服務(wù)(httpbin.org:80
):
- 請(qǐng)求的 HTTP 方法為 GET。
- 請(qǐng)求頭包含 host 字段,且它的值為
youdianzhishi.com
。 - 請(qǐng)求路徑匹配
/anything/*
,*
意味著任意的子路徑,例如/anything/foo?arg=10
。
當(dāng)路由創(chuàng)建完成后,現(xiàn)在我們就可以通過(guò)以下命令訪問(wèn)上游服務(wù)了:
? curl -i -X GET "http://127.0.0.1:9080/anything/foo?arg=10" -H "Host: youdianzhishi.com"
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 443
Connection: keep-alive
Date: Tue, 21 Mar 2023 08:25:49 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.2.0
{
"args": {
"arg": "10"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "youdianzhishi.com",
"User-Agent": "curl/7.85.0",
"X-Amzn-Trace-Id": "Root=1-64196a0d-1d2b654b29cbed3f7a9302c7",
"X-Forwarded-Host": "youdianzhishi.com"
},
"json": null,
"method": "GET",
"origin": "172.22.0.1, 221.11.206.200",
"url": "http://youdianzhishi.com/anything/foo?arg=10"
}
該請(qǐng)求將被 APISIX 轉(zhuǎn)發(fā)到 http://httpbin.org:80/anything/foo?arg=10
,我們可以和直接訪問(wèn)上游數(shù)據(jù)進(jìn)行對(duì)比。
httpbin數(shù)據(jù)
使用上游服務(wù)創(chuàng)建路由
我們還可以通過(guò)以下命令創(chuàng)建一個(gè)上游,并在路由中使用它,而不是直接將其配置在路由中:
? curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" -X PUT -d '
{
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}' -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
# 正常會(huì)得到如下所示的輸出
{"value":{"type":"roundrobin","create_time":1679392818,"pass_host":"pass","hash_on":"vars","update_time":1679392818,"nodes":{"httpbin.org:80":1},"id":"1","scheme":"http"},"key":"/apisix/upstreams/1"}
該上游配置與上一節(jié)配置在路由中的上游相同。同樣使用了 roundrobin
作為負(fù)載均衡機(jī)制,并設(shè)置了 httpbin.org:80
為上游服務(wù)。為了將該上游綁定到路由,此處需要把 upstream_id
設(shè)置為 "1"。
上游服務(wù)創(chuàng)建完成后,現(xiàn)在我們可以通過(guò)以下命令將其綁定到指定的 /get
路由:
? curl "http://127.0.0.1:9180/apisix/admin/routes/1" -X PUT -d '
{
"uri": "/get",
"host": "httpbin.org",
"upstream_id": "1"
}' -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
# 正常會(huì)得到如下所示的輸出
{"value":{"upstream_id":"1","status":1,"create_time":1679392758,"host":"httpbin.org","update_time":1679392834,"priority":0,"id":"1","uri":"/get"},"key":"/apisix/routes/1"}
我們已經(jīng)創(chuàng)建了路由與上游服務(wù),現(xiàn)在可以通過(guò)以下命令訪問(wèn)上游服務(wù):
? curl -i -X GET "http://127.0.0.1:9080/get?foo1=bar1&foo2=bar2" -H "Host: httpbin.org"
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 370
Connection: keep-alive
Date: Tue, 21 Mar 2023 08:40:19 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.2.0
{
"args": {
"foo1": "bar1",
"foo2": "bar2"
},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.85.0",
"X-Amzn-Trace-Id": "Root=1-64196d73-165daa124c362e5d4c6bb79d",
"X-Forwarded-Host": "httpbin.org"
},
"origin": "172.22.0.1, 221.11.206.200",
"url": "http://httpbin.org/get?foo1=bar1&foo2=bar2"
}
同樣該請(qǐng)求也會(huì)被 APISIX 轉(zhuǎn)發(fā)到 http://httpbin.org:80/anything/foo?arg=10
。
使用 Dashboard
同樣我們還可以使用 APISIX Dashboard 創(chuàng)建和配置類(lèi)似于上述步驟中所創(chuàng)建的路由。
如果你已經(jīng)完成上述操作步驟,正?,F(xiàn)在我們已經(jīng)可以通過(guò) localhost:9000
來(lái)訪問(wèn) APISIX Dashboard 了。
dashboard
默認(rèn)的用戶名和密碼均為 admin
,在 examples
目錄中 dashboard_conf
下面的 conf.yaml
進(jìn)行配置:
authentication:
secret: secret
expire_time: 3600
users:
- username: admin
password: admin
- username: user
password: user
上面我們的 docker-compose 中也已經(jīng)啟動(dòng)了 Grafana,所以登錄后我們也可以在首頁(yè)儀表盤(pán)上配置 Grafana,地址為 http://localhost:3000
。
Grafana
登錄后單擊側(cè)邊欄中的路由,可以查看已經(jīng)配置的路由列表,可以看到在上述步驟中使用 Admin API 創(chuàng)建的路由。
路由列表
你也可以通過(guò)單擊創(chuàng)建按鈕并按照提示創(chuàng)建新路由:
如果想利用 APISIX 實(shí)現(xiàn)身份驗(yàn)證、安全性、限流限速和可觀測(cè)性等功能,可通過(guò)添加插件實(shí)現(xiàn)。
限流限速和安全插件
在很多時(shí)候,我們的 API 并不是處于一個(gè)非常安全的狀態(tài),它隨時(shí)會(huì)收到不正常的訪問(wèn),一旦訪問(wèn)流量突增,可能就會(huì)導(dǎo)致你的 API 發(fā)生故障,這個(gè)時(shí)候我們就可以通過(guò)速率限制來(lái)保護(hù) API 服務(wù),限制非正常的訪問(wèn)請(qǐng)求。對(duì)此,我們可以使用如下方式進(jìn)行:
- 限制請(qǐng)求速率;
- 限制單位時(shí)間內(nèi)的請(qǐng)求數(shù);
- 延遲請(qǐng)求;
- 拒絕客戶端請(qǐng)求;
- 限制響應(yīng)數(shù)據(jù)的速率。
APISIX 提供了多個(gè)內(nèi)置的限流限速的插件,包括 limit-conn
、limit-count
和 limit-req
。
limit-conn
插件主要用于限制客戶端對(duì)服務(wù)的并發(fā)請(qǐng)求數(shù)。limit-req
插件使用漏桶算法限制對(duì)用戶服務(wù)的請(qǐng)求速率。limit-count
插件主要用于在指定的時(shí)間范圍內(nèi),限制每個(gè)客戶端總請(qǐng)求個(gè)數(shù)。
這里我們就以 limit-count
插件為例,來(lái)說(shuō)明如何通過(guò)限流限速插件保護(hù)我們的 API 服務(wù)。如下所示。
使用下面的命令首先創(chuàng)建一條路由:
? curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
"uri": "/index.html",
"plugins": {
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 503,
"key_type": "var",
"key": "remote_addr"
}
},
"upstream_id": "1"
}' -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
這里我們直接使用前面已經(jīng)創(chuàng)建的上游(ID 為 1)來(lái)創(chuàng)建/更新一條路由,并且在 plugins
中啟用了 limit-count
插件,該插件僅允許客戶端在 60 秒內(nèi),訪問(wèn)上游服務(wù) 2 次,超過(guò)兩次,就會(huì)返回 503 錯(cuò)誤碼。
上面的指令執(zhí)行成功后,接下來(lái)我們連續(xù)使用下面的命令訪問(wèn)三次后,則會(huì)出現(xiàn)如下錯(cuò)誤。
? curl http://127.0.0.1:9080/index.html
? curl http://127.0.0.1:9080/index.html
? curl http://127.0.0.1:9080/index.html
正常情況下就會(huì)出現(xiàn)如下所示的 503 錯(cuò)誤,則表示 limit-count
插件已經(jīng)配置成功。
<html>
<head>
<title>503 Service Temporarily Unavailable<span class="hljs-name"title>
<span class="hljs-name"head>
<body>
<center><h1>503 Service Temporarily Unavailable<span class="hljs-name"h1><span class="hljs-name"center>
<hr />
<center>openresty<span class="hljs-name"center>
<p>
<em>Powered by <a href="https://apisix.apache.org/">APISIX<span class="hljs-name"a>.<span class="hljs-name"em>
<span class="hljs-name"p>
<span class="hljs-name"body>
<span class="hljs-name"html>
緩存響應(yīng)
當(dāng)我們?cè)跇?gòu)建一個(gè) API 時(shí),肯定希望他能夠盡量保持簡(jiǎn)單和快速,一旦讀取相同數(shù)據(jù)的并發(fā)需求增加,可能會(huì)面臨一些問(wèn)題,一般我們直接的辦法就是引入緩存,當(dāng)然我們可以在不同層面去進(jìn)行緩存的。
- 邊緣緩存或 CDN
- 數(shù)據(jù)庫(kù)緩存
- 服務(wù)器緩存(API 緩存)
- 瀏覽器緩存
反向代理緩存是另一種緩存機(jī)制,通常在 API 網(wǎng)關(guān)內(nèi)實(shí)現(xiàn)。它可以減少對(duì)你的端點(diǎn)的調(diào)用次數(shù),也可以通過(guò)緩存上游的響應(yīng)來(lái)改善對(duì)你的 API 請(qǐng)求的延遲。如果 API Gateway 的緩存中有所請(qǐng)求資源的新鮮副本,它就會(huì)使用該副本直接滿足請(qǐng)求,而不是向端點(diǎn)發(fā)出請(qǐng)求。如果沒(méi)有找到緩存的數(shù)據(jù),請(qǐng)求就會(huì)轉(zhuǎn)到預(yù)定的上游服務(wù)(后端服務(wù))。
我們這里主要了解的是 API 網(wǎng)關(guān)層的緩存,也就是 APISIX 提供的 API 緩存,它也可以和其他插件一起使用,目前支持基于磁盤(pán)的緩存,也可以在插件配置中指定緩存過(guò)期時(shí)間或內(nèi)存容量等。
比如我們現(xiàn)在有一個(gè) /products
的 API 接口,通常每天只更新一次,而該端點(diǎn)每天都會(huì)收到重復(fù)的數(shù)十億次請(qǐng)求,以獲取產(chǎn)品列表數(shù)據(jù),現(xiàn)在我們就可以使用 APISIX 提供的一個(gè)名為 proxy-cache
的插件來(lái)緩存該接口的響應(yīng)。
這里我們還是使用前面 ID 為 1 的上游對(duì)象,使用 /anything/products
來(lái)模擬產(chǎn)品接口,直接執(zhí)行下面的命令來(lái)更新路由的插件:
? curl "http://127.0.0.1:9180/apisix/admin/routes/1" -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '{
"name": "Route for API Caching",
"methods": [
"GET"
],
"uri": "/anything/*",
"plugins": {
"proxy-cache": {
"cache_key": [
"$uri",
"-cache-id"
],
"cache_bypass": [
"$arg_bypass"
],
"cache_method": [
"GET"
],
"cache_http_status": [
200
],
"hide_cache_headers": true,
"no_cache": [
"$arg_test"
]
}
},
"upstream_id": "1"
}'
更新完成后現(xiàn)在我們來(lái)對(duì)該接口發(fā)起幾次請(qǐng)求:
? curl http://localhost:9080/anything/products -i
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 398
Connection: keep-alive
Date: Tue, 21 Mar 2023 10:48:42 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.2.0
Apisix-Cache-Status: MISS
? curl http://localhost:9080/anything/products -i
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 398
Connection: keep-alive
Date: Tue, 21 Mar 2023 10:48:42 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.2.0
Apisix-Cache-Status: HIT
正常每次都應(yīng)該收到 HTTP 200 OK 響應(yīng),但是第一次響應(yīng)中的 Apisix-Cache-Status
顯示為 MISS
,這意味著當(dāng)請(qǐng)求第一次進(jìn)入路由時(shí),響應(yīng)還沒(méi)有被緩存。而后面的幾次請(qǐng)求會(huì)得到一個(gè)緩存的響應(yīng),緩存指標(biāo)變?yōu)榱?HIT
,表示我們的響應(yīng)緩存成功了。
-
API
+關(guān)注
關(guān)注
2文章
1521瀏覽量
62464 -
nginx
+關(guān)注
關(guān)注
0文章
155瀏覽量
12243 -
MQTT
+關(guān)注
關(guān)注
5文章
655瀏覽量
22735 -
zetcd
+關(guān)注
關(guān)注
0文章
3瀏覽量
2830
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論