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: true
4.構(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 中使用{} 包裹的表達式 |
@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)進行GZIP壓縮,以提高通信效率。開啟GZIP壓縮之后,F(xiàn)eign之間的調(diào)用數(shù)據(jù)通過二進制協(xié)議進行傳輸,返回值需要修改為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)方式
近期項目有個需求,需要將組織機構(gòu)數(shù)據(jù)拼成樹型結(jié)構(gòu)返回至前端,下面這篇文章主要給大家介紹了關(guān)于java返回前端樹形結(jié)構(gòu)數(shù)據(jù)的2種實現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決
本文主要介紹了SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04JavaWeb文件上傳下載實例講解(酷炫的文件上傳技術(shù))
在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳功能是非常常用的功能,今天來主要講講JavaWeb中的文件上傳功能的相關(guān)技術(shù)實現(xiàn),本文給大家介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧2016-11-11