日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Feign如何設(shè)置超時(shí)時(shí)間,不同情況下還真不一樣

來(lái)源: 責(zé)編: 時(shí)間:2023-08-14 22:00:37 425觀看
導(dǎo)讀大家好,我是三友~~今天來(lái)聊一聊前段時(shí)間看到的一個(gè)面試題,也是在實(shí)際項(xiàng)目中需要考慮的一個(gè)問(wèn)題,F(xiàn)eign的超時(shí)時(shí)間如何設(shè)置?Feign的超時(shí)時(shí)間設(shè)置方式并不固定,它取決于Feign在項(xiàng)目中是如何使用的,不同的使用方式,超時(shí)時(shí)間設(shè)置

大家好,我是三友~~esY28資訊網(wǎng)——每日最新資訊28at.com

今天來(lái)聊一聊前段時(shí)間看到的一個(gè)面試題,也是在實(shí)際項(xiàng)目中需要考慮的一個(gè)問(wèn)題,F(xiàn)eign的超時(shí)時(shí)間如何設(shè)置?esY28資訊網(wǎng)——每日最新資訊28at.com

Feign的超時(shí)時(shí)間設(shè)置方式并不固定,它取決于Feign在項(xiàng)目中是如何使用的,不同的使用方式,超時(shí)時(shí)間設(shè)置方式也不大相同,甚至還可能有坑。esY28資訊網(wǎng)——每日最新資訊28at.com

前置知識(shí)

由于文章會(huì)涉及到Feign的底層知識(shí),如果不懂點(diǎn)Feign的基本概念的話,后面就看不下去了esY28資訊網(wǎng)——每日最新資訊28at.com

所以為了方便不了解Feign的小伙伴也能夠讀得懂文章,這里我就簡(jiǎn)單地說(shuō)說(shuō)Feign的原理,點(diǎn)到為止,雖然不深入,但足夠應(yīng)付這篇文章了esY28資訊網(wǎng)——每日最新資訊28at.com

Feign的作用

在項(xiàng)目中,我們經(jīng)常需要調(diào)用第三方提供的Http接口,此時(shí)我們就可以使用一些Http框架來(lái)實(shí)現(xiàn),比如HttpClientesY28資訊網(wǎng)——每日最新資訊28at.com

public class HttpClientDemo {    public static void main(String[] args) throws Exception {        //創(chuàng)建一個(gè)HttpClient        HttpClient httpClient = HttpClientBuilder.create().build();        //構(gòu)建一個(gè)get請(qǐng)求        HttpGet httpGet = new HttpGet("http://192.168.100.1:8080/order/1");        //發(fā)送請(qǐng)求,獲取響應(yīng)        HttpResponse httpResponse = httpClient.execute(httpGet);        HttpEntity httpEntity = httpResponse.getEntity();        //讀出響應(yīng)值        String response = EntityUtils.toString(httpEntity);        System.out.println("Response: " + response);    }}

如果項(xiàng)目中只有一兩個(gè)這種第三方接口這樣寫(xiě)還行,但是一旦這種三方接口過(guò)多的話,每次都得這樣組裝參數(shù),發(fā)送請(qǐng)求,寫(xiě)一堆同樣的代碼,就顯然很麻煩了。esY28資訊網(wǎng)——每日最新資訊28at.com

所以為了簡(jiǎn)化發(fā)送Http請(qǐng)求的開(kāi)發(fā),減少重復(fù)代碼,F(xiàn)eign就出現(xiàn)了。esY28資訊網(wǎng)——每日最新資訊28at.com

Feign是一個(gè)聲明式的Http框架esY28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)你需要調(diào)用Http接口時(shí),你需要聲明一個(gè)接口,加一些注解就可以了esY28資訊網(wǎng)——每日最新資訊28at.com

而像組裝參數(shù)、發(fā)送Http請(qǐng)求等重復(fù)性的工作都交給Feign來(lái)完成。esY28資訊網(wǎng)——每日最新資訊28at.com

Feign的原理

雖然有了接口,但是僅僅有接口是不夠的,因?yàn)榻涌谟植荒軇?chuàng)建對(duì)象,我們得需要對(duì)象。esY28資訊網(wǎng)——每日最新資訊28at.com

Feign為了方便我們?yōu)榻涌趧?chuàng)建對(duì)象,提供的Feign.Builder這個(gè)內(nèi)部類esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)類的作用就是解析接口的上的注解,為接口生成一個(gè)動(dòng)態(tài)代理對(duì)象,后面通過(guò)這個(gè)代理對(duì)象就可以發(fā)送請(qǐng)求了。esY28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)內(nèi)部類有很多屬性,這些屬性都是Feign的核心組件。esY28資訊網(wǎng)——每日最新資訊28at.com

在這些核心的組件中有一個(gè)叫Client的,上圖中我圈出來(lái)了。esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)Client類劃個(gè)重點(diǎn),非常非常重要,本文討論的東西跟他有密切關(guān)系。esY28資訊網(wǎng)——每日最新資訊28at.com

