国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Cloud OpenFeign 的使用及踩坑指南

這篇具有很好參考價(jià)值的文章主要介紹了Spring Cloud OpenFeign 的使用及踩坑指南。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

  • Feign 和OpenFeign
    • Feign
    • OpenFeign
    • openFeign的優(yōu)勢
  • OpenFeign應(yīng)用
    • 1. 導(dǎo)入依賴
    • 2. 使用
    • 3. 日志配置
    • 4. 數(shù)據(jù)壓縮
  • OpenFeign高級應(yīng)用
    • OpenFeign熔斷降級的兩種方式-降級方法和降級工廠
  • 踩坑指南
    • 坑一:Http Client
    • 坑二:全局超時(shí)時(shí)間
    • 坑三:單服務(wù)設(shè)置超時(shí)時(shí)間
  • 遇到的問題
    • 1. 使用Spring MVC注解,但請求方式不正確
    • 2. 使用nacos做注冊中心,F(xiàn)eign調(diào)用時(shí)拉取的服務(wù)列表為空

Feign 和OpenFeign

Feign

Feign是Spring Cloud組件中的一個(gè)輕量級RESTful的HTTP服務(wù)客戶端Feign內(nèi)置了Ribbon,用來做客戶端負(fù)載均衡,去調(diào)用服務(wù)注冊中心的服務(wù)。

Feign的使用方式是:使用Feign的注解定義接口,調(diào)用這個(gè)接口,就可以調(diào)用服務(wù)注冊中心的服務(wù)Feign本身不支持Spring MVC的注解,它有一套自己的注解

OpenFeign

OpenFeign是Spring Cloud 在Feign的基礎(chǔ)上支持了Spring MVC的注解,如@RequesMapping等,是一個(gè)輕量級的Http封裝工具對象,大大簡化了Http請求,使得我們對服務(wù)的調(diào)用轉(zhuǎn)換成了對本地接口方法的調(diào)用。

OpenFeign 的 @FeignClient 可以解析SpringMVC的 @RequestMapping注解下的接口,并通過動(dòng)態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類,實(shí)現(xiàn)類中做負(fù)載均衡并調(diào)用其他服務(wù)

openFeign的優(yōu)勢

  1. 集成了Ribbon的負(fù)載均衡功能
  2. 集成Hystrix的熔斷器功能
  3. 支持請求壓縮
  4. 大大簡化了遠(yuǎn)程調(diào)用的代碼,同時(shí)功能還增強(qiáng)啦
  5. 以更加優(yōu)雅的方式編寫遠(yuǎn)程調(diào)用代碼,并簡化重復(fù)代碼

OpenFeign應(yīng)用

1. 導(dǎo)入依賴

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.1.RELEASE</version>
  </dependency>

2. 使用

創(chuàng)建Feign接口

@FeignClient(value = "xx-template-service")//value = "xx-template-service"指定服務(wù)的名字
public interface DriverFeign {

  /** 
   * demo feign 接口
   */
  @PutMapping(value = "/driver/status")
  Driver status(String id, Integer status);
}

Feign會(huì)通過動(dòng)態(tài)代理,幫我們生成實(shí)現(xiàn)類。

注解@FeignClient聲明Feign的客戶端,注解value指明服務(wù)名稱接口定義的方法,采用SpringMVC的注解。Feign會(huì)根據(jù)注解幫我們生成URL地址

FeignClient 注解參數(shù)

  • name/value:指定FeignClient的名稱,如果項(xiàng)目使用了Ribbon,name屬性會(huì)作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn)
  • contextId:指定beanID
  • url: url一般用于調(diào)試,可以手動(dòng)指定@FeignClient調(diào)用的地址
  • decode404:當(dāng)發(fā)生http 404錯(cuò)誤時(shí),如果該字段位true,會(huì)調(diào)用decoder進(jìn)行解碼,否則拋出FeignException
  • configuration: Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定義容錯(cuò)的處理類,當(dāng)調(diào)用遠(yuǎn)程接口失敗或超時(shí)時(shí),會(huì)調(diào)用對應(yīng)接口的容錯(cuò)邏輯,fallback指定的類必須實(shí)現(xiàn)@FeignClient標(biāo)記的接口
  • fallbackFactory: 工廠類,用于生成fallback類示例,通過這個(gè)屬性我們可以實(shí)現(xiàn)每個(gè)接口通用的容錯(cuò)邏輯,減少重復(fù)的代碼
  • path: 定義當(dāng)前FeignClient的統(tǒng)一前綴

