SpringCloud的Fegin,Ribbon詳解

SpringCloud的Fegin,Ribbon詳解

大家好,我是酷酷的韓~ 下面將繼續分享springcloud中的feign和ribbon。
在這裏插入圖片描述
一.fegin簡介?
1.feign是netflix開發的聲明式,模板化的HTTP客戶端,Feign可以幫我們更快捷,優雅的調用HTTP API

2.feign採用的是基於接口的註解

3.feign整合了ribbon,具有負載均衡的能力。

4.整合了hystrix,具有熔斷的能力。

二.fegin的使用:
1.添加pom文件

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

2.啓動類添加@EnableFeignClients

3.定義一個接口@FeignClient(name=“xxx”)指定調用哪個服務

4.fallback調用失敗回調方法,需要使用如下配置:

feign:
 hystrix:
  enabled:true

5.一般情況下 ribbon的超時時間<hystrix超時時間(因爲涉及到ribbon的重試機制)
因爲ribbon中重試機制與feign的重試機制有衝突,源碼中默認關閉feign的重試機制。

 ribbon:
  ReadTimeout: 3000
  ConnectTimeout: 3000
  MaxAutoRetries: 1 #同一臺實例最大重試次數,不包括首次調用
  MaxAutoRetriesNextServer: 1 #重試負載均衡其他的實例最大重試次數,不包括首次調用
  OkToRetryOnAllOperations: false  #是否所有操作都重試 

根據上面的參數計算重試的次數:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重試3次 則一共產生4次調用
如果在重試期間,時間超過了hystrix的超時時間,便會立即執行熔斷,fallback。所以要根據上面配置的參數計算hystrix的超時時間,使得在重試期間不能達到hystrix的超時時間,不然重試機制就會沒有意義
hystrix超時時間的計算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超時時間應該配置爲 (1+1+1)3=9秒
當ribbon超時後且hystrix沒有超時,便會採取重試機制。當OkToRetryOnAllOperations設置爲false時,只會對get請求進行重試。如果設置爲true,便會對所有的請求進行重試,如果是put或post等寫操作,如果服務器接口沒做冪等性,會產生不好的結果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重試次數,默認會重試一次
默認情況下,GET方式請求無論是連接異常還是讀取異常,都會進行重試
非GET方式請求,只有連接異常時,纔會進行重試
三.示例:
1.這裏有兩個服務,hjq-provider-mh,hjh-provider-rw。首先在hjq-provider-rw中寫一個接口,如下:

  /**
     * 測試熔斷
     */
    @GetMapping(value = "user/test")
    public String test() {
        try {
            Thread.sleep(2000);
            return "測試1";
        } catch (InterruptedException e) {

        }
        return "測試2";
    }

全路徑爲/rw/user/test
2.在hjq-provider-mh中寫一個接口

@RestController
@Slf4j
public class TestFeignController {
    @Autowired
    private TestFeign testFeign;

    @GetMapping("/test/test")
    public String test(@RequestParam("number") Integer number) {
        if (number == 1) {
            return "success";
        }
        return testFeign.test();
    }
}

feign調用方:

@FeignClient(value = "hjq-provider-rw",fallback = TestFeign.TestFeignA.class)
public interface TestFeign {
    @GetMapping(value = "/rw/user/test")
    public String test();

    @Component
    @Slf4j
    static class TestFeignA implements TestFeign{
        @Override
        public String test() {
            log.error("擠爆了!");
            return "擠爆了!";
        }
    }
}

其中@FeignClient中value是指定服務名,fallback指降級後的返回,當被調用方(這裏是hjq-provider-rw)服務停止時會出現服務降級,返回’“擠爆了”,feign默認是不開啓服務熔斷,不能夠走fallback,需要添加如下配置:

#開啓hystrix配置
feign:
  hystrix:
    enabled: true #開啓feign熔斷

3.兩個服務都啓動,調用hjq-provider-mh中的接口,正常情況如下
在這裏插入圖片描述
當斷開hjq-provider-rw服務,或者裏面的服務報錯,異常,則是以下:
在這裏插入圖片描述
4.監控熔斷,當多次出現此情況時,出現熔斷如下:
在這裏插入圖片描述
Circuit:Open熔斷器打開,默認是20個服務 50%出錯,則出現服務熔斷,此時可以參考另一篇文章:https://blog.csdn.net/hjq_ku/article/details/89520168 裏面有介紹到詳細一些。

天行健,君子以自強不息,地勢坤,君子以厚德載物。------酷酷的韓~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章