它只有一個(gè)方法Response execute(Request request, Options options)esY28資訊網(wǎng)——每日最新資訊28at.com

方法的第一個(gè)參數(shù)Request就是封裝了http請(qǐng)求的url、請(qǐng)求方法,請(qǐng)求頭、請(qǐng)求體之類的參數(shù)esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

第二個(gè)參數(shù)Options就是本文的主題,封裝了超時(shí)時(shí)間。esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

返回值Response就是封裝了一些響應(yīng)碼status、響應(yīng)頭之類的esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

所以通過(guò)方法的參數(shù)和返回值也可以猜出來(lái),這個(gè)Client作用是用來(lái)組裝Http請(qǐng)求參數(shù),發(fā)送Http請(qǐng)求的esY28資訊網(wǎng)——每日最新資訊28at.com

并且http請(qǐng)求超時(shí)時(shí)間是根據(jù)傳給Client的Options參數(shù)來(lái)決定的esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

如果想更深一步了解Feign原理,可在公眾號(hào)菜單欄springcloud分類中查看esY28資訊網(wǎng)——每日最新資訊28at.com

Feign單獨(dú)使用時(shí)超時(shí)時(shí)間設(shè)置

Feign本身就是一個(gè)http客戶端,可獨(dú)立使用,F(xiàn)eign提供了兩種超時(shí)時(shí)間設(shè)置方式esY28資訊網(wǎng)——每日最新資訊28at.com

1、通過(guò)Feign.Builder設(shè)置

前面提到,F(xiàn)eign.Builder的作用是為接口的動(dòng)態(tài)代理對(duì)象的esY28資訊網(wǎng)——每日最新資訊28at.com

Feign.Builder里面有很多屬性,其中就有關(guān)于超時(shí)時(shí)間的屬性O(shè)ptionsesY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

如果你不設(shè)置,那么超時(shí)時(shí)間就是默認(rèn)的esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

默認(rèn)的就是連接超時(shí)10s,讀超時(shí)60sesY28資訊網(wǎng)——每日最新資訊28at.com

所以可以通過(guò)設(shè)置Feign.Builder中的options來(lái)設(shè)置超時(shí)時(shí)間esY28資訊網(wǎng)——每日最新資訊28at.com

來(lái)個(gè)demoesY28資訊網(wǎng)——每日最新資訊28at.com

環(huán)境準(zhǔn)備,就是一個(gè)簡(jiǎn)單的SpringBoot項(xiàng)目,引入一個(gè)Feign的依賴esY28資訊網(wǎng)——每日最新資訊28at.com

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

聲明接口 + 注解esY28資訊網(wǎng)——每日最新資訊28at.com

public interface UserApi {    @RequestLine("GET /user/{userId}")    User queryUser(@Param("userId") Integer userId);}

這里演示的是Feign原生的使用方式,脫離于SpringCloud環(huán)境,所以Spring的那些@GetMappring就不支持了,改用Feign本身提供的注解esY28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試代碼esY28資訊網(wǎng)——每日最新資訊28at.com

public class FeignDemo {    public static void main(String[] args) {        UserApi client = Feign.builder()                //設(shè)置連接和讀超時(shí)間都是5s                .options(new Request.Options(5, TimeUnit.SECONDS, 5, TimeUnit.SECONDS, true))                .target(UserApi.class, "http://localhost:8088");        User user = client.queryUser(123);    }}

這里面的請(qǐng)求路徑都是不存在的,因?yàn)槲覀冎魂P(guān)心傳給Client的Options參數(shù)值esY28資訊網(wǎng)——每日最新資訊28at.com

Client在我們不設(shè)置的時(shí)候,就用默認(rèn)的實(shí)現(xiàn)Client.DefaultesY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

斷點(diǎn)打到execute方法的實(shí)現(xiàn),運(yùn)行,走起esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

結(jié)果就是我們?cè)O(shè)置的5sesY28資訊網(wǎng)——每日最新資訊28at.com

2、在接口方法參數(shù)設(shè)置

除了在通過(guò)Feign.Builder時(shí)設(shè)置之外,F(xiàn)eign還支持在接口的方法參數(shù)上設(shè)置esY28資訊網(wǎng)——每日最新資訊28at.com

此時(shí)你只需要在接口的方法上加一個(gè)Options類型的參數(shù)esY28資訊網(wǎng)——每日最新資訊28at.com

@RequestLine("GET /user/{userId}")User queryUser(@Param("userId") Integer userId, Request.Options options);

這樣在傳參數(shù)時(shí)就可以設(shè)置超時(shí)時(shí)間了esY28資訊網(wǎng)——每日最新資訊28at.com

User user = client.queryUser(123, new Request.Options(3, TimeUnit.SECONDS, 3, TimeUnit.SECONDS, true));

同樣地,debug就可以看見(jiàn)我們?cè)O(shè)置的3s了esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

