如何在Spring Rest中实现和限制每秒的API调用

时间:2019-01-15 13:23:04

标签: spring spring-boot spring-batch spring-restcontroller

我有Spring MVC的Spring Batch应用程序。在此应用程序中,我必须调用Google API。 API的最大每秒请求数为4。现在,我必须从spring batch内部调用google API。所以我有两个问题。

q1:如何实现对Google API的rest调用。我了解Rest Template,但是我希望有一种更好的方法,例如我们在微服务中使用的伪装客户端。

q2:如何每秒限制4个呼叫。

如果您有任何疑问。请让我知道

3 个答案:

答案 0 :(得分:2)

您可以使用RateLimiter来限制每秒的API调用。 Guava

中实现了一个

您需要创建RateLimiter并告诉您每秒有多少个电话。

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

每次要限制时,都需要获得许可证。如果所有许可均已使用,则执行将等待。

rateLimiter.acquire(1);

还可以指定等待许可的超时时间。

答案 1 :(得分:0)

在我们的spring-boot项目中,我们使用OkHttpClient3作为http客户端。我们还对许多不同的公共API进行了调用。其中一些限制每秒通话。作为解决方案,我们实现了一个名为DelayInterceptor的拦截器。

基本上;创建一个实现okhttp3.Interceptor的Java类。 在它的public Response intercept(Chain chain)方法中,使用chain.request().url().host()查找您要请求的主机(以区分对不同公共API的调用),并且如果您已对此主机进行了调用,则已经使用Thread.sleep(amount);

由于我们的项目相对较新,因此我们没有分析可能的弊端,但到目前为止它仍然有效。

P.S:您也可以研究AsyncHttpClient项目,该项目已经解决了这个问题(即使我无法通过简单的Google搜索找到该项目)。

答案 2 :(得分:0)

我创建了可用于限制 API 的 RateLimiter。这是您可以为 API 改进和实施的线程的通用解决方案。

Rate Limiting API