又是美好的一天呀~
个人博客地址: huanghong.top
服务调用源码分析
FeignClient实例为动态代理创建的对象,当进行服务调用FeignClient的接口方法就会被FeignInvocationHandler的invoke方法拦截。
//feign.ReflectiveFeign.FeignInvocationHandler#invoke
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//equals、hashCode、toString方法调用的处理
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();
}
//根据调用方法名获取对应MethodHandler来执行请求
return dispatch.get(method).invoke(args);
}
invoke
//feign.SynchronousMethodHandler#invoke
public Object invoke(Object[] argv) throws Throwable {
//根据方法入参及接口方法对应处理器属性构建一个Http请求模版
RequestTemplate template = buildTemplateFromArgs.create(argv);
//获取请求相关超时参数
Options options =