关于OCI API Gateway的响应缓存功能
首先
我想写一篇关于OCI(Oracle Cloud Infrastructure)API Gateway提供的响应缓存功能的入门文章。
OCI API网关的响应缓存机制
OCI API Gateway具有与外部缓存服务器集成(如Redis、KeyDB等)以进行响应缓存的功能。这在提升性能和减轻对后端服务的负载方面起着重要作用。

总体来说,
-
- 接收到来自客户端的API请求
-
- 根据请求的URL、HTTP方法(GET、HEAD、OPTIONS)和API部署的OCID来生成缓存键,然后根据该缓存键向外部缓存服务器发送查询请求
-
- 根据缓存命中与否的情况,做出如下行为:
如果缓存命中 → 从缓存服务器获取结果并返回
如果缓存未命中 → 从相应的后端服务获取结果返回
以以下方式运作。实际上是否有缓存命中?您可以通过 API 网关,在 HTTP 响应头中添加 X-Cache-Status,然后在客户端端检查该头部以确认。实际返回的 X-Cache-Status 值如下所示。
X-Cache-Status: HIT: 一致するキャッシュ・キーがキャッシュ・サーバーで見つかり、レスポンスがキャッシュ・サーバーから取得されたことを表す
X-Cache-Status: MISS: 一致するキャッシュ・キーがキャッシュ・サーバーで見つからなかったため、レスポンスがバックエンドサーバーから取得されたことを表す
X-Cache-Status: BYPASS: キャッシュ・サーバーに対して問い合わせが行われなかったことを表す。(通常、キャッシュ・サーバーとの通信に何か問題がある場合が多いと思います)
试试API网关的缓存功能。
假设
我想用以下前提来写出步骤。
-
- Oracle Cloud Infrastructure のアカウントを有していること(NOT Always Free)
-
- Docker, Docker Compose がセットアップ済みの Compute Instance を有していること
-
- API Gateway から OCI Vault に対するポリシーの設定が完了していること
参考: Vault サービスのキャッシュ・サーバー資格証明への API ゲートウェイ・アクセス権を付与するポリシーの作成
Oracle Functions の開発環境の設定が完了していること(Fn CLI を用いて、Oracle Functions のアプリケーションに関数コードをデプロイすることができること)
参考: Fn Project ハンズオン
参考: Oracle Functions ハンズオン
步驟
那么,我们来实际构建。本次,我们将在缓存服务器上使用Redis,后端服务器使用Oracle Functions。因此,整体配置如下。

创建用于访问 OCI Vault 到 Redis 的密钥。
我们将创建一个用于访问 Redis 的 Secret 到 OCI Vault 中。请在OCI控制台的左上角汉堡菜单中,选择”身份与安全”,然后选择”Vault”。

点击“创建Vault”,新建一个Vault。

输入任意名称并点击创建按钮。

在创建Vault完成后,我们需要生成主密钥。在Vault的详细页面中,点击主密钥资源以创建密钥。

输入任意名称,并生成主加密密钥。

接下来,我们将创建一个机密(Secret)。在Vault的详细信息页面的Secret资源中,点击创建机密(Secret)。

以以下方式输入并创建新秘钥。
-
- コンパートメントに作成: 任意のコンパートメント(API Gateway, Vault のリソースが含まれているコンパートメント)
-
- 名前: 任意の名前
-
- 説明(オプション): for oci api gateway cache feature
-
- 暗号化キー: 前述の手順で作成したマスター暗号化キーを指定
-
- シークレット・タイプ・テンプレート: プレーン・テキスト
- シークレット・コンテンツ: {“password”: “”}

现在,Vault 的设置已经完成,它用于存储访问 API Gateway -> Redis 所需的密码。
在计算实例中部署 Redis。
Compute に直接 Redis をインストールしても良いのですが、より手軽に実施するために今回は Docker, Docker Compose を使用して Redis を構築します。まずは、Redis 用のポートを開放します。
计算机防火墙的设置。
sudo firewall-cmd --add-port=6379/tcp --zone=public --permanent
sudo firewall-cmd --reload
OCI 安全清单的设置
以下是更新Redis实例所属 VCN 的安全列表的入站规则:
-
- ソースタイプ: CIDR
-
- ソース CIDR: 0.0.0.0/0
-
- IP プロトコル: TCP
-
- ソース・ポート範囲 オプション: 未入力
-
- 宛先ポート範囲 オプション: 6379
- 説明 オプション: for Redis default port.