注意事項(xiàng)

  1. 在使用fallback、fallbackFactory屬性時(shí),需要使用@Component注解,保證fallback類被Spring容器掃描到
  2. 在使用FeignClient時(shí),Spring會(huì)按name創(chuàng)建不同的ApplicationContext,通過不同的Context來隔離FeignClient的配置信息, 在使用配置類時(shí),不能把配置類放到Spring App Component scan的路徑下,否則,配置類會(huì)對所有FeignClient生效.

啟用OpenFeign

我們需要在服務(wù)的啟動(dòng)類上開啟 OpenFeign ,只需要在 **Application 啟動(dòng)類上添加 @EnableFeignClients即可。

3. 日志配置

logging:
  level:
    xx.template.cloud.web.service.feign.ServiceServiceFeign: debug

通過loggin.level.xx=debug來設(shè)置日志級別。然而這個(gè)對Feign客戶端不會(huì)產(chǎn)生效果。因?yàn)锧FeignClient注解修飾的客戶端在被代理時(shí),都會(huì)創(chuàng)建一個(gè)新的Feign.Logger實(shí)例。我們需要額外指定這個(gè)日志的級別才可以。

  /** 
   * feign 日志級別配置
   * @return 
   */
  @Bean
  public Logger.Level feignLoggerLevel(){
    return Logger.Level.FULL;
  }

或者在配置文件中配置

feign: 
  client:
    config:
      # 全局配置
      default:
        loggerLevel: full

Feign支持4種級別:
NONE:不記錄任何日志,默認(rèn)值
BASIC:僅記錄請求的方法,URL以及響應(yīng)狀態(tài)碼和執(zhí)行時(shí)間
HEADERS:在BASIC基礎(chǔ)上,額外記錄了請求和響應(yīng)的頭信息
FULL:記錄所有請求和響應(yīng)的明細(xì),包括頭信息、請求體、元數(shù)據(jù)

4. 數(shù)據(jù)壓縮

用戶在網(wǎng)絡(luò)請求過程中,如果網(wǎng)絡(luò)不佳、傳輸數(shù)據(jù)過大,會(huì)造成體驗(yàn)差的問題,我們需要將傳輸數(shù)據(jù)壓縮提升體驗(yàn)。SpringCloud OpenFeign支持對請求和響應(yīng)進(jìn)行GZIP壓縮,以減少通信過程中的性能損耗。

在客戶端中配置數(shù)據(jù)壓縮

feign:
  compression:
    request:
     enabled: true # 開啟請求壓縮
    response:
     enabled: true # 開啟響應(yīng)壓縮

也可以對請求的數(shù)據(jù)類型,以及觸發(fā)壓縮的大小下限進(jìn)行設(shè)置

feign:
  compression:
    request:
      enabled: true # 開啟請求壓縮
      mime-types: text/html,application/xml,application/json # 設(shè)置壓縮的數(shù)據(jù)類型
      min-request-size: 2048 # 設(shè)置觸發(fā)壓縮的大小下限
      #以上數(shù)據(jù)類型,壓縮大小下限均為默認(rèn)值
      response:
        enabled: true # 開啟響應(yīng)壓縮

OpenFeign高級應(yīng)用

OpenFeign熔斷降級的兩種方式-降級方法和降級工廠

首先在配置文件中配置如下,開啟熔斷降級

