写点什么

RefectiveFeign

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

    阅读完需:约 1 分钟

RefectiveFeign

RefectiveFeign 是 Feign 的具体实现类,它可以生成动态代理对象

动态代理对象的创建

RefectiveFeign 的 newInstance()方法创建 RPC 动态代理的实例


RefectiveFeign 的 newInstance 方法:


  @Override  public <T> T newInstance(Target<T> target) {    Map<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target);    Map<Method, MethodHandler> methodToHandler = new LinkedHashMap<Method, MethodHandler>();    List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList<DefaultMethodHandler>();
for (Method method : target.type().getMethods()) { if (method.getDeclaringClass() == Object.class) { continue; } else if(Util.isDefault(method)) { DefaultMethodHandler handler = new DefaultMethodHandler(method); defaultMethodHandlers.add(handler); methodToHandler.put(method, handler); } else { methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method))); } } InvocationHandler handler = factory.create(target, methodToHandler); T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class<?>[]{target.type()}, handler);
for(DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers) { defaultMethodHandler.bindTo(proxy); } return proxy; }
复制代码


  1. 解析远程接口的方法,每个方法创建一个 MethodHandler 方法处理器,nameToHandler 的 key 是方法名,value 是方法对应的 MethodHandler

  2. 创建 methodToHandler,key 是 method,value 是方法对应的 MethodHandler

  3. 创建调用处理器 InvocationHandler

  4. 通过调用 Proxy.newProxyInstance()创建一个动态代理实例

方法解析器的创建

方法解析器的创建通过 SynchronousMethodHandler 的 create 方法完成的,在此之前需要通过 Contract 调用 parseAndValidatateMetadata 方法返回方法元数据列表,默认 Contract 是用的 Spring MVC 的 SpringMvcContract


public MethodHandler create(Target<?> target, MethodMetadata md,                                RequestTemplate.Factory buildTemplateFromArgs,                                Options options, Decoder decoder, ErrorDecoder errorDecoder) {      return new SynchronousMethodHandler(target, client, retryer, requestInterceptors, logger,                                          logLevel, md, buildTemplateFromArgs, options, decoder,                                          errorDecoder, decode404, closeAfterDecode);    }
复制代码

调用处理器的创建

调用处理器的创建是通过 InvocationHandlerFactory 的 create 方法,默认类是通过 Default 的 create 方法创建,也就是创建 FeignInvocationHandler 的实例。


static final class Default implements InvocationHandlerFactory {
@Override public InvocationHandler create(Target target, Map<Method, MethodHandler> dispatch) { return new ReflectiveFeign.FeignInvocationHandler(target, dispatch); } }
复制代码

总结

这篇文章主要对 RefectiveFeign 的 newInstance()方法进行分析,newInstance()方法主要是创建 RPC 动态代理的实例,过程是先进行方法解析,针对每一个方法创建对应的方法处理器,然后创建调用处理器 InvocationHandler,用到的类是默认是 FeignInvocationHandler,然后通过 java 的 JDK 的 Proxy.newProxyInstance 方法来创建出一个动态的代理对象。协议解析类 Contract 调用的是 springMVC 的 SpringMvcContract 协议规则解析类,使用 SpringMvcContract 协议规则解析类对于开发人员来说不需要重新进行学习,降低了开发成本和维护程度,远程调用 RPC 的方法注解和服务端提供的方法注解保持一致。虽然 feign 有自己的默认协议规则,但是没有使用。

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

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

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

评论

发布
暂无评论
RefectiveFeign_10月月更_周杰伦本人_InfoQ写作社区