Я реализовал шлюз API с облачным шлюзом Spring. Я добавил ограничители скорости Redis со следующими конфигурациями:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
key-resolver: "#{@remoteAddrKeyResolver}"
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 5
---
spring:
redis:
host: localhost
port: 6379
database: 0
Я могу успешно заблокировать пользовательские запросы с кодом ошибки 429 TOO Много запросов.
Теперь я хочу, чтобы та же запись была вставлена в базу данных Redis, чтобы я мог ее анализировать.
Какую конфигурацию мне нужно сделать? Я посетил блог, где он показывает это, но не смог найти связанный с ним код. Вот ссылка этого блога.
Кроме того, может ли кто-нибудь объяснить точный разница между пополнениями Rate и BurstCapacity на каком-то примере? Я немного смущен здесь.
@spencergibb спасибо за ответ. Есть ли способ отслеживать количество пользователей, превышающих скорость пополнения, вместе с некоторыми базовыми данными о пользователях?
В настоящее время нет способа сделать это
@spencergibb Можете ли вы объяснить, как механизм ограничения скорости работает внутри Redis DB, поскольку я не вижу никаких записей, связанных с ним, в моей локальной базе данных Redis. Кроме того, можете ли вы сказать мне, как я могу использовать это в кластерной среде? У меня есть два экземпляра шлюза API в моем приложении.
У них истекает время ожидания ключей, поэтому, если у вас нет постоянного трафика, там может ничего не быть, когда вы пойдете смотреть. Кластеризация шлюзов не должна иметь никакого эффекта, на самом деле причина использования Redis ИЗ-ЗА кластеризации.
@spencergibb Я написал несколько контроллеров в шлюзе API, к которым я получаю доступ из других моих микросервисов через фиктивный клиент, в котором у меня есть два вопроса: 1) Могу ли я каким-либо образом ограничить трафик, поступающий извне, и разрешить трафик только из моих микросервисов. 2) Когда я пишу контроллер в шлюзе API, он напрямую обращается к конечным точкам, не переходя к фильтрам (ограничитель скорости повторного использования и настраиваемый фильтр), которые я прописал в маршрутах шлюза в моем файле bootstrap.yml. Есть ли способ, которым я могу их проверить?
Используя uri: forward:/mycontroller, да, вы можете.




Невозможно добавить 429 в базу данных. У нас есть открытый вопрос для использования исключения, на которое вы могли бы ответить. Мы используем алгоритм en.wikipedia.org/wiki/Token_bucket. Скорость пополнения — это скорость добавления токенов в корзину. Максимальная емкость — это количество токенов, которое может храниться в корзине.