? ? ? ? 【微服務(wù)>>>遠(yuǎn)程請求】
? ? ? ? 一茶没、簡介
? ? ? ? Feign是一種聲明式、模板化的HTTP客戶端,可以做到使用HTTP請求遠(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請求和響應(yīng)的壓縮乃摹。
? ? ? ? 三禁漓、工作原理
? ? ? ? 1? 在應(yīng)用程序開發(fā)階段,我們在啟動類上添加 @EnableFeignClients 注解來開啟對Feign Client的掃描和加載孵睬,然后根據(jù)Feign Client的開發(fā)規(guī)范播歼,定義Feign接口,并在接口上添加 @FeignClients 注解掰读;
? ? ? ? 2? 當(dāng)程序啟動時秘狞,會根據(jù)配置進(jìn)行包掃描叭莫,掃描所有 @FeignClients 的接口類,然后將掃描到的類信息注入Spring IOC 容器中烁试。當(dāng)Feign接口中的方法被調(diào)用時雇初,通過JDK的代理的方式,來生成具體的RequestTemplate廓潜。當(dāng)生成代理時抵皱,F(xiàn)eign會為每個接口方法創(chuàng)建一個RestTemplate對象,該對象封裝了HTTP請求需要的全部信息辩蛋,如請求參數(shù)名呻畸、請求方法等信息都是在這個過程中確定的;
? ? ? ? 3? 然后由RequestTemplate生成Request對象悼院,然后把Request教給Client處理伤为,這里的Client可以使JDK原生的URLConnection(默認(rèn)的HttpClient)、Apache的Http Client或者Okhttp据途,最后Client被封裝到LoadBalanceClient類绞愚,這個類結(jié)合Ribbon負(fù)載均衡進(jìn)行服務(wù)請求。
? ? ? ? 四颖医、基礎(chǔ)功能
? ? ? ? Feign注解的常用屬性如下:
? ? ? ? 1? name:指定FeignClient的名稱位衩,如果項(xiàng)目使用了Ribbon,name屬性會作為微服務(wù)的名稱熔萧,用于服務(wù)發(fā)現(xiàn)糖驴;
? ? ? ? 2? url:一般用于調(diào)試,可以手動指定 @FeignClient 的調(diào)用地址佛致;
? ? ? ? 3? decode404:發(fā)生404錯誤贮缕,如果該屬性為true,則調(diào)用decode進(jìn)行解碼俺榆,否則拋出FeignException感昼;
? ? ? ? 4? configuration:Feign的配置類,可以自定義Feign的Encoder罐脊、Decoder定嗓、LogLevel、Contract萍桌;
? ? ? ? 5? fallback:定義容錯的處理類蜕乡,當(dāng)調(diào)用遠(yuǎn)程接口出現(xiàn)失敗或超時的情況,會調(diào)用對應(yīng)接口的容錯邏輯梗夸,fallback指定的類必須實(shí)現(xiàn) @FeignClient 標(biāo)記的接口层玲;
? ? ? ? 6? fallbackFactory:工廠類,用于生成fallback類示例,實(shí)現(xiàn)每個接口通用的容錯邏輯辛块;
? ? ? ? 7? path:定義當(dāng)前FeignClient的統(tǒng)一前綴畔派。
? ? ? ? 五、特別注意
? ? ? ? Feign的調(diào)用分兩層润绵,即Ribbon的調(diào)用和Hystrix的調(diào)用线椰,高版本的Hystrix默認(rèn)是關(guān)閉的。
? ? ? ? 注意Ribbon超時 和 Hystrix超時尘盼,每種超時都有相關(guān)配置來解決憨愉。
? ? ? ? 當(dāng)Feign和Ribbon整合了Hystrix之后,可能會出現(xiàn)首次請求失敗的情況卿捎,造成這種情況的原因是Hystrix默認(rèn)的超時時間是1秒配紫,F(xiàn)eign首次請求會比較慢,所以容易出現(xiàn)這個問題午阵。解決該問題的方法有三種:
? ? ? ? 1? 將Hystrix的超時時間延長至5秒躺孝;
? ? ? ? 2? 禁用Hystrix的超時時間;
? ? ? ? 3? 關(guān)閉Hystrix(路子太野底桂,不建議使用)植袍。
? ? ? ? 六、簡單總結(jié)
? ? ? ? Feign就是Spring Cloud體系中用來處理遠(yuǎn)程服務(wù)請求的組件籽懦,并且整合了負(fù)載均衡于个,讓請求更簡單。