今天在写业务的时候,需要通过feign调用远程接口,平常只是调用就行了,没有了解到他是如何代码实现的,今天就使用debug来解开feign为什么可以远程调用的面纱。
希望看本文章的同学朋友们,可以自己写一个简单的远程调用方法跟着我一起走一遍debug
,自己走一遍debug
比过硬看文章十遍。
首先,我们在需要调用远程接口的地方,打上断点。
ReflectiveFeign.java
然后我们使用IDEA的step Into进入方法内部(不是hasStock方法)
首先我们会进入这个类里边ReflectiveFeign.java
并且,我们发现它继承抽象类feign
并且我们进入的invoke
方法是在一个名为FeignInvocationHandler
的静态内部类内,这个类实现接口InvocationHandler
此时我们把目光放在invoke
方法上边
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);
}
他会判断我们是否调用的是equals
、hashCode
还是toString
方法,如果是的话,会进行不同的逻辑处理,以上代码都有,我相信看本文章的朋友们都会很轻松的看出他所做的逻辑处理,我就在此不做赘述。
接下来的dispatch.get(method).invoke(args)
才是我们今天的重头戏,那我们直接进入invoke
方法,看看他里边都做了什么事情吧~
SynchronousMethodHandler
我们会进入到SynchronousMethodHandler.java
里,它实现MethodHandler
本文不多关注这些内容,重要的是我们进入到的invoke
方法
public Object invoke(Object[] argv) throws Throwable {
RequestTemplate template = buildTemplateFromArgs.create(argv)