Feign的工作原理以及Ribbon與Feign的區別

1.Feign是什麼?

Feign是一個聲明式的Web服務客戶端,使得編寫Web服務客戶端變得非常容易,
只需要創建一個接口,然後在上面添加註解即可

2.Feign能幹什麼

Feign旨在使編寫Java Http客戶端變得更容易。
前面在使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模版化的調用方法。但是在實際開發中,由於對服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用。所以,Feign在此基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務接口的定義。在Feign的實現下,我們只需創建一個接口並使用註解的方式來配置它(以前是Dao接口上面標註Mapper註解,現在是一個微服務接口上面標註一個Feign註解即可),即可完成對服務提供方的接口綁定,簡化了使用Spring cloud Ribbon時,自動封裝服務調用客戶端的開發量。

3.Feign集成了Ribbon

利用Ribbon維護了MicroServiceCloud-Dept的服務列表信息,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過feign只需要定義服務綁定接口且以聲明式的方法,優雅而簡單的實現了服務調用

4.Feign的工作原理

  • 主程序入口添加了@EnableFeignClients註解開啓對FeignClient掃描加載處理。根據Feign
    Client的開發規範,定義接口並加@FeignClientd註解。

  • 當程序啓動時,回進行包掃描,掃描所有@FeignClients的註解的類,並且講這些信息注入Spring IOC容器中,當定義的的Feign接口中的方法唄調用時,通過JDK的代理方式,來生成具體的RequestTemplate.當生成代理時,Feign會爲每個接口方法創建一個RequestTemplate。當生成代理時,Feign會爲每個接口方法創建一個RequestTemplate對象,改對象封裝可HTTP請求需要的全部信息,如請求參數名,請求方法等信息都是在這個過程中確定的。

  • 然後RequestTemplate生成Request,然後把Request交給Client去處理,這裏指的時Client可以時JDK原生的URLConnection,Apache的HttpClient,也可以時OKhttp,最後Client被封裝到LoadBalanceClient類,這個類結合Ribbon負載均衡發器服務之間的調用。

5.Feign註解剖析

  • @FeignClient註解主要被@Target({ElementType.TYPE})修飾,表示該註解主要使用在接口上。它具備瞭如下的屬性:

  • name:指定FeignClient的名稱,如果使用了Ribbon,name就作爲微服務的名稱,用於服務發現。

  • url:url一般用於調試,可以指定@FeignClient調用的地址。

  • decode404: 當發生404錯誤時,如果該字段爲true,會調用decoder進行解碼,否則拋出FeignException.

  • configuration:Feign配置類,可以自定或者配置Feign的Encoder,Decoder,LogLevel,Contract。

  • fallback:定義容錯的處理類,當調用遠程接口失敗或者超時時,會調用對應的接口的容錯邏輯,fallback指定的類必須實現@Feign標記的接口。

  • fallbacjFactory:工廠類,用於生成fallback類實例,通過這個屬性可以實現每個接口通用的容錯邏輯們介紹重複的代碼。

  • path:定義當前FeignClient的統一前綴。

6.Feign的作用

  • Feign 採用的是基於接口的註解

  • Feign 整合了ribbon,具有負載均衡的能力

  • 整合了Hystrix,具有熔斷的能力

7. Ribbon與Feign的區別是什麼?

Ribbon添加maven依賴 spring-starter-ribbon 使用@RibbonClient(value=“服務名稱”) 使用RestTemplate調用遠程服務對應的方法

    feign添加maven依賴 spring-starter-feign 服務提供方提供對外接口 調用方使用 在接口上使用@FeignClient("指定服務名")

    Ribbon和Feign的區別:

    Ribbon和Feign都是用於調用其他服務的,不過方式不同。

    1.啓動類使用的註解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。

    2.服務的指定位置不同,Ribbon是在@RibbonClient註解上聲明,Feign則是在定義抽象方法的接口中使用@FeignClient聲明。

    3.調用方式不同,Ribbon需要自己構建http請求,模擬http請求然後使用RestTemplate發送給其他服務,步驟相當繁瑣。

    Feign則是在Ribbon的基礎上進行了一次改進,採用接口的方式,將需要調用的其他服務的方法定義成抽象方法即可,

    不需要自己構建http請求。不過要注意的是抽象方法的註解、方法簽名要和提供服務的方法完全一致。

8.Feign具有以下一些重要特性:

  • 整合了Hystrix,支持fallback容錯降級
  • 整合了Ribbon,直接請求的負載均衡
  • 支持HTTP請求和響應的壓縮
  • 使用OkHttp替換原生URLConnection,提高效率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章