feign.hystrix.enabled=true
  1. Feign 定義降級方法

    feign接口定義

    /**
     * FeignClient 注解的 fallback 屬性指定降級類
     */
    @FeignClient(name = "xx-template-cloud-service", fallback = ServiceServiceFeignFallBack.class)
    public interface ServiceServiceFeign {
    
        @GetMapping("/order/getOrder")
        Result getOrder(String id);
    }
    
    

    feign接口降級方法定義

    @Slf4j
    @Component
    class ServiceServiceFeignFallBack implements ServiceServiceFeign {
    
        @Override
        public Result getOrder(String id) {
            log.error("Feign接口熔斷 熔斷方式:ServiceServiceFeignFallBack");
            return Result.error("500", "Feign接口熔斷");
        }
    }
    
  2. Feign 定義降級工廠

    feign接口定義

    /**
     * FeignClient 注解的 fallback 屬性指定降級類
     */
    @FeignClient(name = "xx-template-cloud-service", fallback = UserCenterFeignClientFallbackFactory.class)
    public interface ServiceServiceFeign {
    
        @GetMapping("/order/getOrder")
        Result getOrder(String id);
    }
    
    

    feign接口降級工廠定義

    @Component
    @Slf4j
    class UserCenterFeignClientFallbackFactory implements FallbackFactory<ServiceServiceFeign> {
    
        @Override
        public ServiceServiceFeign create(Throwable cause) {
            return new ServiceServiceFeign() {
                @Override
                public Result getOrder(String id) {
                    log.error("Feign接口熔斷,熔斷方式:UserCenterFeignClientFallbackFactory");
                    return Result.error("500", "Feign接口熔斷");
                }
            };
        }
    }
    

踩坑指南

坑一:Http Client

OpenFeign默認(rèn)使用jdk自帶的HttpURLConnection,我們知道HttpURLConnection沒有連接池、性能和效率比較低,如果采用默認(rèn),很可能會(huì)遇到性能問題導(dǎo)致系統(tǒng)故障

  1. 可以采用Apache HttpClient

    注意feign-httpclient的版本,如果和Open Feign 不兼容可能會(huì)報(bào)original request is required異常

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
        <version>10.10.1</version>
    </dependency>
    
    feign.httpclient.enabled=true
    
  2. 也可以采用OkHttpClient

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
        <version>10.2.0</version>
    </dependency>
    
    feign.okhttp.enabled=true
    

ribbon中的Http Client

通過OpenFeign作為注冊中心的客戶端時(shí),默認(rèn)使用Ribbon做負(fù)載均衡,Ribbon默認(rèn)也是用jdk自帶的HttpURLConnection,需要給Ribbon也設(shè)置一個(gè)Http client,比如使用okhttp,在properties文件中增加下面配置

ribbon.okhttp.enabled=true

坑二:全局超時(shí)時(shí)間

OpenFeign可以設(shè)置超時(shí)時(shí)間,簡單粗暴,設(shè)置一個(gè)全局的超時(shí)時(shí)間。如果不配置超時(shí)時(shí)間,默認(rèn)是連接超時(shí)10s,讀超時(shí)60s。

feign.client.config.default.connectTimeout=2000
feign.client.config.default.readTimeout=60000

但是如果某個(gè)服務(wù)的并發(fā)量很高,服務(wù)的超時(shí)時(shí)間過長會(huì)導(dǎo)致占用大量連接資源,導(dǎo)致系統(tǒng)崩潰,要防止這樣的故障發(fā)生,最好的做法就是給服務(wù)單獨(dú)設(shè)置超時(shí)時(shí)間。

當(dāng)然,如果開啟熔斷后,不配置hystrix和ribbon的超時(shí)時(shí)間,那么Hystrix與ribbon的默認(rèn)請求超時(shí)時(shí)間都是1秒,建議配置Hystrix的超時(shí)時(shí)間要大于ribbon的超時(shí)時(shí)間,否則會(huì)在接口調(diào)用還未完成的時(shí)候直接進(jìn)入回調(diào)方法。

# 開啟熔斷
feign.hystrix.enabled: true


坑三:單服務(wù)設(shè)置超時(shí)時(shí)間

上文所述,對單個(gè)服務(wù)設(shè)置超時(shí)時(shí)間。

feign.client.config.serviceA.connectTimeout=2000
feign.client.config.serviceA.readTimeout=60000

但是如果serviceA中有多個(gè)接口,其中X接口又調(diào)用serviceB的Feign接口,為了保證X接口請求不被單服務(wù)超時(shí)時(shí)間影響,需要單獨(dú)對X接口設(shè)置超時(shí)時(shí)間。

幾個(gè)組件的關(guān)系

Spring Cloud OpenFeign 的使用及踩坑指南

hystrix+ribbon。hystrix在最外層,然后再到Ribbon,最后里面的是http請求。所以說。hystrix的熔斷時(shí)間必須大于ribbon的 ( ConnectTimeout + ReadTimeout )。而如果ribbon開啟了重試機(jī)制,還需要乘以對應(yīng)的重試次數(shù)(注意這里的重試可以是ribbon的重試也可能是feign的重試),保證在Ribbon里的請求還沒結(jié)束時(shí),Hystrix的熔斷時(shí)間不會(huì)超時(shí)。

