一、使用方式
@FeignClient(value = "service-hi",configuration = FeignConfig.class)
public interface SchedualServiceHi {
@GetMapping(value = "/hi")
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
二、原理解析
1、首先通过@EnableFeignCleints注解开启FeignCleint
2、添加@FeignCleint注解,FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar.registerDefaultConfiguration 扫描所有的@ FeignCleint的注解的类,生成代理工厂类FeignClientFactoryBean,其getObject方法如下:
![](https://img.haomeiwen.com/i4324831/ff73ecf2e8fded9b.png)
最终代理为 261行 HardCodedTarget。
3、spring doCreateBean时,调用getObject方法,Feign.builder 中client更新为LoadBalancerFeignClient,Targeter 此处可忽略,后续Hystrix有用。
最终调用Feign的build方法生成ReflectiveFeign,并调用其newInstance方法,生成代理类。
![](https://img.haomeiwen.com/i4324831/2e8c7ada63bba651.png)
![](https://img.haomeiwen.com/i4324831/75e5aa5725fef82d.png)
newInstance主要是生成 Map<Method, MethodHandler>的映射关系,MethodHandler实现类为SynchronousMethodHandler。
68行生成的代理对象为 ReflectiveFeign.FeignInvocationHandler
4、当接口的方法被调用,调用到FeignInvocationHandler.invoke接口,根据方法信息取出对应的SynchronousMethodHandler,调用其invoke
![](https://img.haomeiwen.com/i4324831/f1b3da925e99614d.png)
5、SynchronousMethodHandler.invoke,构建RequestTemplate,构建请求参数,然后3中的LoadBalancerFeignClient发起请求,后续为ribbon逻辑,基本结束。
lbClient:获取FeignLoadBalancer
executeWithLoadBalancer:负载、重试、response处理等逻辑
![](https://img.haomeiwen.com/i4324831/60980129407c7403.png)
网友评论