写点什么

feign 的动态代理

作者:周杰伦本人
  • 2022-10-19
    贵州
  • 本文字数:1569 字

    阅读完需:约 1 分钟

feign 的动态代理

feign 的动态代理需要用到两个组件,调用处理器和方法处理器

调用处理器 FeignInvocationHandler

feign 默认的调用处理器是 FeignInvocationHandler


static class FeignInvocationHandler implements InvocationHandler {
private final Target target; private final Map<Method, MethodHandler> dispatch;
FeignInvocationHandler(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(); } return dispatch.get(method).invoke(args); }
@Override public boolean equals(Object obj) { if (obj instanceof FeignInvocationHandler) { FeignInvocationHandler other = (FeignInvocationHandler) obj; return target.equals(other.target); } return false; }
@Override public int hashCode() { return target.hashCode(); }
@Override public String toString() { return target.toString(); } }
复制代码


FeignInvocationHandler 根据 java 实例找到 MethodHandler,然后转交给 MethodHandler,调用 MethodHandler 的 invoke 方法完成 http 请求和结果响应。


dispatch map 对象是远程调用结果中的方法和对应的 MethodHandler 的键值对,

MethodHandler 方法处理器

MethodHandler 是 feign 自定义的接口,主要功能是调用远程 url,并返回结果


SynchronousMethodHandler 实现了 MethodHandler 接口


@Override  public Object invoke(Object[] argv) throws Throwable {    RequestTemplate template = buildTemplateFromArgs.create(argv);    Retryer retryer = this.retryer.clone();    while (true) {      try {        return executeAndDecode(template);      } catch (RetryableException e) {        retryer.continueOrPropagate(e);        if (logLevel != Logger.Level.NONE) {          logger.logRetry(metadata.configKey(), logLevel);        }        continue;      }    }  }
复制代码


invoke 方法中先生成 requestTemplate 实例,然后执行 executeAndDecode 方法,executeAndDecode 方法中主要完成封装 request 请求,然后通过 feignClient 来进行 RPC 调用,最后获取响应结果。

FeignClient

feignClient 有很多,默认是 Client.Default 类,它使用 JDK 的 HttpURLConnection 发送请求,它的性能很低。ApacheHttpClient 有连接池,可以复用,OKHttpClient 也是一种 feignclient

总结

这是对 feign 的动态代理的两个重要的类,调用处理器和方法处理器,调用处理器用来具体方法处理器的调度,然后在方法处理器中通过执行 executeAndDecode 方法来完成具体的 RPC 的调用,并返回响应结果,最后介绍了一下 feignClient 的,也就是发送 http 请求的客户端,默认是 Client.Default,但它的性能很低,除此之外还有 ApacheHttpClient 和 OKHttpClient,这两个客户端的效率都比较高,推荐使用这两个客户端发送 http 请求。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2020-02-29 加入

公众号《盼盼小课堂》,多平台优质博主

评论

发布
暂无评论
feign的动态代理_10月月更_周杰伦本人_InfoQ写作社区