Spring Cloud Netflix提供了多種方式來發出HTTP請求,你能夠使用負載均衡的RestTemplate
、Ribbon或Feign。不管你如何選擇建立HTTP請求,老是有可能請求失敗,請求失敗時,你可能但願自動重試請求,要在使用Sping Cloud Netflix時這樣作,你須要在應用程序的類路徑中包含Spring Retry。當存在Spring Retry時,負載均衡的RestTemplates
、Feign和Zuul會自動重試任何失敗的請求(假設你的配置容許這樣作)。git
默認狀況下,重試請求時不使用退避策略,若是要配置退避策略,則須要建立類型爲LoadBalancedRetryFactory
的bean並覆蓋給定服務的createBackOffPolicy
方法,如如下示例所示:github
@Configuration public class MyConfiguration { @Bean LoadBalancedRetryFactory retryFactory() { return new LoadBalancedRetryFactory() { @Override public BackOffPolicy createBackOffPolicy(String service) { return new ExponentialBackOffPolicy(); } }; } }
將Ribbon與Spring Retry一塊兒使用時,能夠經過配置某些Ribbon屬性來控制重試功能,爲此,請設置client.ribbon.MaxAutoRetries
、client.ribbon.MaxAutoRetriesNextServer
和client.ribbon.OkToRetryOnAllOperations
屬性,有關這些屬性的說明,請參閱Ribbon文檔。spring
啓用
client.ribbon.OkToRetryOnAllOperations
包括重試POST請求,因爲請求body的緩衝,POST請求會對服務器的資源產生影響。
此外,你可能但願在響應中返回某些狀態碼時重試請求,你能夠經過設置clientName.ribbon.retryableStatusCodes
屬性列出你但願Ribbon客戶端重試的響應碼,如如下示例所示:segmentfault
clientName: ribbon: retryableStatusCodes: 404,502
你還能夠建立類型爲LoadBalancedRetryPolicy
的bean,並實現retryableStatusCode
方法以在給定狀態碼的狀況下重試請求。服務器
你能夠經過將zuul.retryable
設置爲false
來關閉Zuul的重試功能,你還能夠經過將zuul.routes.routename.retryable
設置爲false
來逐個路由地禁用重試功能。負載均衡