Feign簡介
Feign是Netflix開源的聲明式HTTP客戶端。Feign致力于讓編寫HTTP Client更加簡單。 Feign也是通過Ribbon實現(xiàn)負(fù)載均衡的。
Feign的組成
| 接口 | 作用 | 默認(rèn)值 |
|---|---|---|
| Feign.Builder | Feign的入口 | Feign.Builder |
| Client | Feign底層用什么去請求 | 和Ribbon配合時:LoadBalancerFeignClient 不和Ribbon配合時:Fgien.Client.Default |
| Contract | 契約,注解支持 | SpringMVCContract |
| Encoder | 解碼器,用于將獨享轉(zhuǎn)換成HTTP請求消息體 | SpringEncoder |
| Decoder | 編碼器,將相應(yīng)消息體轉(zhuǎn)成對象 | ResponseEntityDecoder |
| Logger | 日志管理器 | Slf4jLogger |
| RequestInterceptor | 用于為每個請求添加通用邏輯(攔截器,例子:比如想給每個請求都帶上heared) | 無 |
Feign的日志級別
| 日志級別 | 打印內(nèi)容 |
|---|---|
| NONE(默認(rèn)) | 不記錄任何日志 |
| BASIC | 僅記錄請求方法,URL,響應(yīng)狀態(tài)代碼以及執(zhí)行時間(適合生產(chǎn)環(huán)境) |
| HEADERS | 記錄BASIC級別的基礎(chǔ)上,記錄請求和響應(yīng)的header |
| FULL | 記錄請求和響應(yīng)header,body和元數(shù)據(jù) |
如何整合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客戶端的功能;然后又創(chuàng)建一個Feign的客戶端接口定義。使用@FeignClient注釋來指定這個接口所要調(diào)用的服務(wù)名稱,接口中定義的各個函數(shù)使用SpringMVC的注釋就可以來綁定服務(wù)提供方的REST接口。最后在Controller中,注入Client接口的實現(xiàn),并調(diào)用hello方法來觸發(fā)對服務(wù)提供方的調(diào)用。
如何給Feign添加日志級別
細(xì)粒度
方式一:代碼實現(xiàn)
第一步:添加Feign配置類,可以添加在主類下,但是不用添加@Configuration。如果添加了@Configuration而且又放在了主類之下,那么就會所有Feign客戶端實例共享,同Ribbon配置類一樣父子上下文加載沖突;如果一定添加@Configuration,就放在主類加載之外的包。
(建議還是不用加@Configuration)
public class FeignConfig {
@Bean
public Logger.Level Logger() {
return Logger.Level.FULL;
}
}
第二步:給@FeignClient添加配置類
//@FeignClient configuration = GoodsFeignConfig.class 細(xì)粒度配置,指定配置類
@FeignClient(name = "alibaba-nacos-discovery-server",configuration = FeignConfig.class)
public interface NacosDiscoveryClientFeign {
@GetMapping("/hello")
String hello(@RequestParam(name = "name") String name);
}
方式二:配置文件實現(xiàn)
feign:
client:
config:
#想要調(diào)用的微服務(wù)名稱
server-1:
loggerLevel: FULL
全局配置
方式一:代碼實現(xiàn)
//在啟動類上為@EnableFeignClients注解添加defaultConfiguration配置
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
方式二:配置文件屬性實現(xiàn)
feign:
client:
config:
#將調(diào)用的微服務(wù)名稱改成default就配置成全局的了
default:
loggerLevel: FULL
Feign支持的配置項
代碼方式支持配置項
| 配置項 | 作用 |
|---|---|
| Logger.Level | 指定日志級別 |
| Retryer | 指定重試策略 |
| ErrorDecoder | 指定錯誤解碼器 |
| Request.Options | 超時時間 |
| Collection<RequestInterceptor> | 攔截器 |
| SetterFactory | 用于設(shè)置Hystrix的配置屬性,F(xiàn)gien整合Hystrix才會用 |
配置文件屬性支持配置項
feign:
client:
config:
feignName:
connectTimeout: 5000 # 相當(dāng)于Request.Optionsn 連接超時時間
readTimeout: 5000 # 相當(dāng)于Request.Options 讀取超時時間
loggerLevel: full # 配置Feign的日志級別,相當(dāng)于代碼配置方式中的Logger
errorDecoder: com.example.SimpleErrorDecoder # Feign的錯誤解碼器,相當(dāng)于代碼配置方式中的ErrorDecoder
retryer: com.example.SimpleRetryer # 配置重試,相當(dāng)于代碼配置方式中的Retryer
requestInterceptors: # 配置攔截器,相當(dāng)于代碼配置方式中的RequestInterceptor
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否對404錯誤解碼
decode404: false
encode: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract
Feign還支持對請求和響應(yīng)進(jìn)行GZIP壓縮,以提高通信效率,配置方式如下:
# 配置請求GZIP壓縮
feign.compression.request.enabled=true
# 配置響應(yīng)GZIP壓縮
feign.compression.response.enabled=true
# 配置壓縮支持的MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 配置壓縮數(shù)據(jù)大小的下限
feign.compression.request.min-request-size=2048
優(yōu)先級:細(xì)粒度屬性配置 > 細(xì)粒度代碼配置 > 全局屬性配置 > 全局代碼配置