feign原始碼解讀

2021-10-04 00:15:41 字數 3772 閱讀 4729

對於feign的介面請求失敗的重試配置可通過如下自定義配置檔案實現(一般不建議配置)

@configuration

public

class

feignconfig

}

當然,也可使用預設的retry配置檔案,下方是feign.retryer的原始碼

// 類的全路徑是feign.retryer

public

default()

public

default

(long period,

long maxperiod,

int maxattempts)

public

void

continueorpropagate

(retryableexception e)

long interval;

if(e.

retryafter()

!= null)

if(interval <0)

}else

trycatch

(interruptedexception ignored)

// sleptformillis變數是總的重試間隔

sleptformillis += interval;

}/**

* 下一次重試的間隔,間隔時間每一次重試都是1.5倍遞增,直到最大間隔

**/long

nextmaxinterval()

spring cloud中的feign整合了ribbon,但feign和ribbon都有重試功能,springcloud統一了兩者的行為,將feign的重試策略設定成永不重試,如果要使用feign的重試功能,只需要設定ribbon的重試配置即可,所以一般不建議配置feign的重試策略

ribbon預設配置如下

ribbon:

# 同一例項最大重試次數,不包括首次呼叫。預設值為0

maxautoretries: 0

# 同乙個微服務其他例項的最大重試次數,不包括第一次呼叫的例項。預設值為1

maxautoretriesnextserver: 1

# 是否所有操作(get、post等)都允許重試。預設值為false

oktoretryonalloperations: false

預設情況下,get方式請求無論是連線異常還是讀取異常,都會進行重試

非get方式請求,只有連線異常時,才會進行重試

如此看來,如果同乙個微服務只有乙個例項是不會進行重試的,但事實並非如此

分析一下原始碼,feign的重試是在org.springframework.retry.support.retrytemplate中的doexecute方法中進行中

protected

throwable

> t doexecute

(retrycallback

retrycallback,recoverycallback

recoverycallback, retrystate state)

throws e, exhaustedretryexception

// reset the last exception, so if we are successful

// the close interceptors will not think we failed...

lastexception = null;

return retrycallback.

dowithretry

(context);}

......}

上方的canretry是關鍵

最後一行policy.canretrynextserver是能否選擇下乙個例項進行重試

而lbcontext.getretryhandler().getmaxretriesonnextserver()就是變數retrynextserver

retrynextserver的值就是**於maxautoretriesnextserver,預設是1,所以canretry在返回的是true,所以呼叫了二次

解決辦法就是要進行如下配置

ribbon:

# 同一例項最大重試次數,不包括首次呼叫。預設值為0

maxautoretries: 0

# 同乙個微服務其他例項的最大重試次數,不包括第一次呼叫的例項。預設值為1

maxautoretriesnextserver: 0

# 是否所有操作(get、post等)都允許重試。預設值為false

oktoretryonalloperations: false

feignribbonclient的自動配置類

可以看出,其預設使用loadbalancerfeignclient的配置

檢視其default_options可知道預設連線超時時間是10s,讀取超時是6s

預設的網路請求框架是httpurlconnection

如要更換相應的網路請求框架,只需要新增相應的pom依賴即可

檢視負載均衡怎麼做的,檢視executewithloadbalancer

檢視其submit任務

其方法selectserver就是負載均衡的關鍵

feign的流程如下

通過@enablefeignclients開啟feign

根據要遠端呼叫的介面新增@feignclient

程式掃瞄特定包下的feignclient註解並注入ioc容器

當feign介面被呼叫時,通過jdk**生成相應的requesttemplate

根據requesttemplate生成相應的request

request交給類client去呼叫,client可以是httpclient,okhttp或httpurlconnection

最後client被封裝到loadbalanceclient,這個類結合ribbon實現負載均衡

Feign學習筆記2 原始碼解讀

spring cloud netflix feign,這個是feign的全名。spring官網上是沒有feign這個專案存在的,feign是作為netflix的乙個子專案存在。netflix包涵eureka zuul ribbon feign hystrix hystrix dashboard tu...

Feign原始碼解析

首先我要說的是springcloud沒有rpc,這就涉及rpc和微服務的區別。springcloud的模組通訊工具feign跟httpclient和okhttp是一樣的東西,都是對http請求封裝的工具,其實feign可以選擇httpclient或者okhttp作為底層實現 修改配置即可 一 fei...

Feign原始碼分析

feign主要圍繞註解 feignclient和 autowired來分析就好了,feignclient是註解在乙個介面上面的,這個註解是乙個標誌,相應的後置處理器把有該標誌的類加入到bean defenition中。autowired是注入屬性的,feign採用的是factorybean的方式進行...