這兩種設(shè)置超時(shí)時(shí)間的主要區(qū)別就是方法參數(shù)設(shè)置超時(shí)時(shí)間的優(yōu)先級(jí)高于Feign.Builder設(shè)置的超時(shí)時(shí)間esY28資訊網(wǎng)——每日最新資訊28at.com

用一張圖來(lái)總結(jié)一下上面的關(guān)系esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

所以,如果你單獨(dú)使用Feign的時(shí)候,你就可以通過(guò)如上的兩種方式來(lái)設(shè)置超時(shí)時(shí)間。esY28資訊網(wǎng)——每日最新資訊28at.com

SpringCloud下Feign單獨(dú)使用超時(shí)時(shí)間設(shè)置

在SpringCloud環(huán)境下,只是對(duì)Feign進(jìn)行了一層包裝,所以即使沒(méi)有Ribbon和注冊(cè)中心,F(xiàn)eign也是可以單獨(dú)使用的,但是用法有點(diǎn)變化esY28資訊網(wǎng)——每日最新資訊28at.com

  • 注解都換成SpringMVC的注解
  • 接口上需要加@FeignClient注解
  • 用@EnableFeignClients掃描這些接口

不過(guò),默認(rèn)情況下Feign還是需要結(jié)合Ribbon來(lái)使用的esY28資訊網(wǎng)——每日最新資訊28at.com

如果你只想單獨(dú)使用Feign,那么就設(shè)置一下@FeignClient注解的url屬性,指定請(qǐng)求的地址和端口就可以了esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

所以,既然只是包裝,前面提到的兩種方式設(shè)置超時(shí)時(shí)間當(dāng)然可以繼續(xù)使用:esY28資訊網(wǎng)——每日最新資訊28at.com

  • 通過(guò)Feign.Builder
  • 通過(guò)接口的方法參數(shù)

方法參數(shù)設(shè)置形式跟前面提到的一模一樣,但是通過(guò)Feign.Builder來(lái)設(shè)置卻不太一樣esY28資訊網(wǎng)——每日最新資訊28at.com

由于SpringCloud會(huì)自己創(chuàng)建Feign.Builder,不需要我們創(chuàng)建,所以在設(shè)置Options時(shí),Spring提供了兩種快捷方式來(lái)設(shè)置esY28資訊網(wǎng)——每日最新資訊28at.com

不過(guò)最終還是設(shè)置到Feign.Builder中esY28資訊網(wǎng)——每日最新資訊28at.com

1、聲明一個(gè)Options Bean

Spring在構(gòu)建Feign.Builder的時(shí),會(huì)從容器中查找Options這個(gè)Bean,然后設(shè)置到Feign.Builder中esY28資訊網(wǎng)——每日最新資訊28at.com

@Configurationpublic class FeignConfiguration {    @Bean    public Request.Options options() {        return new Request.Options(8, TimeUnit.SECONDS, 8, TimeUnit.SECONDS, true);    }}

此時(shí)debug就可以看到設(shè)置到Feign.Builder的代碼esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

這段代碼在FeignClientFactoryBean中的configureUsingConfiguration方法中esY28資訊網(wǎng)——每日最新資訊28at.com

2、配置文件中設(shè)置

除了聲明Bean之外,Spring還提供了通過(guò)配置文件的方式配置,如下:esY28資訊網(wǎng)——每日最新資訊28at.com

feign:  client:    config:      default:        connectTimeout: 10000        readTimeout: 10000

同樣地,debug就可以看見(jiàn)esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

這段代碼在FeignClientFactoryBean中的configureUsingConfiguration方法中esY28資訊網(wǎng)——每日最新資訊28at.com

聲明Bean和配置文件都可以設(shè)置,那么同時(shí)設(shè)置哪種優(yōu)先級(jí)高呢?esY28資訊網(wǎng)——每日最新資訊28at.com

如無(wú)特殊配置,遵守SpringBoot本身的配置規(guī)定esY28資訊網(wǎng)——每日最新資訊28at.com

約定 > 配置 > 編碼esY28資訊網(wǎng)——每日最新資訊28at.com

所以基于這個(gè)規(guī)定,配置文件的配置優(yōu)先級(jí)大于手動(dòng)聲明Bean的優(yōu)先級(jí)。esY28資訊網(wǎng)——每日最新資訊28at.com

到這,我們又學(xué)到了兩種Spring為了方便我們?cè)O(shè)置Feign.Builder提供的配置方式:esY28資訊網(wǎng)——每日最新資訊28at.com

  • 聲明Options Bean
  • 配置文件

把他們倆加到前面畫(huà)的圖中esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

所以,如果你使用了SpringCloud提供的方式來(lái)使用Feign,那么就可以通過(guò)聲明OptionsBean和配置文件的方式更加方便地來(lái)設(shè)置超時(shí)時(shí)間esY28資訊網(wǎng)——每日最新資訊28at.com

最終其實(shí)還是通過(guò)Feign.Builder來(lái)設(shè)置的esY28資訊網(wǎng)——每日最新資訊28at.com

SpringCloud下通過(guò)Ribbon來(lái)設(shè)置

