问题
I have spring batch application with spring MVC. In this application, I have to call Google API. There is a restriction of max 4 req per sec for API. Now I have to call google API from inside the spring batch. So I have two questions.
q1: How can I implement rest call to Google API. I know about Rest Template but I want that there is any better approach like feign client that we use in microservices.
q2: how can I restrict 4 calls per second.
In case you have any question. Please let me know
回答1:
You can limit API call per second by using a RateLimiter. There is one implemented in Guava
You need to create the RateLimiter and tell how many calls per second.
final RateLimiter rateLimiter = RateLimiter.create(4.0); // rate is "4 permits per second"
Every time you want to limit, you need to acquire a permit. If all permits are used, executions waits.
rateLimiter.acquire(1);
It is also possible to specify a timeout on how long to wait for a permit.
回答2:
in our spring-boot project we use OkHttpClient3 as http client. We also make rest calls to lots of different public APIs. Some of them restricts calls per second. As a solution we implemented an Interceptor called DelayInterceptor.
Basically; create a Java Class that implements okhttp3.Interceptor.
In it's public Response intercept(Chain chain) method look for the host you are requesting (to differentiate between calls made to different public APIs) using chain.request().url().host() and if you made a call to this host already use Thread.sleep(amount);
Since our project relatively new, we did not analyze possible drawbacks, but so far it works.
P.S: You can also look into AsyncHttpClient project, which already has a solution for this problem (even though I could not find with a simple google search).
回答3:
I have created RateLimiter that can be used to limit API. It's generic solutions for the thread you can improve and implement for your API.
Rate Limiting API
来源:https://stackoverflow.com/questions/54199734/how-to-implement-and-limit-api-calls-per-second-in-spring-rest