使用API Gateway缓存 - tommoore | 云计算,无服务器,SaaS

作者:API传播员 · 2026-01-09 · 阅读时间:6分钟

在基于微服务架构构建的应用程序中,开发者需要关注如何减少不必要的资源消耗,例如数据库查询、网络跳转或服务请求。API网关缓存(或称响应缓存)是一种有效的优化策略,可以显著提升系统性能。

对于许多微服务来说,在一个时间窗口内发送的相同请求通常会产生相同的响应。例如,查询订单API以获取昨天提交的订单列表时,第一个请求需要调用相关服务或数据库查询,但其结果可以被缓存。接下来的一段时间内,所有相同的请求都可以直接返回缓存的结果,从而节省系统资源。

如果您使用 Kong Gateway 提供上游服务,可以通过其代理缓存插件实现反向代理缓存功能。本文将介绍如何配置和使用该插件,并演示 Kong Gateway 在一个简单 API 服务器前的响应缓存功能。


什么是反向缓存?

反向缓存(也称为反向代理缓存)是一种缓存机制,其中专用的缓存应用程序(即反向代理)位于需要缓存的服务前。所有对服务的请求都会先经过反向代理,代理会根据缓存策略(如生存时间 TTL)决定是转发请求到服务端还是直接返回缓存的响应。


Kong Gateway 的代理缓存插件

Kong Gateway 提供了一个内置的代理缓存插件,通过简单的配置即可启用。启用后,Kong Gateway 将充当反向代理角色,帮助实现高效的缓存管理。


项目概述

在本次演示中,我们将使用 Kong Gateway 来处理 API 请求,并设置两个路由:

  1. 未缓存路由:直接将请求转发到 API 服务器。
  2. 缓存路由:启用代理缓存插件,将响应缓存一分钟。

当请求发送到缓存路由时,Kong Gateway 会在缓存过期前返回缓存的响应,而无需再次访问服务器。


搭建 Node.js Express 服务器

首先,我们需要构建一个简单的 API 服务器,用于返回随机编程名言。以下是具体步骤:

  1. 创建项目文件夹并初始化项目:

    mkdir project-folder
    cd project-folder
    yarn init -y
    yarn add express axios
  2. 创建 index.js 文件,代码如下:

    const express = require('express');
    const axios = require('axios');
    
    const app = express();
    let requestCount = 0;
    
    app.get('/', async (req, res) => {
       requestCount++;
       console.log(Endpoint hit count: ${requestCount});
       const response = await axios.get('https://programming-quotes-api.herokuapp.com/quotes/random');
       const { author, en: quote } = response.data;
       res.send({ quote, author });
    });
    
    app.listen(8080, () => console.log('Server running on port 8080'));
  3. 启动服务器:

    node index.js

在另一个终端中,使用 [curl](https://www.explinks.com/wiki/what-are-curl-url-uri/) 发送多个请求以验证服务器是否正常运行。


配置 Kong Gateway

安装 Kong Gateway

根据您的平台和环境安装 Kong Gateway。安装完成后,进行以下配置:

创建声明性配置文件

使用无数据库模式配置 Kong Gateway,可以通过声明性 YAML 文件预定义所有设置。创建初始配置文件:

touch kong.yml

编辑 kong.yml 文件,添加以下内容:

services:
  - name: quote-service
    url: http://localhost:8080

routes:
  - name: quote-route
    paths:
      - /quote
    service: quote-service

配置 kong.conf

将默认配置文件 kong.conf.default 复制为 kong.conf,并编辑以下内容:

database = off
declarative_config = /path/to/kong.yml

启动 Kong Gateway:

kong start -c /path/to/kong.conf

配置缓存路由

接下来,我们在 kong.yml 文件中添加缓存路由并启用代理缓存插件:

routes:
  - name: quote-route-with-cache
    paths:
      - /quote-cache
    service: quote-service
    plugins:
      - name: proxy-cache
        config:
          strategy: memory
          content_type: application/json
          cache_ttl: 60

更新配置后,重新启动 Kong Gateway:

kong reload -c /path/to/kong.conf

测试缓存功能

  1. 向未缓存路由 /quote 发送多个请求,Kong Gateway 会将每个请求转发到 API 服务器。
  2. 向缓存路由 /quote-cache 发送多个请求,在一分钟内的所有请求都会返回相同的缓存响应。
  3. 等待缓存过期后,再次发送请求,Kong Gateway 会重新访问服务器获取新的响应。

以下是测试结果的示例:

  • 快速连续发送请求时,API 服务器的请求计数器仅增加一次。
  • 缓存过期后,新的请求会触发服务器端点,生成新的响应。

其他用例

代理缓存插件不仅可以在特定路由上启用,还可以在以下场景中使用:

  • 服务级别:为整个服务启用缓存。
  • 消费者级别:为特定用户启用缓存。
  • 组合级别:为特定消费者和路由的组合启用缓存。

例如,为消费者启用缓存时,每个用户将拥有独立的缓存空间,缓存内容不会互相影响。


总结

通过使用 Kong Gateway 的代理缓存插件,您可以轻松实现微服务的响应缓存,从而减少网络和服务端的负载。无论是优化性能还是提升用户体验,代理缓存都是一种简单而高效的解决方案。

原文链接: https://konghq.com/blog/engineering/api-gateway-cache