當(dāng)Feign配合Ribbon使用時(shí),除了上面兩種方式之外,還可以通過(guò)Ribbon來(lái)設(shè)置超時(shí)時(shí)間。esY28資訊網(wǎng)——每日最新資訊28at.com

但是這里我不知道你會(huì)不會(huì)好奇esY28資訊網(wǎng)——每日最新資訊28at.com

Ribbon不是負(fù)載均衡組件,怎么可以設(shè)置超時(shí)時(shí)間?esY28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)這跟Ribbon的定位有關(guān),除了負(fù)載均衡組件之外,Ribbon也干發(fā)送Http請(qǐng)求的事,也就是不配合Feign,他照樣可以發(fā)送http請(qǐng)求。esY28資訊網(wǎng)——每日最新資訊28at.com

來(lái)個(gè)簡(jiǎn)單demoesY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

解釋一下上面的代碼意思esY28資訊網(wǎng)——每日最新資訊28at.com

  • 第一步,設(shè)置user服務(wù)的兩個(gè)服務(wù)實(shí)例地址
  • 第二步,獲取user服務(wù)對(duì)應(yīng)的RestClient,這RestClient就可以用來(lái)發(fā)送http請(qǐng)求
  • 第三步,構(gòu)建一個(gè)http請(qǐng)求
  • 第四步,就是發(fā)送http請(qǐng)求,以負(fù)載均衡的方式

這樣,此時(shí)就會(huì)從兩個(gè)服務(wù)實(shí)例中根據(jù)負(fù)載均衡選取一個(gè)服務(wù)地址發(fā)送http請(qǐng)求,esY28資訊網(wǎng)——每日最新資訊28at.com

Ribbon既然可以發(fā)送Http請(qǐng)求,那么自然而然就可以設(shè)置超時(shí)時(shí)間esY28資訊網(wǎng)——每日最新資訊28at.com

Feign在整合Ribbon的時(shí)候,為了統(tǒng)一配置,就默認(rèn)將自己的超時(shí)時(shí)間交由Ribbon管理esY28資訊網(wǎng)——每日最新資訊28at.com

所以,在默認(rèn)情況下,F(xiàn)eign的超時(shí)時(shí)間可以由Ribbon配置esY28資訊網(wǎng)——每日最新資訊28at.com

而Ribbon默認(rèn)連接和讀超時(shí)時(shí)間只有1s,所以在默認(rèn)情況下,F(xiàn)eign的超時(shí)時(shí)間只有1s。esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

IClientConfig是Ribbon的配置類,Ribbon所有的配置都可以從IClientConfig中獲取。esY28資訊網(wǎng)——每日最新資訊28at.com

所以,在默認(rèn)情況下,很容易就發(fā)生超時(shí),不過(guò)我們可以通過(guò)配置文件修改即可esY28資訊網(wǎng)——每日最新資訊28at.com

ribbon:  ConnectTimeout: 5000  ReadTimeout: 5000

你知道你發(fā)現(xiàn)沒(méi),上面說(shuō)通過(guò)Ribbon設(shè)置Feign的超時(shí)時(shí)間,一直提到前面一直提到這個(gè)詞esY28資訊網(wǎng)——每日最新資訊28at.com

默認(rèn)esY28資訊網(wǎng)——每日最新資訊28at.com

什么情況下叫默認(rèn)呢?esY28資訊網(wǎng)——每日最新資訊28at.com

所謂的默認(rèn),就是當(dāng)你不主動(dòng)設(shè)置Feign的超時(shí)時(shí)間的時(shí)候,就是默認(rèn)。esY28資訊網(wǎng)——每日最新資訊28at.com

換句話說(shuō),一旦你通過(guò)上面說(shuō)的那些配置方式設(shè)置Feign的超時(shí)時(shí)間,就不是默認(rèn)了esY28資訊網(wǎng)——每日最新資訊28at.com

此時(shí)通過(guò)Ribbon設(shè)置的超時(shí)時(shí)間就不會(huì)生效了esY28資訊網(wǎng)——每日最新資訊28at.com

Feign是如何在默認(rèn)情況下將超時(shí)時(shí)間交給Ribbon管理的?

要想回答這個(gè)問(wèn)題,就得先搬出前面反復(fù)提到的Client接口了。esY28資訊網(wǎng)——每日最新資訊28at.com

在SpringCloud的環(huán)境下,有一個(gè)Client的實(shí)現(xiàn),叫LoadBalancerFeignClientesY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)名字就可以看出,帶有負(fù)載均衡的Client實(shí)現(xiàn),負(fù)載均衡的實(shí)現(xiàn)肯定是交給Ribbon來(lái)實(shí)現(xiàn)的esY28資訊網(wǎng)——每日最新資訊28at.com

所以當(dāng)Feign配合Ribbon時(shí)用的就是這個(gè)Client實(shí)現(xiàn)esY28資訊網(wǎng)——每日最新資訊28at.com

既然實(shí)現(xiàn)了Client接口,那就看看execute方法的實(shí)現(xiàn)邏輯esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

