一、使用方式
@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實(shí)現(xiàn)了ImportBeanDefinitionRegistrar.registerDefaultConfiguration 掃描所有的@ FeignCleint的注解的類,生成代理工廠類FeignClientFactoryBean,其getObject方法如下:

最終代理為 261行 HardCodedTarget。
3、spring doCreateBean時(shí),調(diào)用getObject方法,F(xiàn)eign.builder 中client更新為LoadBalancerFeignClient,Targeter 此處可忽略,后續(xù)Hystrix有用。
最終調(diào)用Feign的build方法生成ReflectiveFeign,并調(diào)用其newInstance方法,生成代理類。


newInstance主要是生成 Map<Method, MethodHandler>的映射關(guān)系,MethodHandler實(shí)現(xiàn)類為SynchronousMethodHandler。
68行生成的代理對象為?ReflectiveFeign.FeignInvocationHandler
4、當(dāng)接口的方法被調(diào)用,調(diào)用到FeignInvocationHandler.invoke接口,根據(jù)方法信息取出對應(yīng)的SynchronousMethodHandler,調(diào)用其invoke

5、SynchronousMethodHandler.invoke,構(gòu)建RequestTemplate,構(gòu)建請求參數(shù),然后3中的LoadBalancerFeignClient發(fā)起請求,后續(xù)為ribbon邏輯,基本結(jié)束。
lbClient:獲取FeignLoadBalancer
executeWithLoadBalancer:負(fù)載、重試、response處理等邏輯
