KONG根据请求参数限流

背景

价格接口 /search 同时支持缓存查价和实时查价,主要通过searchType字段区分这两种请求。

  • searchType 为空时为缓存查价,QPS很高。
  • searchType 不为空时为实时查价,但QPS远低于普通查价。

如果直接对该接口限流,当流量波动超过限流阈值时,实时查价可能会被拦截。实时查价是进入订单流程的关键环节,期望实时查价尽量不限流。

kong 插件

pre-function 的优先级比 rate-limiting 高,pre-function 在access阶段根据入参设置特定的header,如X-Search-Type。缓存查价设置 X-Search-Type:price,实时查价设置X-Search-Type:check。

rate-limiting 设置通过 X-Search-Type 头来限流,相当于缓存查价和实时查价设置了相同的限流,但由于实时查价的qps远低于缓存查价,所以满足了要求。

  • pre-function access 阶段的脚本

入参为json格式

复制代码
local kong = kong
local cjson = require("cjson.safe")

local req_body = kong.request.get_raw_body()
if req_body then
    local decoded_body = cjson.decode(req_body)

    if decoded_body and decoded_body.searchType and decoded_body.searchType ~= "" then
        kong.service.request.set_header("X-Search-Type", "check")
    else
        kong.service.request.set_header("X-Search-Type", "price")
    end
end

konga-kong-postgres 三件套

docker-compose.yml

复制代码
version: "3"

networks:
 kong-net:
  driver: bridge

services:
  kong-database:
    image: postgres:9.6
    restart: always
    networks:
      - kong-net
    environment:
      POSTGRES_PASSWORD: kong
      POSTGRES_USER: kong
      POSTGRES_DB: kong
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "kong"]
      interval: 5s
      timeout: 5s
      retries: 5

  kong-migration:
    image: kong:2.2.1-ubuntu
    command: "kong migrations bootstrap"
    networks:
      - kong-net
    restart: on-failure
    environment:
      KONG_PG_HOST: kong-database
      KONG_DATABASE: postgres
      KONG_PG_PASSWORD: kong
    links:
      - kong-database
    depends_on:
      - kong-database


  kong:
    image: kong:2.2.1-ubuntu
    restart: always
    networks:
      - kong-net
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kong
      KONG_PROXY_LISTEN: 0.0.0.0:8000
      KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
    depends_on:
      - kong-migration
      - kong-database
    healthcheck:
      test: ["CMD", "curl", "-f", "http://kong:8001"]
      interval: 5s
      timeout: 2s
      retries: 15
    ports:
      - "8001:8001"
      - "8000:8000"


  konga-prepare:
    image: pantsel/konga:0.14.9
    command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/postgres"
    environment:
      DB_ADAPTER: postgres
      DB_HOST: kong-database
      DB_USER: kong
      DB_PASSWORD: kong
    networks:
      - kong-net
    restart: on-failure
    links:
      - kong-database
    depends_on:
      - kong-database

 
  konga:
    image: pantsel/konga:0.14.9
    restart: always
    networks:
        - kong-net
    environment:
      DB_ADAPTER: postgres
      DB_HOST: kong-database
      DB_USER: kong
      DB_PASSWORD: kong
      DB_DATABASE: postgres
      NODE_ENV: production
    depends_on:
      - kong-database
    ports:
      - "1337:1337"

总结

这里只是根据入参限流的简单实现,不支持根据入参设置不同的限流阈值。要实现更复杂的限流,可以自定义插件,或者下降到服务层处理。

相关推荐
stevenzqzq15 天前
android fow 限流
android·限流·flow
liushangzaibeijing18 天前
Sentinel组件学习使用
sentinel·限流·熔断·服务降级
摇滚侠21 天前
Kong API 列表加 curl 访问案例 通过 curl 修改 router 的 method
java·kong
xiaolyuh12322 天前
Alibaba Sentinel 全解析
系统架构·sentinel·限流
无心水22 天前
【分布式利器:腾讯TSF】10、TSF故障排查与架构评审实战:Java架构师从救火到防火的生产哲学
java·人工智能·分布式·架构·限流·分布式利器·腾讯tsf
没有bug.的程序员23 天前
Service Mesh 下的流量治理:灰度、熔断、限流的深度实践与代价剖析
网络·云原生·限流·熔断·灰度发布·流量治理·servicemesh
rchmin25 天前
限流算法:令牌桶与漏桶详解
算法·限流
计算机小手1 个月前
Kong + Konga 网关入门实践:Docker 部署、反向代理与插件使用指南
运维·经验分享·网络协议·docker·kong·开源软件
摇滚侠1 个月前
VMvare 虚拟机 centOS 7 安装 Docker,Docker 安装 Kong Konga
docker·centos·kong
enjoy编程1 个月前
Spring Boot 4 如何使用Sentinel进行限流?
spring boot·sentinel·限流·熔断降级·流量控制·服务限流·系统负载保护