Feign介紹
Feign是Netflix公司開源的輕量級rest客戶端,使用Feign可以非常方便的實現Http 客戶端。Spring Cloud引入Feign並且集成了Ribbon實現客戶端負載均衡調用。
Feign工作原理如下:
1、 啟動類添加@EnableFeignClients注解,Spring會掃描標記了@FeignClient注解的接口,並生成此接口的代理對象
2、 @FeignClient(value = "XC_SERVICE_MANAGE_CMS")即指定了cms的服務名稱,Feign會從注冊中心獲取cms服務列表,並通過負載均衡算法進行服務調用。
3、在接口方法 中使用注解@GetMapping("/cms/page/get/{id}"),指定調用的url,Feign將根據url進行遠程調用。
-
主程序入口添加了@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負載均衡發器服務之間的調用。
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的統一前綴。
總到來說,Feign的源碼實現的過程如下:
首先通過@EnableFeignCleints注解開啟FeignCleint
根據Feign的規則實現接口,並加@FeignCleint注解
程序啟動后,會進行包掃描,掃描所有的@ FeignCleint的注解的類,並將這些信息注入到ioc容器中。
當接口的方法被調用,通過jdk的代理,來生成具體的RequesTemplate
RequesTemplate在生成Request
Request交給Client去處理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
最后Client被封裝到LoadBalanceClient類,這個類結合類Ribbon做到了負載均衡。