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 裏面有介紹到詳細一些。
天行健,君子以自強不息,地勢坤,君子以厚德載物。------酷酷的韓~