Spring Cloud Alibaba之聲明式HTTP客戶端 – Feign(四)
- 2019 年 11 月 3 日
- 筆記
Feign簡介
Feign是Netflix開源的聲明式HTTP客戶端。Feign致力於讓編寫HTTP Client更加簡單。 Feign也是通過Ribbon實現負載均衡的
。
Feign的組成
介面 |
作用 |
默認值 |
---|---|---|
Feign.Builder |
Feign的入口 |
Feign.Builder |
Client |
Feign底層用什麼去請求 |
和Ribbon配合時:LoadBalancerFeignClient不和Ribbon配合時:Fgien.Client.Default |
Contract |
契約,註解支援 |
SpringMVCContract |
Encoder |
解碼器,用於將獨享轉換成HTTP請求消息體 |
SpringEncoder |
Decoder |
編碼器,將相應消息體轉成對象 |
ResponseEntityDecoder |
Logger |
日誌管理器 |
Slf4jLogger |
RequestInterceptor |
用於為每個請求添加通用邏輯(攔截器,例子:比如想給每個請求都帶上heared) |
無 |
Feign的日誌級別
日誌級別 |
列印內容 |
---|---|
NONE(默認) |
不記錄任何日誌 |
BASIC |
僅記錄請求方法,URL,響應狀態程式碼以及執行時間(適合生產環境) |
HEADERS |
記錄BASIC級別的基礎上,記錄請求和響應的header |
FULL |
記錄請求和響應header,body和元數據 |
如何整合Feign
第一步: 在pom.xml中引入openfeign的依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
第二步: 啟動類添加開啟Feign註解
@EnableFeignClients
第三步:編寫Feign客戶端
@FeignClient("alibaba-nacos-discovery-server") public interface NacosDiscoveryClientFeign { @GetMapping("/hello") String hello(@RequestParam(name = "name") String name); }
測試
@Slf4j @RestController public class TestController { @Autowired private NacosDiscoveryClientFeign nacosDiscoveryClientFeign; @GetMapping("/test") public String test() { String result = nacosDiscoveryClientFeign.hello("wolf"); return "Return : " + result; } }
這裡主要先通過 @EnableFeignClients註解開啟掃描Spring Cloud Feign客戶端的功能;然後又創建一個Feign的客戶端介面定義。使用@FeignClient注釋來指定這個介面所要調用的服務名稱,介面中定義的各個函數使用SpringMVC的注釋就可以來綁定服務提供方的REST介面。最後在Controller中,注入Client介面的實現,並調用hello方法來觸發對服務提供方的調用。
如何給Feign添加日誌級別
- 細粒度 方式一:程式碼實現 第一步:添加Feign配置類,可以添加在主類下,但是不用添加
@Configuration
。如果添加了@Configuration
而且又放在了主類之下,那麼就會所有Feign客戶端實例共享,同Ribbon配置類一樣父子上下文載入衝突;如果一定添加@Configuration
,就放在主類載入之外的包
。 (建議還是不用加@Configuration
) public class FeignConfig { @Bean public Logger.Level Logger() { return Logger.Level.FULL; } } 第二步:給@FeignClient
添加配置類 //@FeignClient configuration = GoodsFeignConfig.class 細粒度配置,指定配置類 @FeignClient(name = "alibaba-nacos-discovery-server",configuration = FeignConfig.class) public interface NacosDiscoveryClientFeign { @GetMapping("/hello") String hello(@RequestParam(name = "name") String name); } 方式二:配置文件實現 feign: client: config: #想要調用的微服務名稱 server-1: loggerLevel: FULL - 全局配置
方式一:程式碼實現
//在啟動類上為@EnableFeignClients註解添加defaultConfiguration配置 @EnableFeignClients(defaultConfiguration = FeignConfig.class)
方式二:配置文件屬性實現
feign: client: config: #將調用的微服務名稱改成default就配置成全局的了 default: loggerLevel: FULL
Feign支援的配置項
- 程式碼方式支援配置項
配置項 |
作用 |
---|---|
Logger.Level |
指定日誌級別 |
Retryer |
指定重試策略 |
ErrorDecoder |
指定錯誤解碼器 |
Request.Options |
超時時間 |
Collection<RequestInterceptor> |
攔截器 |
SetterFactory |
用於設置Hystrix的配置屬性,Fgien整合Hystrix才會用 |
- 配置文件屬性支援配置項
feign: client: config: feignName: connectTimeout: 5000 # 相當於Request.Optionsn 連接超時時間 readTimeout: 5000 # 相當於Request.Options 讀取超時時間 loggerLevel: full # 配置Feign的日誌級別,相當於程式碼配置方式中的Logger errorDecoder: com.example.SimpleErrorDecoder # Feign的錯誤解碼器,相當於程式碼配置方式中的ErrorDecoder retryer: com.example.SimpleRetryer # 配置重試,相當於程式碼配置方式中的Retryer requestInterceptors: # 配置攔截器,相當於程式碼配置方式中的RequestInterceptor - com.example.FooRequestInterceptor - com.example.BarRequestInterceptor # 是否對404錯誤解碼 decode404: false encode: com.example.SimpleEncoder decoder: com.example.SimpleDecoder contract: com.example.SimpleContract
Feign還支援對請求和響應進行GZIP壓縮,以提高通訊效率,配置方式如下:
# 配置請求GZIP壓縮 feign.compression.request.enabled=true # 配置響應GZIP壓縮 feign.compression.response.enabled=true # 配置壓縮支援的MIME TYPE feign.compression.request.mime-types=text/xml,application/xml,application/json # 配置壓縮數據大小的下限 feign.compression.request.min-request-size=2048
優先順序:細粒度屬性配置 > 細粒度程式碼配置 > 全局屬性配置 > 全局程式碼配置