圖中g(shù)etClientConfig方法就是判斷使用Feign或者Ribbon配置的核心邏輯esY28資訊網(wǎng)——每日最新資訊28at.com

核心的判斷邏輯就是這一行esY28資訊網(wǎng)——每日最新資訊28at.com

options == DEFAULT_OPTIONSesY28資訊網(wǎng)——每日最新資訊28at.com

DEFAULT_OPTIONS就是一個(gè)超時(shí)時(shí)間的常量esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)上述判斷條件成立時(shí),就會(huì)通過(guò)this.clientFactory.getClientConfig(clientName)獲取到Ribbon配置esY28資訊網(wǎng)——每日最新資訊28at.com

由于這是Ribbon的邏輯,這里就不深扒了,知道是這個(gè)意思就行esY28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)條件不成立時(shí),用Options構(gòu)建一個(gè)FeignOptionsClientConfigesY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

FeignOptionsClientConfig就是簡(jiǎn)單地將Options配置讀出來(lái),設(shè)置到父類DefaultClientConfigImpl超時(shí)時(shí)間配置上esY28資訊網(wǎng)——每日最新資訊28at.com

DefaultClientConfigImpl就算你不知道是什么也無(wú)所謂,你能看出的一件事就是,超時(shí)時(shí)間用的是傳遞給Client的Options參數(shù)esY28資訊網(wǎng)——每日最新資訊28at.com

所以,綜上,我們的問(wèn)題就變得非常easy了,那就是什么時(shí)候esY28資訊網(wǎng)——每日最新資訊28at.com

options == DEFAULT_OPTIONSesY28資訊網(wǎng)——每日最新資訊28at.com

只有當(dāng)這個(gè)條件成立時(shí),才使用Ribbon的配置。esY28資訊網(wǎng)——每日最新資訊28at.com

這里我們先來(lái)捋一捋前面提到的東西esY28資訊網(wǎng)——每日最新資訊28at.com

前面我們反復(fù)提到,Client的Options最終只來(lái)自于兩種配置esY28資訊網(wǎng)——每日最新資訊28at.com

  • Feign.Builder
  • 方法參數(shù)

所以DEFAULT_OPTIONS這個(gè)Options一定是通過(guò)上面兩種方法中的其中一種設(shè)置的esY28資訊網(wǎng)——每日最新資訊28at.com

而方法參數(shù)是不可能設(shè)置的成DEFAULT_OPTIONSesY28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)檫@是我們控制的,只要我們參數(shù)不傳DEFAULT_OPTIONS,那么永遠(yuǎn)都不可能是DEFAULT_OPTIONS。esY28資訊網(wǎng)——每日最新資訊28at.com

此時(shí)只剩下一種情況,那就是Spring在構(gòu)建在Feign.Builder的時(shí)候,設(shè)置成DEFAULT_OPTIONS。esY28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)查找DEFAULT_OPTIONS的使用,我們可以追蹤到這么一段代碼esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

這不就是前面提到的通過(guò)聲明Bean的方式來(lái)設(shè)置超時(shí)時(shí)間esY28資訊網(wǎng)——每日最新資訊28at.com

不同的是它加了@ConditionalOnMissingBean,這個(gè)注解就是說(shuō),一旦我們自己沒(méi)有聲明Options,就用他這個(gè)OptionsesY28資訊網(wǎng)——每日最新資訊28at.com

到這終于真像大白了。esY28資訊網(wǎng)——每日最新資訊28at.com

我們不設(shè)置超時(shí)時(shí)間,Spring就會(huì)給Feign.Builder加一個(gè)DEFAULT_OPTIONS這個(gè)OptionsesY28資訊網(wǎng)——每日最新資訊28at.com

在執(zhí)行的時(shí)候,發(fā)現(xiàn)是DEFAULT_OPTIONS,說(shuō)明我們沒(méi)有主動(dòng)設(shè)置過(guò)超是時(shí)間,就會(huì)使用Ribbon的超時(shí)時(shí)間。esY28資訊網(wǎng)——每日最新資訊28at.com

為了方便理清上面的邏輯,這里整一張圖esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

雖然Feign可以使用Ribbon的超時(shí)時(shí)間,但是Ribbon的配置的優(yōu)先級(jí)是最最低的esY28資訊網(wǎng)——每日最新資訊28at.com

方法參數(shù) > Feign配置文件 > 聲明Options > Ribbon配置esY28資訊網(wǎng)——每日最新資訊28at.com

Feign or Ribbon配置用哪個(gè)好?

其實(shí)我個(gè)人更傾向于使用Ribbon的配置方式。esY28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)镽ibbon除了可以設(shè)置超時(shí)時(shí)間之外,還可以配置重試機(jī)制、負(fù)載均衡等其它的配置esY28資訊網(wǎng)——每日最新資訊28at.com

為了簡(jiǎn)化和統(tǒng)一管理配置,使用Ribbon來(lái)配置超時(shí)時(shí)間。esY28資訊網(wǎng)——每日最新資訊28at.com

