欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud中的Feign詳解

 更新時間:2023年09月11日 11:42:49   作者:silmeweed  
這篇文章主要介紹了SpringCloud中的Feign詳解,Feign是一個聲明式的Web Service客戶端,以Java接口注解的方式調(diào)用Http請求,同時Feign整合了Ribbon和Hystrix,實現(xiàn)負(fù)載均衡與容斷功能,需要的朋友可以參考下

一、簡介:

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)方式

    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-05
  • SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決

    SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決

    本文主要介紹了SpringBoot中@RequestBody不能和Multipart同時傳遞的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • MyBatis使用Map與模糊查詢的方法示例

    MyBatis使用Map與模糊查詢的方法示例

    這篇文章主要給大家介紹了關(guān)于MyBatis使用Map與模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Intellij搭建springmvc常見問題解決方案

    Intellij搭建springmvc常見問題解決方案

    這篇文章主要介紹了Intellij搭建springmvc常見問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 教你如何使用Java多線程編程LockSupport工具類

    教你如何使用Java多線程編程LockSupport工具類

    在Java工具包中有一個LockSupport工具類,主要負(fù)責(zé)掛起和喚醒線程,這篇文章主要介紹了教你如何使用Java多線程編程LockSupport工具類,需要的朋友可以參考下
    2021-04-04
  • Hibernate核心思想與接口簡介

    Hibernate核心思想與接口簡介

    這篇文章主要介紹了Hibernate核心思想與接口的相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-09-09
  • 使用JAVA實現(xiàn)http通信詳解

    使用JAVA實現(xiàn)http通信詳解

    本文給大家匯總介紹了幾種java實現(xiàn)http通訊的方法,非常的簡單實用,有需要的小伙伴可以參考下。
    2015-08-08
  • JavaWeb文件上傳下載實例講解(酷炫的文件上傳技術(shù))

    JavaWeb文件上傳下載實例講解(酷炫的文件上傳技術(shù))

    在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳功能是非常常用的功能,今天來主要講講JavaWeb中的文件上傳功能的相關(guān)技術(shù)實現(xiàn),本文給大家介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • Java枚舉類enum介紹

    Java枚舉類enum介紹

    這篇文章主要介紹了Java枚舉類enum介紹,和其它普通類一樣,enum同樣可以有成員變量、方法、構(gòu)造器,也可以實現(xiàn)一個或多個接口,需要的朋友可以參考下
    2015-04-04
  • java多線程累加計數(shù)的實現(xiàn)方法

    java多線程累加計數(shù)的實現(xiàn)方法

    在多線程協(xié)作任務(wù)中,如何計算也是很重的,這篇文章主要介紹了java多線程累加計數(shù)的實現(xiàn)方法,感興趣的朋友可以了解一下
    2021-05-05

最新評論