feign

一、使用方式

@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處理等邏輯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容