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 {

}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Feign是一个声明式、模板化的HTTP客户端,用于简化基于HTTP的RESTful API的调用。而FeignClientFeign的一个重要组件,它在Spring Boot项目中,可以与@EnableFeignClients注解搭配使用,方便远程调用其他服务。 下面是一个简单的FeignClient的Demo: 首先,我们需要在pom文件中添加Feign的依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.7.RELEASE</version> </dependency> ``` 接下来,我们需要定义一个简单的接口,用于调用远程服务的API,例如: ``` @FeignClient(name = "demo-service") public interface DemoServiceClient { @GetMapping("/hello") String hello(); } ``` 在上面的代码中,@FeignClient注解用于定义服务名称,GetMapping注解用于定义服务的API接口。 然后,我们需要在代码中使用该接口,例如: ``` @Autowired private DemoServiceClient demoServiceClient; ``` 在上面的代码中,我们通过@Autowired注解将DemoServiceClient接口注入进来,这样就可以调用远程服务的API了。 以上就是一个简单的FeignClient的Demo。其流程如下:首先,我们定义一个接口,接口中定义了一个需要调用的远程服务的API;然后,使用@FeignClient注解将该接口标记为需要调用的远程服务;最后,在我们需要调用该服务的代码中,通过@Autowired注解将该接口注入进来,便可以直接调用远程服务的API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值