可能你會(huì)有疑問(wèn),F(xiàn)eign也支持重試機(jī)制,為什么不選擇Feign?esY28資訊網(wǎng)——每日最新資訊28at.com

這是因?yàn)镕eign重試機(jī)制沒(méi)有Ribbon的好esY28資訊網(wǎng)——每日最新資訊28at.com

Ribbon重試的時(shí)候會(huì)換一個(gè)服務(wù)實(shí)例來(lái)重試,因?yàn)樵瓉?lái)出錯(cuò)的可能不可用esY28資訊網(wǎng)——每日最新資訊28at.com

而Feign并不會(huì)換一個(gè)服務(wù)實(shí)例重試,他并不知道上一次使用的是哪個(gè)服務(wù)實(shí)例,這就導(dǎo)致可能會(huì)出現(xiàn)在一個(gè)不可用的服務(wù)實(shí)例上多次重試的情況。esY28資訊網(wǎng)——每日最新資訊28at.com

引入Hystrix時(shí)超時(shí)時(shí)間設(shè)置

如果你之前的確沒(méi)有研究過(guò)關(guān)于Feign超時(shí)時(shí)間的配置關(guān)系,那么此時(shí)你應(yīng)該有所收獲了。esY28資訊網(wǎng)——每日最新資訊28at.com

但是這就結(jié)束了么?esY28資訊網(wǎng)——每日最新資訊28at.com

不,事情沒(méi)那么簡(jiǎn)單。esY28資訊網(wǎng)——每日最新資訊28at.com

如果你的項(xiàng)目中使用了Hystrix,那么就得小心前面說(shuō)的那些配置了。esY28資訊網(wǎng)——每日最新資訊28at.com

由于Hystrix跟Feign畢竟是一家人,所以當(dāng)引入Hystrix時(shí),F(xiàn)eign就跟之前不一樣了。esY28資訊網(wǎng)——每日最新資訊28at.com

Hystrix會(huì)去干一件事,那就是給每個(gè)Feign的http接口保護(hù)起來(lái),畢竟Hystrix就是干保鏢這個(gè)事的。esY28資訊網(wǎng)——每日最新資訊28at.com

但是這沒(méi)保護(hù)還好,一保護(hù)問(wèn)題就不自覺(jué)地出現(xiàn)了。esY28資訊網(wǎng)——每日最新資訊28at.com

Hystrix在保護(hù)的時(shí)候,一旦發(fā)現(xiàn)被保護(hù)的接口執(zhí)行的時(shí)間超過(guò)Hystrix設(shè)置的最大時(shí)間,就直接進(jìn)行降級(jí)操作。esY28資訊網(wǎng)——每日最新資訊28at.com

怎么降級(jí)的,這里咱不關(guān)心,咱關(guān)心的是這個(gè)Hystrix超時(shí)的最大值是多少。esY28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)橐坏┻@個(gè)時(shí)間小于Feign的超時(shí)時(shí)間,那么就會(huì)出現(xiàn)Http接口正在執(zhí)行,也沒(méi)有異常,僅僅是因?yàn)閳?zhí)行時(shí)間長(zhǎng),就被降級(jí)了。esY28資訊網(wǎng)——每日最新資訊28at.com

而Hystrix的默認(rèn)的超時(shí)時(shí)間的最大值就只有1s。esY28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片esY28資訊網(wǎng)——每日最新資訊28at.com

所以就算你Feign超時(shí)時(shí)間設(shè)置的再大,超過(guò)1s就算超時(shí),然后被降級(jí),太坑了。。esY28資訊網(wǎng)——每日最新資訊28at.com

所以我們需要修改這個(gè)默認(rèn)的超時(shí)時(shí)間的最大值,具體的配置項(xiàng)如下esY28資訊網(wǎng)——每日最新資訊28at.com

hystrix:  command:    default:      execution:        isolation:          thread:            timeoutInMilliseconds: 30000

并且時(shí)間上大致要符合下面這個(gè)原則esY28資訊網(wǎng)——每日最新資訊28at.com

Hystrix超時(shí)時(shí)間 >= (連接超時(shí)時(shí)間 + 讀超時(shí)時(shí)間) * 重試次數(shù)esY28資訊網(wǎng)——每日最新資訊28at.com

重試次數(shù)我們前面也提到了,雖然一般我們不設(shè)置,但是為了嚴(yán)謹(jǐn)還是得加上,因?yàn)橐淮蜨ttp接口的執(zhí)行時(shí)間肯定跟重試次數(shù)有關(guān),重試次數(shù)越多,時(shí)間就越長(zhǎng)。esY28資訊網(wǎng)——每日最新資訊28at.com

而連接超時(shí)時(shí)間 + 讀超時(shí)時(shí)間設(shè)置方式,前面提到很多次,不論是通過(guò)Feign本身設(shè)置還是通過(guò)Ribbon來(lái)設(shè)置,都是可以的esY28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

