Spring Cloud Feign 重試機(jī)制-如何實(shí)現(xiàn)請求重試

可能會(huì)因?yàn)镋urake觸發(fā)了保護(hù)機(jī)制或者是服務(wù)剔除的延遲深碱,導(dǎo)致服務(wù)調(diào)用到故障實(shí)例,針對(duì)這類問題的容錯(cuò),我們可以加入重試機(jī)制锌畸。

新建工程
  • 新建一個(gè)Spring Boot工程,命名為feign-retry(隨意)
  • 編輯pom.xml他嚷,主要依賴內(nèi)容如下
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 修改主類
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class RetryApplication {

    public static void main(String[] args) {
        SpringApplication.run(RetryApplication.class, args);
    }

}
  • 修改application.yml
server:
  port: 9000
eureka:
  client:
    service-url:
      defaultZone: http://peer1:1111/eureka/
spring:
  application:
    name: feign-retry

HELLO-CLIENT:
  ribbon:
    ConnectTimeout: 500
    ReadTimeout: 2000
    OkToRetryOnAllOperations: true
    MaxAutoRetriesNextServer: 2
    MaxAutoRetries: 1

application.yml中的HELLO-CLIENT.ribbon.....的配置是通過指定服務(wù)配置進(jìn)行配置的

指定服務(wù)配置:<client>.ribbon.key=value
<client>代表的是@FeignClient的value值
在使用@FeignClient(value = "HELLO-CLIENT")來創(chuàng)建Feign客戶端的時(shí)候蹋绽,同時(shí)也會(huì)創(chuàng)建一個(gè)名為HELLO-CLIENT的Ribbon客戶端,所以我們可以使用@FeignClient注解中的name或者value屬性值來設(shè)置對(duì)應(yīng)的Ribbon參數(shù)筋蓖。

ConnectTimeout:請求連接的超時(shí)時(shí)間
ReadTimeout:請求處理的超時(shí)時(shí)間
OkToRetryOnAllOperations:對(duì)所有操作請求都進(jìn)行重試
MaxAutoRetriesNextServer:切換實(shí)例的重試次數(shù)
MaxAutoRetries:對(duì)當(dāng)前實(shí)例的重試次數(shù)

通過上面的配置卸耘,當(dāng)訪問到故障請求時(shí),它會(huì)在嘗試訪問一次當(dāng)前實(shí)例(次數(shù)由MaxAutoRetries控制)粘咖,如果不行就換一個(gè)實(shí)例進(jìn)行訪問蚣抗,如果還是不行,就再換一個(gè)實(shí)例進(jìn)行訪問(次數(shù)由MaxAutoRetriesNextServer控制)瓮下,如果還是不行翰铡,則返回失敗信息。

  • 新建RetryService
@Service
@FeignClient(value = "HELLO-CLIENT")
public interface RetryService {

    @RequestMapping(value = "/feign/retry")
    String hello();

}
  • 新建RetryController
@RestController
@RequestMapping(value = "/feign")
public class RetryController {

    @Autowired
    private RetryService retryService;

    @RequestMapping(value = "/retry")
    public String retryTest() {
        return retryService.hello();
    }

}
修改服務(wù)提供實(shí)例
  • 添加FeignRetryController類
@RestController
@RequestMapping(value = "/feign")
public class FeignRetryController {

    @Autowired
    DiscoveryClient discoveryClient;

    @RequestMapping(value = "/retry")
    public String testFeign() throws InterruptedException {
        System.out.println("收到消費(fèi)者請求");
        int sleepTime = new Random().nextInt(3000);
        System.out.println("進(jìn)入等讽坏,等待時(shí)間為" + sleepTime);
        Thread.sleep(sleepTime);
        System.out.println("等待時(shí)間為" + sleepTime + "的請求處理結(jié)束");
        return "Hello World";
    }
}

我們在方法里面加了一個(gè)隨機(jī)數(shù)锭魔,用來測試超時(shí),我們在配置文件里面配置的處理請求超時(shí)時(shí)間為2000路呜,隨機(jī)數(shù)大于2000對(duì)應(yīng)的請求都應(yīng)該會(huì)請求重試迷捧。

測試

啟動(dòng)服務(wù)注冊中心、啟動(dòng)服務(wù)提供實(shí)例胀葱、啟動(dòng)剛剛新建的工程
訪問:http://localhost:9000/feign/retry

image.png
從控制臺(tái)打印日志可以看出第一次請求等待2443毫秒漠秋,超過了ReadTimeout設(shè)置的值,會(huì)立即對(duì)當(dāng)前實(shí)例再次請求抵屿,第二次請求的隨機(jī)數(shù)為1161庆锦,小于ReadTimeout設(shè)置的值,正常返回結(jié)果轧葛。

我們這個(gè)例子只測試了對(duì)當(dāng)前實(shí)例請求重試的效果搂抒,自己可以測試一下更換實(shí)例進(jìn)行請求重試的效果艇搀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市求晶,隨后出現(xiàn)的幾起案子中符,更是在濱河造成了極大的恐慌,老刑警劉巖誉帅,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淀散,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚜锨,警方通過查閱死者的電腦和手機(jī)档插,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亚再,“玉大人郭膛,你說我怎么就攤上這事》招” “怎么了则剃?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長如捅。 經(jīng)常有香客問我棍现,道長,這世上最難降的妖魔是什么镜遣? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任己肮,我火速辦了婚禮,結(jié)果婚禮上悲关,老公的妹妹穿的比我還像新娘谎僻。我一直安慰自己,他們只是感情好寓辱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布艘绍。 她就那樣靜靜地躺著,像睡著了一般秫筏。 火紅的嫁衣襯著肌膚如雪诱鞠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天跳昼,我揣著相機(jī)與錄音般甲,去河邊找鬼肋乍。 笑死鹅颊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墓造。 我是一名探鬼主播堪伍,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锚烦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帝雇?” 一聲冷哼從身側(cè)響起涮俄,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尸闸,沒想到半個(gè)月后彻亲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吮廉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年苞尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宦芦。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宙址,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出调卑,到底是詐尸還是另有隱情抡砂,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布恬涧,位于F島的核電站注益,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溯捆。R本人自食惡果不足惜聊浅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望现使。 院中可真熱鬧低匙,春花似錦、人聲如沸碳锈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售碳。三九已至强重,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贸人,已是汗流浹背间景。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艺智,地道東北人倘要。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像十拣,于是被迫代替她去往敵國和親封拧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子志鹃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容