然后,将下面的docker-compose.yaml文件创建到任意目录(例如$HOME/redis)。
version: '3.8'
volumes:
redis-data:
services:
redis:
image: redis:6.2.6
container_name: redis
ports:
- 6379:6379
command: redis-server --requirepass <your-password>
volumes:
- redis-data:/data
请在此处更新为在OCI Vault中创建用于访问Redis的秘密的秘密值。(在本文示例中,为shukawam-secret)
进行Redis启动后的更新。
docker-compose up -d
请确认启动
docker ps | grep redis
2e0812dd38a8 redis:6.2.6 "docker-entrypoint.s…" 6 hours ago Up 6 hours 0.0.0.0:6379->6379/tcp redis
使用设定的密码来确认是否可以访问。
docker exec -it redis redis-cli -h <your-compute-public-ip> -p 6379
使用设定的密码进行认证。
auth <your-password>
OK
确认使用适当的键是否可以进行引用操作。
get foo
(nil)
现在,Redis已经构建完成了。
创建Oracle函数
创建用于构建后端的 Function。
fn init --runtime java11 fn-java
构建和部署
cd fn-java; fn deploy --app <your-app>
进行 API Gateway 的配置
在OCI控制台的左上角汉堡菜单中,选择开发者服务>网关,并将API网关配置为使用缓存服务器。

点击创建网关,按照以下方式输入以创建新的 API 网关。(如果已经创建了 API 网关,则可以重新设置以使用缓存)
-
- 名前: 任意の名前
-
- タイプ: パブリック
-
- コンパートメント: 任意のコンパートメント
-
- 仮想クラウド・ネットワーク: 任意の VCN
-
- サブネット: 任意のリージョナルサブネット
-
- レスポンス・キャッシングの有効化: チェックを入れる
-
- ホスト: 前述の手順で Redis を構築した Compute Instance のパブリック IP を入力
-
- ポート: 6379
-
- ボールト: 前述の手順で作成したボールト
-
- シークレット: 前述の手順で作成したシークレット
- バージョン番号: 1(更新した場合には最新のバージョンを選択する)

然后,创建一个使用Oracle Functions作为后端的部署和路由。在网关的详细页面上,点击创建部署。

在基本信息栏中输入以下内容,然后点击下一步。
-
- 名前: cache-deployment
- パス接頭辞: /cache

为了创建新的路由,按照以下方式输入,并在确认画面上点击创建,创建新的部署。
-
- パス: /hello
-
- メソッド: GET
-
- タイプ: Oracle Functions
-
- アプリケーション: 作成済みのアプリケーション
-
- 機能名: fn-java
-
- レスポンス・キャッシング・ポリシーを表示
このルートのキャッシングの有効化にチェック
キャッシュされたレスポンスの TTL(秒): 120

这样,已经完成了使用构建的缓存服务器的API Gateway和部署的设置。
确认缓存是否被正确使用
我将向已创建的 API 网关路由发送请求。
1 请求回顾:
curl --dump-header - https://...apigateway.ap-tokyo-1.oci.customer-oci.com/cache/hello
1. 在回应中:
HTTP/1.1 200 OK
Date: Fri, 05 Nov 2021 08:45:49 GMT
Content-Type: text/plain
Connection: keep-alive
Content-Length: 13
Server: Oracle API Gateway
X-Cache-Status: MISS
opc-request-id: /2C552C5FE8188F8E35BE0D97FCDEF927/5D2EDF4F87E162E086CD0E04E9B4B287
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
Hello, world!
X-Cache-Status为MISS表示未命中缓存。接下来,将再次发送相同的请求进行确认。
第二回复:
HTTP/1.1 200 OK
Date: Fri, 05 Nov 2021 08:46:17 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Server: Oracle API Gateway
X-Content-Type-Options: nosniff
X-Frame-Options: sameorigin
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000
opc-request-id: /5CE6249E287877B2658F4CA18139A93B/BFBD0317FE423AB5D7DE61041B0BCF50
X-Cache-Status: HIT
Hello, world!
X-Cache-Status: 确认已经命中缓存。
请参考
- パフォーマンス向上のためのレスポンスのキャッシュ