gpt4 book ai didi

java - 在 Feign RequestInterceptor/RequestTemplate 中访问 URITemplate 或 RequestLine 值

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:05 24 4
gpt4 key购买 nike

我正在针对具有硬性 API 速率限制的云应用程序开发应用程序。为了让我的团队了解我们离这些限制有多近,我想以一种有意义的方式计算从我们的应用发出的所有 API 调用。

我们使用 Feign 作为访问层,我希望能够使用 RequestInterceptor 来统计我们调用的不同 API 端点:

RequestInterceptor ri = rq -> addStatistics(rq.url());

现在这行不通了,因为生成的 URL 之后几乎总是计数为“1”,因为它们已经包含所有已解析的路径变量,所以我得到计数​​

1 - /something/id1valueverycryptic/get
1 - /something/anothercrypticidkey/get

等等。

我希望以某种方式访问​​ @ResuqestLine 映射值 (GET/something/{id}/get) 或至少访问 uri 模板解决 (/somethine/{id}/get)

有办法吗?

谢谢!

最佳答案

也许您可以尝试使用自定义 feign InvocationHandlerFactory。

我已经成功地使用如下代码记录了 RequestInterceptor:

  • 更改 EnableFeignClients 并添加 defaultConfiguration

    @EnableFeignClients(defaultConfiguration = FeignConfig.class)
  • 添加默认的feign配置

    @Configuration
    public class FeignConfig {

    @Bean
    @ConditionalOnMissingBean
    public Retryer feignRetryer() {
    return Retryer.NEVER_RETRY;
    }

    @Bean
    @Scope("prototype")
    @ConditionalOnMissingBean
    public Feign.Builder feignBuilder(Retryer retryer) {
    return Feign.builder()
    .retryer(retryer)
    .invocationHandlerFactory((target, dispatch) -> new CountingFeignInvocationHandler(target, dispatch));
    }

    }
  • 创建您的调用处理程序(基于 feign.ReflectiveFeign.FeignInvocationHandler 的代码)

    public class CountingFeignInvocationHandler implements InvocationHandler {

    private final Target target;
    private final Map<Method, MethodHandler> dispatch;

    public CountingFeignInvocationHandler(Target target, Map<Method, MethodHandler> dispatch) {
    this.target = checkNotNull(target, "target");
    this.dispatch = checkNotNull(dispatch, "dispatch for %s", target);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if ("equals".equals(method.getName())) {
    try {
    Object otherHandler =
    args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
    return equals(otherHandler);
    } catch (IllegalArgumentException e) {
    return false;
    }
    } else if ("hashCode".equals(method.getName())) {
    return hashCode();
    } else if ("toString".equals(method.getName())) {
    return toString();
    }

    RequestLine requestLine = method.getAnnotation(RequestLine.class);
    addStatistics(requestLine.value());

    return dispatch.get(method).invoke(args);
    }

    @Override
    public boolean equals(Object obj) {
    if (obj instanceof CountingFeignInvocationHandler) {
    CountingFeignInvocationHandler other = (CountingFeignInvocationHandler) obj;
    return target.equals(other.target);
    }
    return false;
    }

    @Override
    public int hashCode() {
    return target.hashCode();
    }

    @Override
    public String toString() {
    return target.toString();
    }
    }

小心并检查您是否假装配置没有更复杂,在这种情况下根据需要扩展类。

关于java - 在 Feign RequestInterceptor/RequestTemplate 中访问 URITemplate 或 RequestLine 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55531602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com