Fegin-完整请求流程解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fegin-完整请求流程解析相关的知识,希望对你有一定的参考价值。
参考技术A 这一章说说基于Fegin的声明式调用请求是怎么个流程首先我们从构建流程中知道,大体上来说是基于JDK的动态代理机制实现的,那么在JDK的动态代理中,对方法进行增强的类就是InvocationHandler,核心方法就是invoke(),在Fegin中就是FeignInvocationHandler
我们看看这个类
真正执行的Method是解析好的SynchronousMethodHandler,args是请求的方法参数,从这里看出,真正执行的是构建的
SynchronousMethodHandler
进入SynchronousMethodHandler#invoke方法中
我们知道在targetToHandlersByName.apply(target)方法中将接口的注解参数使用SpringMvcContract解析生成MethodMetadata,其中就有template,在上面executeAndDecode方法,第一步是将实际的请求地址进行拼装,参数替换,最后形成的就像这样:
最后形成一个包含服务名的请求路径,是不是很眼熟,和我们在ribbon中传入的URL很像
这里方法嵌套的很多,没办法,只有一个个分析
上面excute()方的核心lbClient(clientName).executeWithLoadBalancer(ribbonRequest,
requestConfig).toResponse(),看第一个方法lbClient(clientName):
第一步是先去缓存中获取该服务对应的FeignLoadBalancer,如果没有进行创建,我们看看创建的流程
好了,lbClient(clientName)返回的是一个FeignLoadBalancer,接着执行它的executeWithLoadBalancer方法
首先这个Observable使用的是Java的rx包下面的组件,服务的选取采用selectServer,这个就是
采用Ribbon的服务选取进行的,上面那一大坨主要是对服务调用包装一些重试策略
具体的重试讲解,后续开文再说
这submit()方法,请求最终还是会回调call(Server server)方法
附上总流程图:
以上是关于Fegin-完整请求流程解析的主要内容,如果未能解决你的问题,请参考以下文章