全部产品

API 缓存配置

更新时间:2020-04-21 11:33:53

API 网关支持对某些请求的结果进行缓存。如果一个接口本身是幂等的,并且返回值在一定时间内不会发生变化,那么可以在 API 网关上配置缓存。

  • 当前支持的缓存最长时间为 5 分钟。
  • 缓存的 key 可以从 Header、Cookie、QueryString 或 Body 中选择。
  • 如果选择 Body,Body 必须是一个 JSON 字符串,暂时不支持 pb 格式的 Body。

说明:目前 API 缓存只支持 downstream 为 HTTP 的请求,暂时不支持 SOFARPC 的请求。

配置说明

假设 API 的配置如下:

  1. - methodGET
  2. - path:/test/cache
  3. - cacheConfig: header:["version","temp"] , queryString:["a","b"]; ttl 10s

此处的 cacheConfig 含义是:

  • 如果 Header 中存在 versiontemp,并且 QueryString 中存在 ab,那么这个请求的响应将会被缓存。
  • 如果第二个请求中 Header 和 QueryString 的 value 和第一个请求一样,那么网关会直接将第一个请求的缓存返回,而不会再去调用服务提供方。

例如,第一个请求如下:

  1. curl -H "version=1" -H "temp=true" 127.0.0.1?a=a&b=b

该请求包含了 a 和 b 两个 QueryString key,也包含 version 和 temp 两个 Header key,所以这个请求的响应会被缓存 10s。

假设 10s 内的第二个请求如下:

  1. curl -H "version=1" -H "temp=true" -H "other=other" 127.0.0.1?a=a&b=b&c=c

该请求也包含了相应的 key,同时值也和第一个请求相同。这个请求网关会直接返回缓存值,而不会调用到后端 server。

设置 Key

当前,API 网关支持设置 Header、Body、Query、Cookie key。

  • Header、Query、Cookie 都比较简单,直接设置 key 就可以的。
  • 但是 Body 一般都比较复杂,无法直接通过一个简单的字符串定位到,所以设置的方式比较特殊。当前仅支持 Body 为 JSON 的请求。

Body key 设置示例

假设 Body 是如下字符串:

  1. {
  2. "name": {"first": "Tom", "last": "Anderson"},
  3. "age":37,
  4. "children": ["Sara","Alex","Jack"],
  5. "fav.movie": "Deer Hunter",
  6. "friends": [
  7. {"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
  8. {"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
  9. {"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
  10. ]
  11. }

设置 Body key 的时候,需要使用一个简单的表达式:

  1. "name.last" >> "Anderson"
  2. "age" >> 37
  3. "children" >> ["Sara","Alex","Jack"]
  4. "children.#" >> 3
  5. "children.1" >> "Alex"
  6. "child*.2" >> "Jack"
  7. "c?ildren.0" >> "Sara"
  8. "fav\.movie" >> "Deer Hunter"
  9. "friends.#.first" >> ["Dale","Roger","Jane"]
  10. "friends.1.last" >> "Craig"

您还可以使用 #(…) 查询第一个匹配项的数组,或使用 #(…)# 查找所有匹配项。支持 ==!=<<=>>= 和简单的模式匹配 %(like)和 !%(not like)。

  1. friends.#(last=="Murphy").first >> "Dale"
  2. friends.#(last=="Murphy")#.first >> ["Dale","Jane"]
  3. friends.#(age>45)#.last >> ["Craig","Murphy"]
  4. friends.#(first%"D*").last >> "Murphy"
  5. friends.#(first!%"D*").last >> "Craig"
  6. friends.#(nets.#(=="fb"))#.first >> ["Dale","Roger"]

控制台配置

您可以直接在 API 网关控制台 > API 详情页 > 流量治理 > 缓存 进行相应的 API 缓存配置,如下图所示。

缓存配置

说明:当前 Body 的嵌套最多支持 5 层,比如 a.b.c.d.e.f。超过 5 层暂不支持。

相关链接