使用API Gateway缓存 - tommoore | 云计算,无服务器,SaaS
在基于微服务架构构建的应用程序中,开发者需要关注如何减少不必要的资源消耗,例如数据库查询、网络跳转或服务请求。API网关缓存(或称响应缓存)是一种有效的优化策略,可以显著提升系统性能。
对于许多微服务来说,在一个时间窗口内发送的相同请求通常会产生相同的响应。例如,查询订单API以获取昨天提交的订单列表时,第一个请求需要调用相关服务或数据库查询,但其结果可以被缓存。接下来的一段时间内,所有相同的请求都可以直接返回缓存的结果,从而节省系统资源。
如果您使用 Kong Gateway 提供上游服务,可以通过其代理缓存插件实现反向代理缓存功能。本文将介绍如何配置和使用该插件,并演示 Kong Gateway 在一个简单 API 服务器前的响应缓存功能。
什么是反向缓存?
反向缓存(也称为反向代理缓存)是一种缓存机制,其中专用的缓存应用程序(即反向代理)位于需要缓存的服务前。所有对服务的请求都会先经过反向代理,代理会根据缓存策略(如生存时间 TTL)决定是转发请求到服务端还是直接返回缓存的响应。
Kong Gateway 的代理缓存插件
Kong Gateway 提供了一个内置的代理缓存插件,通过简单的配置即可启用。启用后,Kong Gateway 将充当反向代理角色,帮助实现高效的缓存管理。
项目概述
在本次演示中,我们将使用 Kong Gateway 来处理 API 请求,并设置两个路由:
- 未缓存路由:直接将请求转发到 API 服务器。
- 缓存路由:启用代理缓存插件,将响应缓存一分钟。
当请求发送到缓存路由时,Kong Gateway 会在缓存过期前返回缓存的响应,而无需再次访问服务器。
搭建 Node.js Express 服务器
首先,我们需要构建一个简单的 API 服务器,用于返回随机编程名言。以下是具体步骤:
-
创建项目文件夹并初始化项目:
mkdir project-folder cd project-folder yarn init -y yarn add express axios -
创建
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')); -
启动服务器:
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
测试缓存功能
- 向未缓存路由
/quote发送多个请求,Kong Gateway 会将每个请求转发到 API 服务器。 - 向缓存路由
/quote-cache发送多个请求,在一分钟内的所有请求都会返回相同的缓存响应。 - 等待缓存过期后,再次发送请求,Kong Gateway 会重新访问服务器获取新的响应。
以下是测试结果的示例:
- 快速连续发送请求时,API 服务器的请求计数器仅增加一次。
- 缓存过期后,新的请求会触发服务器端点,生成新的响应。
其他用例
代理缓存插件不仅可以在特定路由上启用,还可以在以下场景中使用:
- 服务级别:为整个服务启用缓存。
- 消费者级别:为特定用户启用缓存。
- 组合级别:为特定消费者和路由的组合启用缓存。
例如,为消费者启用缓存时,每个用户将拥有独立的缓存空间,缓存内容不会互相影响。
总结
通过使用 Kong Gateway 的代理缓存插件,您可以轻松实现微服务的响应缓存,从而减少网络和服务端的负载。无论是优化性能还是提升用户体验,代理缓存都是一种简单而高效的解决方案。
原文链接: https://konghq.com/blog/engineering/api-gateway-cache
最新文章
- 如何创建带有JSON响应的简单REST API
- 一文讲透MCP的原理及实践
- API安全:基于令牌的验证 vs 基于密钥的验证,哪种更可靠?
- Spring API 接口加解密
- 我们如何构建教育数据门户的API
- 2025年 GitHub 上热门 AI Agents 开源项目:AutoGen、CrewAI、OpenDevin
- api 设计入门:最佳实践与实现
- 什么是 ERT
- Grok 2 和 Grok 3 使用教程:教你如何获得Grok3的访问权限
- 深入掌握Laravel 12中使用Sanctum实现的API认证 – Kritimyantra
- 如何在 Node.js 中构建 gRPC API
- Link支付怎么注册?一站式指南