色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Cloud Feign原理詳解

瀏覽:3日期:2023-07-12 11:02:55
目錄Feign的大體機(jī)制@EnableFeignClients 和 @FeignClient 注解registerDefaultConfiguration方法registerFeignClients方法feign客戶端的動態(tài)代理

Feign 主要是幫助我們方便進(jìn)行rest api服務(wù)間的調(diào)用,其大體實(shí)現(xiàn)思路就我們通過標(biāo)記注解在一個接口類上(注解上將包含要調(diào)用的接口信息),之后在調(diào)用時根據(jù)注解信息組裝好請求信息,接下來基于ribbon這些負(fù)載均衡器來生成真實(shí)的服務(wù)地址,最后將請求發(fā)送出去;之后將接收到的結(jié)果反序列化為相關(guān)的Java對象供我們直接使用。 下面我們走進(jìn)Spring Cloud對feign封裝的源碼中去了解其主要實(shí)現(xiàn)機(jī)制。

Feign的大體機(jī)制

通過在啟動類上標(biāo)記 @EnableFeignClients 注解來開啟feign的功能,服務(wù)啟動后會掃描 @FeignClient 注解標(biāo)記的接口,然后根據(jù)掃描的注解信息為每個接口類生成feign客戶端請求,同時解析接口方法中的Spring MVC的相關(guān)注解,通過專門的注解解析器識別這些注解信息,以便后面可以正確的組裝請求參數(shù),使用 Ribbon 和 Eureka 獲取到請求服務(wù)的真實(shí)地址等信息,最后使用 http 相關(guān)組件進(jìn)行執(zhí)行調(diào)用。其大致流程圖如下:

Spring Cloud Feign原理詳解

@EnableFeignClients 和 @FeignClient 注解

在EnableFeignClients 注解類中有一個 @Import(FeignClientsRegistrar.class)的配置

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented// 引入FeignClientsRegistrar 來掃描@FeignClient注解下的類@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients { ...}

我們追蹤代碼進(jìn)入到FeignClientsRegistrar類中,會發(fā)現(xiàn)FeignClientsRegistrar 類實(shí)現(xiàn)了ImportBeanDefinitionRegistrar(在spring context 項目中)接口,因此spring boot啟動時會調(diào)用它的registerBeanDefinitions()方法,該方法中會掃描 EnableFeignClients 和 FeignClient 注解信息并設(shè)置相關(guān)信息。

/** * spring boot 啟動時會自動調(diào)用 ImportBeanDefinitionRegistrar 入口方法 */@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { // 讀取 @EnableFeignClients 注解中信息 registerDefaultConfiguration(metadata, registry); // 掃描所有@FeignClient注解的類 registerFeignClients(metadata, registry);}registerDefaultConfiguration方法

在registerDefaultConfiguration()方法中會讀取@EnableFeignClients注解信息,然后將這些信息注冊到一個 BeanDefinitionRegistry 里面去;之后feign的一些默認(rèn)配置將通過這里注冊的信息中取獲取。

registerFeignClients方法 registerFeignClients()方法會掃描相關(guān)包路徑(如果EnableFeignClients的basePackages沒有配置,默認(rèn)會直接使用啟動類所在的包路徑)下所有的@FeiginClient注解的類 然后根據(jù)@FeiginClient注解信息向BeanDefinitionRegistry里面注冊bean,注意這里設(shè)置的bean名稱生成規(guī)則是使用服務(wù)名+FeignClientSpecification.class.getSimpleName(),因此如果對一個服務(wù)寫多個接口類會發(fā)生bean名稱重復(fù)導(dǎo)致注冊失敗。所以需要增加一個 allow-bean-definition-overriding: true 的配置。 最后會調(diào)用 registerFeignClient() 方法注冊feign客戶端,這里的bean名稱的為當(dāng)前接口類的類路徑。

其流程圖如下:

Spring Cloud Feign原理詳解

feign客戶端的動態(tài)代理

上面registerFeignClient()方法中在構(gòu)建bean的時候,實(shí)際構(gòu)建的是FeignClientFactoryBean。

BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);

FeignClientFactoryBean 類對父類的getObject()方法進(jìn)行了重寫,后面動態(tài)代理時使用的就是它來獲取feign client的。在這里會根據(jù)上面注解配置,同時會讀取application.yml配置信息,根據(jù)配置來設(shè)置feign的相關(guān)信息,比如編解碼器、注解解析器、請求超時時間等;之后如果沒有設(shè)置url那么就會和負(fù)載均衡器(ribbon)整合。最后會通過反射將接口中相關(guān)方法進(jìn)行解析保存供后面進(jìn)行jdk代理使用。

@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 判斷是否是不需要代理的 if ('equals'.equals(method.getName())) { try { Object otherHandler = args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null; return equals(otherHandler); } catch (IllegalArgumentException e) { return false; } } else if ('hashCode'.equals(method.getName())) { return hashCode(); } else if ('toString'.equals(method.getName())) { return toString(); } // 需要代理,執(zhí)行代理方法 return dispatch.get(method).invoke(args);}

Spring Cloud Feign原理詳解

以上就是Spring Cloud Feign原理詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring Cloud Feign原理的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲另类激情综合偷自拍 | 国产在线观看免费人成小说 | 国产xvideos国产在线 | 精品视频在线观看 | 欧美笫一页| 毛片手机在线视频免费观看 | 京野结衣免费一区二区 | 免费国产黄网站在线观看视频 | 国产在线观看91精品一区 | 91av综合 | 在线观看日本www | 亚洲综合区| 亚洲精品99久久久久久 | 三级视频在线观看 | 欧美日本高清 | 国产黄页 | 欧美一级看片a免费观看 | 精品久久久久久久九九九精品 | 欧美手机看片 | 午夜影院福利社 | 精品久久久日韩精品成人 | 免费一区二区三区 | 欧美日韩亚洲另类 | 波多野结衣aⅴ在线 | 国产八区 | 国产在线精品观看 | 久久精品国产半推半就 | 久9这里精品免费视频 | 女人被男人桶 | 欧美成人伊人十综合色 | 一区二区三区四区在线视频 | 在线 | 一区二区三区四区 | 特别福利视频在线观看 | 久草在线视频免费看 | 欧美91精品久久久久网免费 | 欧美精品亚洲精品日韩专区 | 亚洲高清免费观看 | 亚洲第一免费网站 | 免费人成年短视频在线观看免费网站 | 成人黄色免费观看 | 日韩在线视频中文字幕 |