Feign 客户端是否有瓶颈的本地实现?
Does Feign client have native implementation of bottlenecking?
我遇到了以下情况,令我惊讶的是,我找不到太多文档:
有一项服务仅通过 1 1 1 获取项目详细信息来提供休息呼叫。
共有 1k+ 项。
出于响应的原因,我想在我这边保留这些数据,而不是懒惰地获取它。
为了让我的 API 键不被锁定,我想将我的调用限制为每秒 X 次调用。
我在 Feign 文档中找不到对此的任何支持。
有人知道有没有吗?或者您对如何执行此实施有任何建议?
Feign
中没有内置节流功能,而是委托给底层 Client
实现。话虽如此,您可以定义自己的客户端,从所提供的 Apache Http
、OkHttp
和 Ribbon
.
之一扩展
一种解决方案是扩展 Client
以使用此答案中概述的 ScheduledThreadPoolExecutor
。
要将其与 Feign
中提供的 ApacheHttpClient
一起使用,您可以扩展它,提供您自己的 execute
方法实现以使用执行器。
public class ThrottledHttpClient extends ApacheHttpClient {
// create a pool with one thread, you'll control the flow later.
private final ExecutorService throttledQueue = Executors.newScheduledThreadPool(1);
@Override
public Response execute(Request request, Request.Options options) throws IOException {
// use the executor
ScheduledFuture<Response> future = throttledQueue.scheduleAtFixedRate(super.execute(), ....);
return future.get()
}
设置适当的线程池大小、延迟和固定等待以达到您想要的吞吐量。
我遇到了以下情况,令我惊讶的是,我找不到太多文档: 有一项服务仅通过 1 1 1 获取项目详细信息来提供休息呼叫。 共有 1k+ 项。
出于响应的原因,我想在我这边保留这些数据,而不是懒惰地获取它。
为了让我的 API 键不被锁定,我想将我的调用限制为每秒 X 次调用。
我在 Feign 文档中找不到对此的任何支持。 有人知道有没有吗?或者您对如何执行此实施有任何建议?
Feign
中没有内置节流功能,而是委托给底层 Client
实现。话虽如此,您可以定义自己的客户端,从所提供的 Apache Http
、OkHttp
和 Ribbon
.
一种解决方案是扩展 Client
以使用此答案中概述的 ScheduledThreadPoolExecutor
。
要将其与 Feign
中提供的 ApacheHttpClient
一起使用,您可以扩展它,提供您自己的 execute
方法实现以使用执行器。
public class ThrottledHttpClient extends ApacheHttpClient {
// create a pool with one thread, you'll control the flow later.
private final ExecutorService throttledQueue = Executors.newScheduledThreadPool(1);
@Override
public Response execute(Request request, Request.Options options) throws IOException {
// use the executor
ScheduledFuture<Response> future = throttledQueue.scheduleAtFixedRate(super.execute(), ....);
return future.get()
}
设置适当的线程池大小、延迟和固定等待以达到您想要的吞吐量。