今天給大家扒了扒在不同使用條件下Feign的超時(shí)時(shí)間設(shè)置,總結(jié)起來(lái)大致如下:esY28資訊網(wǎng)——每日最新資訊28at.com

  • 單獨(dú)使用Feign時(shí):通過(guò)Feign.Builder和方法參數(shù)
  • SpringCloud環(huán)境下單獨(dú)使用Feign:方法參數(shù)、配置文件、聲明Options Bean
  • 跟Ribbon配合使用:通過(guò)Ribbon的超時(shí)參數(shù)設(shè)置
  • 跟Hystrix配合使用:修改默認(rèn)的超時(shí)時(shí)間,盡量符合 Hystrix超時(shí)時(shí)間 >= (連接超時(shí)時(shí)間 + 讀超時(shí)時(shí)間) * 重試次數(shù)

本文鏈接:http://m.www897cc.com/showinfo-26-5697-0.htmlFeign如何設(shè)置超時(shí)時(shí)間,不同情況下還真不一樣

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 阿里云2024財(cái)年Q1 經(jīng)調(diào)整EBITA利潤(rùn)3.87億元

下一篇: CSS 如何改變網(wǎng)格布局偶數(shù)行的排序?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競(jìng)品的一加也坐不住了。一加中國(guó)區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 7月安卓手機(jī)性價(jià)比榜:努比亞+紅魔兩款新機(jī)入榜

    7月登場(chǎng)的新機(jī)有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產(chǎn)品,而且努比亞和紅魔也一貫有著不錯(cuò)的性價(jià)比,所以在本次的性價(jià)比榜單
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時(shí)35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢(shì)領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過(guò)14.
  • SpringBoot中使用Cache提升接口性能詳解

    環(huán)境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開(kāi)始,對(duì) Spring 應(yīng)用程序提供了透明式添加緩存的支持。和事務(wù)支持一樣,抽象緩存允許一致地使用各
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開(kāi)https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項(xiàng)目,添加 Spring Web 依賴項(xiàng),并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請(qǐng)?jiān)谶M(jìn)入步驟2之前進(jìn)行解壓。圖
  • 一文掌握 Golang 模糊測(cè)試(Fuzz Testing)

    模糊測(cè)試(Fuzz Testing)模糊測(cè)試(Fuzz Testing)是通過(guò)向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來(lái)發(fā)現(xiàn)軟件漏洞的方法。可以用來(lái)發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 拼多多APP上線本地生活入口,群雄逐鹿萬(wàn)億市場(chǎng)

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨(dú)家獲悉,拼多多在其APP內(nèi)上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁(yè)的&ldquo;充值中心&rdquo;內(nèi),目前主要售賣美食相關(guān)的
  • 馮提莫簽約抖音公會(huì) 前“斗魚(yú)一姐”消失在直播間

    來(lái)源:直播觀察提起&ldquo;馮提莫&rdquo;這個(gè)名字,很多網(wǎng)友或許聽(tīng)過(guò),但應(yīng)該不記得她是哪位主播了。其實(shí),作為曾經(jīng)的&ldquo;斗魚(yú)一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
  • 三星顯示已開(kāi)始為AR設(shè)備研發(fā)硅基LED微顯示屏

    7月18日消息,據(jù)外媒報(bào)道,隨著蘋果首款頭顯產(chǎn)品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產(chǎn)品也就將成為各大公司下一個(gè)重要的競(jìng)爭(zhēng)領(lǐng)域,對(duì)顯示屏這一關(guān)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美色道久久88综合亚洲精品| 亚洲欧美不卡| 在线播放视频一区| 欧美一区在线直播| 日韩视频二区| 中国成人亚色综合网站| 久久精品国产亚洲精品| 久久青青草综合| 欧美电影免费观看高清完整版| 亚洲国产va精品久久久不卡综合| 国产欧美精品国产国产专区| 国产精品视频网| 在线播放一区| 欧美成人综合一区| 国产精品久久久亚洲一区| 欧美影院在线| 欧美经典一区二区| 一区二区av| 美女网站在线免费欧美精品| 狠狠色综合网站久久久久久久| 亚洲欧美日本视频在线观看| 国产精品亚洲第一区在线暖暖韩国| 欧美网站在线观看| 欧美精品色综合| 欧美激情精品久久久久久| 欧美三级午夜理伦三级中文幕| 国产精品系列在线播放| 久久成人精品| 欧美黑人在线播放| 激情小说另类小说亚洲欧美| 另类av一区二区| 国产精品99久久久久久久久久久久| 国产精品久久久久久久久久久久久| 欧美中在线观看| 伊人精品成人久久综合软件| 欧美日韩国产天堂| 久久夜色撩人精品| 亚洲美女福利视频网站| 亚洲国产精品成人精品| 亚洲国产成人精品视频| 亚洲午夜精品在线| 亚洲精品美女在线观看| 欧美一区二区在线看| 欧美国产精品久久| 国产一区二区三区网站 | 牛牛影视久久网| 国产精品一香蕉国产线看观看 | 欧美91福利在线观看| 国产精自产拍久久久久久| 日韩写真在线| 免费在线欧美视频| 国内一区二区在线视频观看| 亚洲图片欧洲图片av| 欧美精品成人| 亚洲成人资源网| 久久精品人人做人人综合| 欧美尤物一区| 国产精品wwwwww| 999在线观看精品免费不卡网站| 蜜臀av国产精品久久久久| 国产自产2019最新不卡| 亚洲欧美日韩天堂一区二区| 欧美日韩精品综合在线| 91久久久久久国产精品| 免费亚洲电影在线| 激情五月***国产精品| 欧美在线播放一区二区| 国产精品网站视频| 亚洲影院色无极综合| 欧美午夜精品电影| 一二三四社区欧美黄| 久久国产主播精品| 国产欧美日韩一区二区三区在线观看 | 精品999网站| 欧美在线视频观看| 国产精品综合网站| 午夜日韩在线观看| 国产麻豆91精品| 亚洲欧美另类久久久精品2019| 欧美视频网址| 亚洲一二三区视频在线观看| 欧美网站大全在线观看| 在线天堂一区av电影| 欧美色欧美亚洲高清在线视频| 一级日韩一区在线观看| 欧美日韩亚洲网| 亚洲色图自拍| 亚洲看片免费| 亚洲欧美国产一区二区三区| 久久夜色精品国产亚洲aⅴ| 国产一区二区三区自拍| 香蕉久久夜色精品国产使用方法| 国产精品久久久对白| 亚洲一区二区三区乱码aⅴ| 欧美性猛交xxxx乱大交蜜桃 | 欧美1区2区| 亚洲片区在线| 欧美破处大片在线视频| 一区二区三区不卡视频在线观看 | 在线观看成人小视频| 免费一级欧美片在线观看| 亚洲欧洲偷拍精品| 欧美日韩国产精品一区二区亚洲| 国产精品mv在线观看| 亚洲一二三区视频在线观看| 国产精品久久久久秋霞鲁丝| 午夜精品视频一区| 韩国一区电影| 欧美黑人一区二区三区| 一本色道久久综合亚洲二区三区| 欧美四级在线| 欧美在线视频不卡| 亚洲国产综合在线看不卡| 欧美日韩免费一区二区三区视频| 亚洲一区成人| 国产一区二区三区四区老人| 久久亚洲免费| 99在线热播精品免费| 麻豆精品在线视频| 亚洲毛片一区| 国产精品人人爽人人做我的可爱| 久久精品一区二区国产| 最新精品在线| 国产精品人人做人人爽| 久久夜色精品| 在线午夜精品自拍| 韩国av一区二区三区在线观看| 欧美激情91| 午夜宅男欧美| 91久久久久久| 国产精品免费在线| 一区二区三区免费网站| 国产色产综合色产在线视频| 免费在线国产精品| 亚洲图片在线| 一区二区三区在线不卡| 久久九九久精品国产免费直播| 亚洲国产日韩综合一区| 国产精品国产三级国产aⅴ9色| 中文亚洲免费| 国内伊人久久久久久网站视频| 欧美日韩精品免费看| 久久精品久久99精品久久| 亚洲麻豆av| 国产视频观看一区| 久久久久久久久久久久久女国产乱| 亚洲黄色成人| 国产日韩欧美麻豆| 欧美日韩日韩| 久久精品夜色噜噜亚洲a∨| 99视频超级精品| 在线成人激情| 国产美女诱惑一区二区| 欧美人在线观看| 久久伊人免费视频| 性欧美精品高清| 一卡二卡3卡四卡高清精品视频| 一区在线免费| 国产欧美一区二区视频| 欧美另类变人与禽xxxxx| 久久精品一区二区国产| 亚洲一区在线免费| 亚洲毛片在线免费观看| 精品动漫一区| 国产亚洲精品一区二区| 久热国产精品| 欧美亚洲一区在线| 在线亚洲免费视频| 亚洲欧洲精品成人久久奇米网| 国产婷婷色一区二区三区四区| 欧美视频第二页| 欧美激情第二页| 免费不卡在线观看| 久久久国产91| 欧美一级片在线播放| 亚洲桃花岛网站| 日韩一二三在线视频播| 亚洲国产第一页| 激情综合色综合久久| 国产日产亚洲精品| 国产精品五区| 国产精品美女在线| 欧美午夜一区| 欧美日韩免费在线观看| 欧美精品一级| 欧美一区二区性| 亚洲欧美日韩精品在线| 中国女人久久久| 一区二区三区免费网站| a91a精品视频在线观看| 亚洲精品国偷自产在线99热| 1024国产精品| 亚洲国产精品成人| 国产精品久久午夜| 欧美精品一区二区三区蜜桃 | 欧美成人国产| 久久躁狠狠躁夜夜爽| 久久成人人人人精品欧| 国产一区二区福利| 国产麻豆9l精品三级站| 国产精品综合色区在线观看| 国产精品久久久久免费a∨大胸 | 亚洲欧洲日产国码二区| 亚洲欧洲在线免费|