? ? ? ? 【微服務(wù)>>>遠(yuǎn)程請(qǐng)求】
? ? ? ? 一、簡(jiǎn)介
? ? ? ? Feign是一種聲明式、模板化的HTTP客戶端,可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù),就像調(diào)用本地方法一樣,但是本質(zhì)上還是遠(yuǎn)程服務(wù)(從分布式事務(wù)角度看)。
? ? ? ? 二、Feign的特性
? ? ? ? 1? 可插拔的注解支持,包括Feign注解和JAX-RS注解;
? ? ? ? 2? 支持可插拔的HTTP編碼器和解碼器;
? ? ? ? 3? 支持Hystrix和它的Fallback;
? ? ? ? 4? 支持Ribbon的負(fù)載均衡;
? ? ? ? 5? 支持HTTP請(qǐng)求和響應(yīng)的壓縮。
? ? ? ? 三、工作原理
? ? ? ? 1? 在應(yīng)用程序開(kāi)發(fā)階段,我們?cè)趩?dòng)類上添加 @EnableFeignClients 注解來(lái)開(kāi)啟對(duì)Feign Client的掃描和加載,然后根據(jù)Feign Client的開(kāi)發(fā)規(guī)范,定義Feign接口,并在接口上添加 @FeignClients 注解;
? ? ? ? 2? 當(dāng)程序啟動(dòng)時(shí),會(huì)根據(jù)配置進(jìn)行包掃描,掃描所有 @FeignClients 的接口類,然后將掃描到的類信息注入Spring IOC 容器中。當(dāng)Feign接口中的方法被調(diào)用時(shí),通過(guò)JDK的代理的方式,來(lái)生成具體的RequestTemplate。當(dāng)生成代理時(shí),F(xiàn)eign會(huì)為每個(gè)接口方法創(chuàng)建一個(gè)RestTemplate對(duì)象,該對(duì)象封裝了HTTP請(qǐng)求需要的全部信息,如請(qǐng)求參數(shù)名、請(qǐng)求方法等信息都是在這個(gè)過(guò)程中確定的;
? ? ? ? 3? 然后由RequestTemplate生成Request對(duì)象,然后把Request教給Client處理,這里的Client可以使JDK原生的URLConnection(默認(rèn)的HttpClient)、Apache的Http Client或者Okhttp,最后Client被封裝到LoadBalanceClient類,這個(gè)類結(jié)合Ribbon負(fù)載均衡進(jìn)行服務(wù)請(qǐng)求。
? ? ? ? 四、基礎(chǔ)功能
? ? ? ? Feign注解的常用屬性如下:
? ? ? ? 1? name:指定FeignClient的名稱,如果項(xiàng)目使用了Ribbon,name屬性會(huì)作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn);
? ? ? ? 2? url:一般用于調(diào)試,可以手動(dòng)指定 @FeignClient 的調(diào)用地址;
? ? ? ? 3? decode404:發(fā)生404錯(cuò)誤,如果該屬性為true,則調(diào)用decode進(jìn)行解碼,否則拋出FeignException;
? ? ? ? 4? configuration:Feign的配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract;
? ? ? ? 5? fallback:定義容錯(cuò)的處理類,當(dāng)調(diào)用遠(yuǎn)程接口出現(xiàn)失敗或超時(shí)的情況,會(huì)調(diào)用對(duì)應(yīng)接口的容錯(cuò)邏輯,fallback指定的類必須實(shí)現(xiàn) @FeignClient 標(biāo)記的接口;
? ? ? ? 6? fallbackFactory:工廠類,用于生成fallback類示例,實(shí)現(xiàn)每個(gè)接口通用的容錯(cuò)邏輯;
? ? ? ? 7? path:定義當(dāng)前FeignClient的統(tǒng)一前綴。
? ? ? ? 五、特別注意
? ? ? ? Feign的調(diào)用分兩層,即Ribbon的調(diào)用和Hystrix的調(diào)用,高版本的Hystrix默認(rèn)是關(guān)閉的。
? ? ? ? 注意Ribbon超時(shí) 和 Hystrix超時(shí),每種超時(shí)都有相關(guān)配置來(lái)解決。
? ? ? ? 當(dāng)Feign和Ribbon整合了Hystrix之后,可能會(huì)出現(xiàn)首次請(qǐng)求失敗的情況,造成這種情況的原因是Hystrix默認(rèn)的超時(shí)時(shí)間是1秒,F(xiàn)eign首次請(qǐng)求會(huì)比較慢,所以容易出現(xiàn)這個(gè)問(wèn)題。解決該問(wèn)題的方法有三種:
? ? ? ? 1? 將Hystrix的超時(shí)時(shí)間延長(zhǎng)至5秒;
? ? ? ? 2? 禁用Hystrix的超時(shí)時(shí)間;
? ? ? ? 3? 關(guān)閉Hystrix(路子太野,不建議使用)。
? ? ? ? 六、簡(jiǎn)單總結(jié)
? ? ? ? Feign就是Spring Cloud體系中用來(lái)處理遠(yuǎn)程服務(wù)請(qǐng)求的組件,并且整合了負(fù)載均衡,讓請(qǐng)求更簡(jiǎn)單。