本文主要是介绍FeignClient-调用流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
调用流程
首先请求会被FeignInvocationHandler 进行拦截,然后dispatch找到应的方法进行调用。
MethodHandler我们看看:
在接口断点会进入下面这个类:
我们可以看到是通过RestTemplage实现的,并且里面有Retryer重试机制。然后方法走到executeAndDecode
在下面这个方法使用了拦截器:
那么拦截器从那里来呢?看是从配置里来的config里面配置拦截器。
好我们继续看拦截器以后的逻辑,可以看到通过Client调用了execute方法,Client的类型是LoadBalancerFeignClient。
那么为什么会是LoadBalancerFeignClient类型呢,是因为在创建对象的时候就是LoadBalancerFeignClient
好继续往下走看执行逻辑,可以看到使用了Ribbon,这也验证了Feign是基于Ribbon的:
然后我们继续看lbClient这个方法:
这个方法就是创建LoadBalancer并且将它缓存起来。
接着我们继续看:
继续跟踪会执行:
注意这个selectServer(),继续追综:
这块就非常的关键了ILoadBalancer,这个ILoadBalancer哪里来的呢?
我们可以看到ServerList这个时候就和Ncaos进行打通了,
这个时候调用的时候会根据负载均衡策略选择一台服务进行调用。但是这里有个疑问,Ribbon也有这个配置,那么是怎么做到使用了Nacos的实现呢?
然后我找源码找到了下面这个@RibbonClients(defaultConfiguration = NacosRibbonClientConfiguration.class)这里就指定了默认的NacosRibbonClientConfiguration实现是nacos的。
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnBean(SpringClientFactory.class)
@ConditionalOnRibbonNacos
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureAfter(RibbonAutoConfiguration.class)
@RibbonClients(defaultConfiguration = NacosRibbonClientConfiguration.class)
public class RibbonNacosAutoConfiguration {}
这篇关于FeignClient-调用流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!