遇到的問題

1. 使用Spring MVC注解,但請求方式不正確

  • 參數(shù)沒有通過注解指定,此時(shí)的參數(shù)會(huì)自動(dòng)封裝到body中,F(xiàn)eign檢測到body里面有請求參數(shù)就會(huì)默認(rèn)使用POST請求。
  • Feign默認(rèn)使用的是POST方法,如果想使用GET方法,需要在配置文件中設(shè)置spring.cloud.openfeign.client.config.default.method.name=get。
  • 如果使用了Spring Cloud Netflix Feign,那么可能是因?yàn)槟膽?yīng)用程序使用了Spring Cloud Netflix Ribbon來處理HTTP負(fù)載均衡。在這種情況下,您需要確保Ribbon的配置正確,并且不會(huì)影響Feign的GET請求。

2. 使用nacos做注冊中心,F(xiàn)eign調(diào)用時(shí)拉取的服務(wù)列表為空

我用的spring cloud版本是Hoxton.SR8

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

原因是Feign 在spring cloud Hoxton.M2版本之后,不再使用ribbon,所以我們在pom文件中還需要導(dǎo)入loadbalancer依賴,并排除掉nacos的ribbon依賴。

        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

并在配置文件中添加文章來源地址http://www.zghlxwxcb.cn/news/detail-623635.html


spring.cloud.loadbalancer.ribbon.enabled: false

