Как реализовать и ограничить количество вызовов API в секунду в Spring Rest - PullRequest
0 голосов
/ 15 января 2019

У меня есть подпружиненное приложение с пружиной MVC. В этом приложении мне нужно позвонить в Google API. Для API существует ограничение не более 4 запросов в секунду. Теперь мне нужно вызвать Google API из весеннего пакета. Итак, у меня есть два вопроса.

q1: Как я могу реализовать остальные вызов Google API. Я знаю о шаблоне отдыха, но хочу, чтобы был какой-то лучший подход, например, симулированный клиент, который мы используем в микросервисах.

q2: как я могу ограничить 4 звонка в секунду.

В случае, если у вас есть какие-либо вопросы. Пожалуйста, дайте мне знать

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете ограничить вызов API в секунду, используя RateLimiter. В Guava

реализован один

Вам необходимо создать RateLimiter и указать, сколько вызовов в секунду.

final RateLimiter rateLimiter = RateLimiter.create(4.0); // rate is "4 permits per second"

Каждый раз, когда вы хотите ограничить, вам нужно получить разрешение. Если все разрешения используются, исполнения ожидают.

rateLimiter.acquire(1);

Также можно указать тайм-аут на время ожидания разрешения.

0 голосов
/ 15 января 2019

в нашем проекте весенней загрузки мы используем OkHttpClient3 в качестве http-клиента. Мы также делаем вызовы для большого количества различных открытых API. Некоторые из них ограничивают количество звонков в секунду. В качестве решения мы реализовали Interceptor под названием DelayInterceptor.

В принципе; создать класс Java, который реализует okhttp3.Interceptor. В этом методе public Response intercept(Chain chain) ищите хост, который вы запрашиваете (чтобы различать вызовы, сделанные на разные публичные API), используя chain.request().url().host(), и если вы сделали вызов этому хосту, уже используйте Thread.sleep(amount);

Поскольку наш проект относительно новый, мы не анализировали возможные недостатки, но пока он работает.

P.S .: Вы также можете заглянуть в проект AsyncHttpClient , в котором уже есть решение этой проблемы (хотя я не смог найти его с помощью простого поиска в Google).

...