关于OCI API Gateway的响应缓存功能

首先

我想写一篇关于OCI(Oracle Cloud Infrastructure)API Gateway提供的响应缓存功能的入门文章。

OCI API网关的响应缓存机制

OCI API Gateway具有与外部缓存服务器集成(如Redis、KeyDB等)以进行响应缓存的功能。这在提升性能和减轻对后端服务的负载方面起着重要作用。

image01.png

总体来说,

    1. 接收到来自客户端的API请求

 

    1. 根据请求的URL、HTTP方法(GET、HEAD、OPTIONS)和API部署的OCID来生成缓存键,然后根据该缓存键向外部缓存服务器发送查询请求

 

    1. 根据缓存命中与否的情况,做出如下行为:

如果缓存命中 → 从缓存服务器获取结果并返回
如果缓存未命中 → 从相应的后端服务获取结果返回

以以下方式运作。实际上是否有缓存命中?您可以通过 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。因此,整体配置如下。

image02.png

创建用于访问 OCI Vault 到 Redis 的密钥。

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

image03.png

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

image04.png

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

image05.png

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

image06.png

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

image07.png

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

image08.png

以以下方式输入并创建新秘钥。

    • コンパートメントに作成: 任意のコンパートメント(API Gateway, Vault のリソースが含まれているコンパートメント)

 

    • 名前: 任意の名前

 

    • 説明(オプション): for oci api gateway cache feature

 

    • 暗号化キー: 前述の手順で作成したマスター暗号化キーを指定

 

    • シークレット・タイプ・テンプレート: プレーン・テキスト

 

    シークレット・コンテンツ: {“password”: “”}
image09.png

现在,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.
image10.png

然后,将下面的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网关配置为使用缓存服务器。

image11.png

点击创建网关,按照以下方式输入以创建新的 API 网关。(如果已经创建了 API 网关,则可以重新设置以使用缓存)

    • 名前: 任意の名前

 

    • タイプ: パブリック

 

    • コンパートメント: 任意のコンパートメント

 

    • 仮想クラウド・ネットワーク: 任意の VCN

 

    • サブネット: 任意のリージョナルサブネット

 

    • レスポンス・キャッシングの有効化: チェックを入れる

 

    • ホスト: 前述の手順で Redis を構築した Compute Instance のパブリック IP を入力

 

    • ポート: 6379

 

    • ボールト: 前述の手順で作成したボールト

 

    • シークレット: 前述の手順で作成したシークレット

 

    バージョン番号: 1(更新した場合には最新のバージョンを選択する)
image13.png

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

image14.png

在基本信息栏中输入以下内容,然后点击下一步。

    • 名前: cache-deployment

 

    パス接頭辞: /cache
image15.png

为了创建新的路由,按照以下方式输入,并在确认画面上点击创建,创建新的部署。

    • パス: /hello

 

    • メソッド: GET

 

    • タイプ: Oracle Functions

 

    • アプリケーション: 作成済みのアプリケーション

 

    • 機能名: fn-java

 

    • レスポンス・キャッシング・ポリシーを表示

このルートのキャッシングの有効化にチェック
キャッシュされたレスポンスの TTL(秒): 120

image17.png

这样,已经完成了使用构建的缓存服务器的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: 确认已经命中缓存。

请参考

    パフォーマンス向上のためのレスポンスのキャッシュ
bannerAds