ps:Hystrix和Fegin里面使用的Hystrix,有些許區別.我理解的是Fegin.Hystrix主要是用于消費方在調用服務方接口時的異常處理,返回兜底數據等,而Hystrix則是消費方自己本身發生了異常時的處理
c
熔斷:
保險絲,熔斷服務,為了防止整個系統故障,包含子和下游服務
下單服務 -》商品服務
-》用戶服務 (出現異常-》熔斷)
降級:
拋棄一些非核心的接口和數據
旅行箱的例子:只帶核心的物品,拋棄非核心的,等有條件的時候再去攜帶這些物品
熔斷和降級互相交集
相同點:
1)從可用性和可靠性觸發,為了防止系統崩潰
2)最終讓用戶體驗到的是某些功能暫時不能用
不同點
1)服務熔斷一般是下游服務故障導致的,而服務降級一般是從整體系統負荷考慮,由調用方控制
1.引入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2.啟動類增加注解@EnableCircuitBreaker

3.在需要使用熔斷器的方法上增加注解@HystrixCommand(fallbackMethod = "saveOrderFail")
@RequestMapping("save")
@HystrixCommand(fallbackMethod = "saveOrderFail")
public Object save(@RequestParam("user_id")int userId,@RequestParam("product_id")int productId){
};
4.編寫saveOrderFail方法
//方法簽名要和api一致 public Object saveOrderFail(int userId,int productId){ //寫下你期望用戶請求失敗之后返回的操作 TODO }
5.老師的思路,實在這里引入redis,一定時間就發送短信,郵件,或者打電話通知開發人員并且帶上IP地址,需要定位問題,
//方法簽名要和api一致 public Object saveOrderFail(int userId,int productId){ Map<String, Object> msg = new HashMap<>(); //監控報警 String saveOrderKey = "save-order"; String sendValue = stringRedisTemplate.opsForValue().get(saveOrderKey); /** * 熔斷告警機制:在redis中存儲具有時效性的key,然后通過這個key是否存在來進行短信告警 * 1.并發高的時候這樣可能會多發短信,要采用鎖 * 2.也可以在每個服務本地安裝一個redis,在發送短信的時附上每個服務的IP,更加便于排查錯誤 */ new Thread(()->{ if(StringUtils.isBlank(sendValue)){ System.out.println("緊急短信,用戶下單失敗,請立刻查找原因"); //TODO 調用HTTP請求,調用短信服務 stringRedisTemplate.opsForValue().set(saveOrderKey,"save-order-fail",20, TimeUnit.SECONDS); }else{ System.out.println("已經發送過短信,20秒內不要重復發送"); } }).start(); msg.put("code",-1); msg.put("msg","搶購人數過多,請稍后再試"); return msg; }
累了,敲一天了,不寫了
怕什么真理無窮 進一寸有一寸的歡喜
浙公網安備 33010602011771號