SpringCloud中的Feign詳解
一、簡介:
Feign是一個聲明式的Web Service客戶端,以Java接口注解的方式調(diào)用Http請求。同時Feign整合了Ribbon和Hystrix,實現(xiàn)負(fù)載均衡與容斷功能。
1. Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP編碼器和解碼器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的負(fù)載均衡;
- 支持HTTP請求和響應(yīng)的壓縮
- feign不支持GET請求直接傳遞POJO對象的.
2.@FeignClient注解說明
@FeignClient:是Spring識別OpenFeign客戶端的注釋,OpenFign客戶端必須是接口。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
//1.Ribbon負(fù)載均衡器的Feign客戶端的名稱
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
//不使用ribbon時,請求url
String url() default "";
//配置響應(yīng)狀態(tài)碼為404時是否應(yīng)該拋出FeignExceptions
boolean decode404() default false;
//用于記錄,攔截器等額外配置.
Class<?>[] configuration() default {};
//如果啟用了Hystrix,則可以實現(xiàn)回退方法
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
//自動給所有方法的requestMapping前加上前綴
String path() default "";
boolean primary() default true;
}@FeignClient(value = "common-wx", url = "www.baidu.com/common-wx")
- value/name:是將用于創(chuàng)建Ribbon負(fù)載均衡器的Feign客戶端的名稱.
- url: 當(dāng)您不使用Ribbon時,您還可以使用url屬性將客戶端指向目標(biāo)應(yīng)用程序。
- fallback:如果啟用了Hystrix,則可以實現(xiàn)回退方法.(底層依賴hystrix,啟動類要加上@EnableHystrix)
- configuration:用于記錄,攔截器等額外配置.
- path: 自動給所有方法的requestMapping前加上前綴,類似與controller類上的requestMapping
- decode404:配置響應(yīng)狀態(tài)碼為404時是否應(yīng)該拋出FeignExceptions。(默認(rèn)false)
3. HTTP客戶端
OpenFeign的默認(rèn)HTTP客戶端HttpUrlConnection用于執(zhí)行其HTTP請求。您可以配置其他客戶端(ApacheHttpClient,OkHttpClient)
(1)使用OKhttp發(fā)送request
Feign底層默認(rèn)是使用jdk中的HttpURLConnection發(fā)送HTTP請求,feign也提供了OKhttp來發(fā)送請求,具體配置如下:
//作用在所有Feign Client上的配置.
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
okhttp:
enabled: true
hystrix:
enabled: true4.構(gòu)建器(啟用feign客戶端)
構(gòu)建器是讓我們創(chuàng)建一個客戶端bean并返回一個Feign構(gòu)建器。生成方式有二種:
(1) 基于面向接口的動態(tài)代理方式生成實現(xiàn)類。使用Feign.builder()操作類實現(xiàn)。
(2) 使用注解@EnableFeignClients啟用feign客戶端.(需要結(jié)合使用注解@FeignClient 定義一起使用)
注解@EnableFeignClients:掃描和注冊feign客戶端bean定義。 注解@EnableFeignClients用于告訴框架掃描所有通過注解@FeignClient定義的feign客戶端。
//1.生成Bean
@Bean
AuthClient authClient() {
return Feign.builder()
.client(new ApacheHttpClient())//重新使用HttpClient
.target(AuthClient.class, baseServerUrl);
}
//2.注解方式生成Bean(需要使用注解@FeignClient 定義結(jié)合)
@EnableFeignClients(
defaultConfiguration = DefaultFeignConfiguration.class,
basePackages= {"com.missuteam.onepiece.oauth.api.impl"}
)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
//掃描的包路徑
String[] value() default {};
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
//配置
Class<?>[] defaultConfiguration() default {};
//配置HttpClient
Class<?>[] clients() default {};
}
//自定義配置
@Configuration
public class DefaultFeignConfiguration {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(1000,3000,3);
}
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.BASIC;
}
}
//可配置的屬性
public static class FeignClientConfiguration {
private Logger.Level loggerLevel;
private Integer connectTimeout;
private Integer readTimeout;
private Class<Retryer> retryer;
private Class<ErrorDecoder> errorDecoder;
private List<Class<RequestInterceptor>> requestInterceptors;
private Boolean decode404;
private Class<Decoder> decoder;
private Class<Encoder> encoder;
private Class<Contract> contract;
}5. Contract協(xié)議規(guī)則(接口定義時的注釋規(guī)則)

