Feign簡介
Feign是一個http請求調用的輕量級框架,可以以Java接口注解的方式調用Http請求,幫助我們更加便捷、優雅地調用HTTP API。Feign其靈感來自Retrofit、JAXRS-2.0以及WebSocket。通過處理注解,將請求模板化,底層實際還是Ribbon,只是通過動態代理做了一次封裝。
Ribbon與Feign的區別
Ribbon和Feign都是用於調用其他服務的,不過方式不同。
1.啟動類使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。
2.服務的指定位置不同,Ribbon是在@RibbonClient注解上聲明,Feign則是在定義抽象方法的接口中使用@FeignClient聲明。
3.調用方式不同,Ribbon需要自己構建http請求,模擬http請求然后使用RestTemplate發送給其他服務,步驟相當繁瑣。Feign則是在Ribbon的基礎上進行了一次改進,采用接口的方式,將需要調用的其他服務的方法定義成抽象方法即可,不需要自己構建http請求。不過要注意的是抽象方法的注解、方法簽名要和提供服務的方法完全一致。
Feign入門
<!--1. 配置pom文件,引入在引入spring-cloud-starter-openfeign包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!- 2. 編寫調用接口 備注:name指定微服務的名稱, path是指定服務消費者的調用前綴 -> @FeignClient(name = "ms-provider-order", path = "/order") public interface MsCustomFeignOrderApi { @RequestMapping("/queryOrdersByUserId/{userId}") List<OrderVo> queryOrdersByUserId(@PathVariable("userId") String userId); @RequestMapping("/getRegisterInfo") String getRegisterInfo(); } <!- 3. 在主啟動類上加入注解@EnableFeignClients注解 --> @SpringBootApplication @EnableFeignClients public class FeignApplication { public static void main(String[] args) { SpringApplication.run(FeignApplication.class, args); } }
備注:如果沒有加入@EnableFeignClients,在調用過程中會報Class has no fields的錯誤;
Feign 的日志級別
Feign有四種日志級別,適應不通的環境:
1、NONE:不記錄任何日志(默認值),性能最佳,適用於生產。
2、HEADERS:記錄BASIC級別的基礎上,記錄請求和響應的header。
3、FULL:記錄請求和響應的header、body和元數據。適用於開發及測試環境定位問題。
4、BASIC:僅記錄請求方法、URL、響應狀態代碼以及執行時間。適用於生產環境追蹤問題。
屬於文件配置: feign.client.config.服務名(FeignClient的Name屬性).loggerLevel=full 通過代碼配置: public class FeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.BASIC; } }
備注:FeignConfig類,建議不要添加@Configuration注解,否則該配置將會被所有Feign Client共享,無法實現細粒度配置。如果一定要加@Configuration注解,就不要讓主應用程序上下文@ComponentScan掃描到。