到了這里,關(guān)于Spring Cloud OpenFeign 的使用及踩坑指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 云原生微服務(wù) 第六章 Spring Cloud中使用OpenFeign

    云原生微服務(wù) 第六章 Spring Cloud中使用OpenFeign

    第一章 Java線程池技術(shù)應(yīng)用 第二章 CountDownLatch和Semaphone的應(yīng)用 第三章 Spring Cloud 簡介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign OpenFeign 全稱 Spring Cloud OpenFeign,它是 Spring 官方推出的一種聲明式服務(wù)調(diào)用與負(fù)載均衡組件。我們可

    2024年02月08日
    瀏覽(27)
  • 【Spring Cloud】如何使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用

    【Spring Cloud】如何使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用

    本次示例代碼的文件結(jié)構(gòu)如下圖所示。 在 order-service 的 pom.xml 文件中導(dǎo)入 Feign 的依賴坐標(biāo)。 在 order-service 的啟動(dòng)類上添加注解 @EnableFeignClients ,以開啟 Feign 功能。 Feign 采用了 Spring MVC 的注解的方式發(fā)起遠(yuǎn)程調(diào)用。只需要把發(fā) HTTP 請求的信息聲明在一個(gè)接口中,并添加注解

    2024年02月13日
    瀏覽(20)
  • Intellij IDEA下載安裝教程和搭建springboot開發(fā)環(huán)境及踩坑指南(超詳細(xì)圖文教程)

    Intellij IDEA下載安裝教程和搭建springboot開發(fā)環(huán)境及踩坑指南(超詳細(xì)圖文教程)

    https://www.jetbrains.com/idea/ 大家通過上方的鏈接進(jìn)入到Intellij idea的官網(wǎng)后,可以在主界面點(diǎn)擊Download或者點(diǎn)擊上方導(dǎo)航欄里面的DeveloperTools,在里面找到并點(diǎn)擊Intellij idea,下載安裝即可。 3、 Intellij idea安裝指南 通過上方的官網(wǎng)下載完成以后,會(huì)的到一個(gè)壓縮包(里面是Intellij

    2024年03月24日
    瀏覽(29)
  • 使用Feign進(jìn)行微服務(wù)之間的接口調(diào)用:Spring Cloud Alibaba中的聲明式服務(wù)調(diào)用

    使用Feign進(jìn)行微服務(wù)之間的接口調(diào)用:Spring Cloud Alibaba中的聲明式服務(wù)調(diào)用

    ????????Feign是一個(gè)聲明式的 HTTP客戶端框架 ,用于簡化微服務(wù)架構(gòu)中服務(wù)之間的通信。它是Spring Cloud框架的一部分,旨在提供一種優(yōu)雅且易于使用的方式來定義和調(diào)用HTTP請求。 ????????Feign的設(shè)計(jì)目標(biāo)是讓服務(wù)之間的通信變得更加簡單和直觀。通常情況下,在微服務(wù)

    2024年02月15日
    瀏覽(35)
  • 在spring cloud中使用gateway報(bào)錯(cuò)404(踩坑)

    在spring cloud中使用gateway報(bào)錯(cuò)404(踩坑)

    在我寫一個(gè)spring cloud小demo時(shí),在瀏覽器訪問報(bào)錯(cuò)中報(bào)錯(cuò)404,讓我百思不得其解, ? ?以下是錯(cuò)誤代碼展示 teacher業(yè)務(wù) teacher配置文件 gateway配置文件 在上述gateway配置文件中出現(xiàn)的錯(cuò)誤 - Path=/teacherserver/** 正確是應(yīng)該是 -Path=/teacher/** Path應(yīng)該與controller對應(yīng) 當(dāng)然,這是我粗心大意

    2024年02月04日
    瀏覽(20)
  • 【spring Cloud】微服務(wù)通信的三種方式RestTemplate、Feign遠(yuǎn)程調(diào)用與Dubbo的使用

    目錄 一、通過RestTemplate調(diào)用微服務(wù) 二、通過Feign遠(yuǎn)程調(diào)用 三、Dubbo? 分布式中的遠(yuǎn)程調(diào)用大概分為兩種 RESTful接口? REST,即Representational State Transfer的縮寫,如果一個(gè)架構(gòu)符合REST原則,就稱它為RESTful架構(gòu)。 每一個(gè)URI代表一種資源; 客戶端和服務(wù)器之間,傳遞這種資源的某種

    2024年04月11日
    瀏覽(20)
  • 第五章 : Spring cloud 微服務(wù)調(diào)用-OpenFeign

    第五章 : Spring cloud 微服務(wù)調(diào)用-OpenFeign 前言 本章知識點(diǎn):OpenFeign介紹、負(fù)載均衡Ribbon的算法、Spring cloud 如何通過RestTemplate調(diào)用微服務(wù),以及RestTemplate負(fù)載均衡原理。 OpenFeign介紹 Spring Cloud OpenFeign是一個(gè)聲明式、模板化的HTTP客戶端,主要用于Spring Cloud微服務(wù)之間的調(diào)用。以

    2024年02月02日
    瀏覽(25)
  • OpenFeign:Spring Cloud聲明式服務(wù)調(diào)用組件

    OpenFeign? Feign VS OpenFeign? OpenFeign實(shí)現(xiàn)遠(yuǎn)程服務(wù)調(diào)用? OpenFeign超時(shí)控制? OpenFeign日志增強(qiáng)? Open Feign Spring官方推出的一種聲明式服務(wù)端調(diào)用與負(fù)載均衡組件。 OpenFeign常用注解 注解 說明 @FeignClient 通知OpenFeign組件對@RequestMapping注解下的接口解析,并通過動(dòng)態(tài)代理的方式實(shí)現(xiàn)類

    2024年02月03日
    瀏覽(26)
  • Spring Cloud ( openFeign 服務(wù)發(fā)現(xiàn)、配置、公共client抽取 )

    Spring Cloud ( openFeign 服務(wù)發(fā)現(xiàn)、配置、公共client抽取 )

    本章目錄: openFeign的引出 快速入門 引入依賴 添加@EnableFeignClients注解 編寫FeignClient接口 使用FeignClient中定義的方法代替RestTemplate 日志配置 連接池配置 公共client抽取 先來看我們之前服務(wù)通信使用的方法: 我們調(diào)用RestTemplate的getObject并手寫url來完成服務(wù)調(diào)用,這樣做的缺點(diǎn)是

    2023年04月08日
    瀏覽(31)
  • Spring Cloud Alibaba 同時(shí)兼容dubbo與openfeign

    dubbo與springcloud都可以單獨(dú)作為微服務(wù)治理框架在生產(chǎn)中進(jìn)行使用,但使用過springcloud的同學(xué)大概了解到,springcloud生態(tài)的相關(guān)組件這些年已經(jīng)逐步停更,這就導(dǎo)致在服務(wù)架構(gòu)演進(jìn)過程中的迭代斷層,以至于一些新的技術(shù)組件引入困難重重,于是在國內(nèi)的市場上就有了升級版的

    2024年02月07日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包