(1)默認(rèn)Contract 實現(xiàn):
Feign 默認(rèn)有一套自己的協(xié)議規(guī)范,規(guī)定了一些注解,可以映射成對應(yīng)的Http請求。
| 注解 | 接口Target | 使用說明 |
| @RequestLine | 方法上 | 定義HttpMethod 和 UriTemplate. UriTemplate 中使用{} 包裹的表達(dá)式 |
| @Param | 方法參數(shù) | 定義模板變量,模板變量的值可以使用名稱的方式使用模板注入解析 |
| @Headers | 類上或者方法上 | 定義頭部模板變量,使用@Param 注解提供參數(shù)值的注入。如果該注解添加在接口類上,則所有的請求都會攜帶對應(yīng)的Header信息;如果在方法上,則只會添加到對應(yīng)的方法請求上 |
| @QueryMap | 方法上 | 定義一個鍵值對或者 pojo,參數(shù)值將會被轉(zhuǎn)換成URL上的 query 字符串上 |
| @HeaderMap | 方法上 | 定義一個HeaderMap, 與 UrlTemplate 和HeaderTemplate 類型,可以使用@Param 注解提供參數(shù)值 |
(2)基于Spring MVC的協(xié)議規(guī)范SpringMvcContract:
當(dāng)前Spring Cloud 微服務(wù)解決方案中,為了降低學(xué)習(xí)成本,采用了Spring MVC的部分注解來完成 請求協(xié)議解析,也就是說 ,寫客戶端請求接口和像寫服務(wù)端代碼一樣。目前的Spring MVC的注解并不是可以完全使用的,有一些注解并不支持,如 @GetMapping , @PutMapping 等,僅支持使用 @RequestMapping 等。
6.Feign開啟GZIP壓縮
Spring Cloud Feign支持對請求和響應(yīng)進(jìn)行GZIP壓縮,以提高通信效率。開啟GZIP壓縮之后,F(xiàn)eign之間的調(diào)用數(shù)據(jù)通過二進(jìn)制協(xié)議進(jìn)行傳輸,返回值需要修改為ResponseEntity<byte[]>才可以正常顯示。
//作用在所有Feign Client上的配置
feign:
compression:
request: #請求
enabled: true #開啟
mime-types: text/xml,application/xml,application/json #開啟支持壓縮的MIME TYPE
min-request-size: 2048 #配置壓縮數(shù)據(jù)大小的下限
response: #響應(yīng)
enabled: true #開啟響應(yīng)GZIP壓縮7. 配置:
##################FeignClientProperties###############
#全局默認(rèn)配置名稱:defalut
feign.client.config.defalut.error-decoder=com.example.feign.MyErrorDecoder
feign.client.config.defalut.connectTimeout=5000
#修改全局默認(rèn)配置名稱為:my-config
feign.client.default-config=my-config
feign.client.config.my-config.error-decoder=com.example.feign.MyErrorDecoder
feign.client.config.my-config.connectTimeout=5000
#局部配置,@FeignClient#name=user
feign.client.config.user.error-decoder=com.example.feign.MyErrorDecoder
feign.client.config.user.connectTimeout=5000
##################FeignHttpClientProperties##################
feign.httpclient.enabled=true
feign.httpclient.connectionTimeout=5000
##################FeignClientEncodingProperties##################
# 配置請求GZIP壓縮
feign.compression.request.enabled=true
# 配置響應(yīng)GZIP壓縮 FeignContentGzipEncodingAutoConfiguration
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
二、原理分析
在服務(wù)調(diào)用的場景中,我們經(jīng)常調(diào)用基于Http協(xié)議的服務(wù),而我們經(jīng)常使用到的框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty等等。(如下圖)


在Feign 底層,通過基于面向接口的動態(tài)代理方式生成實現(xiàn)類,將請求調(diào)用委托到動態(tài)代理實現(xiàn)類,基本原理如下所示

到此這篇關(guān)于SpringCloud中的Feign詳解的文章就介紹到這了,更多相關(guān)Feign詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java返回前端樹形結(jié)構(gòu)數(shù)據(jù)的2種實現(xiàn)方式
近期項目有個需求,需要將組織機(jī)構(gòu)數(shù)據(jù)拼成樹型結(jié)構(gòu)返回至前端,下面這篇文章主要給大家介紹了關(guān)于java返回前端樹形結(jié)構(gòu)數(shù)據(jù)的2種實現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決
本文主要介紹了SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
JavaWeb文件上傳下載實例講解(酷炫的文件上傳技術(shù))
在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳功能是非常常用的功能,今天來主要講講JavaWeb中的文件上傳功能的相關(guān)技術(shù)實現(xiàn),本文給大家介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧2016-11-11

